ceng.de
Goto Top

Tägliches Backup mit Bordmitteln und Skripten

Backupadmins und Windows und Kommandozeile haben es nicht leicht, vorallem wenn die Budgets klein sind.-> Gute Software ist sehr teuer oder doch nicht?

Ich habe in den tiefen des Internets viele viele Scripte ausprobiert, selbst Batchdatei mit Rsync, Cygwin, RoboCopy und Xcopy gemurkst. Diverseste downloadbare Exe Datein installiert und wieder deinsstalliert. Habe ich JETZT das Backupwerkzeug gefunden?

Ich glaube, daß ich zumindest MEINEN Favoriten gefunden habe... CSBackup

Bereits seit dem 25.08.2008 liegt das Schmuckstück bei Heise im Softwareverzeichnis und ich Dummlack ärgere mich mit meinen 2003 R2 und 2008 R2 Servern und deren Backups herum. Vielen Dank an dieser Stelle an Thomas Schmiereck

Ich habe täglich ca. 300 GB an Daten zu sichern. Dabei sind aber max. 25 GB wirklich verändert worden. Bisher konnten wir nur jeweils eine Version des Backups vorhalten. Versionierung oder gar ein Zurückgreifen auf Daten von vor einem Jahr war nicht möglich. Aus diesem Grund habe ich mich im Frühjahr 2010 auf die Suche nach einer besseren Backuplösung gemacht und bin bei den ersten Recherchen auf die sog. Hardlinks gestoßen. Diese waren mir aus der Linux Welt noch im ganz ganz weiten Sinne ein Begriff. Es ging um Inodes und sowas... Aber das ist ja für einen KlickiBuntiAdmin nicht wirklich das, was so richtig reizt.

Aber der Gedanke mit den Hardlinks ging mir nicht aus dem Kopf. Zwischenzeitlich habe ich mit VB herum experimentiert und dank TsikiSan habe ich auch tieferen Einblick in die VB-Programmierung bekommen.

Hardlinks auf Festplatten funktionieren folgendermaßen ->
  • Es wird ein zusätzlicher Eintrag in der Partitionstabelle auf eine Datei erstellt
  • Hardlinks befinden sich immer innerhalb eines Dateisystems (Festplattenpartition)

und haben Datei folgende Vorteile ->
  • Die Rechte sind für diese Links immer identisch
  • Auf jede Art von Dateien können Hardlinks angelegt werden
  • Erst wenn der letzte Hardlink auf eine Datei gelöscht wird, wird die Datei selbst gelöscht


Mein Problem bestand bis Dato eigentlich aus der Problematik, daß alle Scripte, alle Programme die mit Hardlinks arbeiteten bei 256 Zeichen ausgestiegen sind. Wir kennen ja unsere Benutzer und stellen mit Freude fest, daß 256 Zeichen das kleinste Problem sind. Umlaute, ganze Sätze mit Satzzeichen oder ähnliches werden in Verzeichnisnamen genutzt. Dies ist bei mir, wie auch bei Euch nicht anders...

Weniger hatte ich das Problem, eine aktuelle VB bzw. .Net Umgebung auf die Maschinen zu bekommen. Wer allerdings keine .NET Umgebung auf den Servern hat, hat mit dieser Software natürlich auch verloren.... Sorry -> da musst Du jetzt weitersuchen...

Ich glaube, daß ich nun ein Script präsentieren kann, das Euch im Zusammenarbeit mit CSBackup helfen könnte, Eure Probleme beim täglichen Backupen in superkleinen Umgebungen mit wenig Geld zu optimieren. (Für Optimierungen am Code bin ich natürlich äußerst dankbar)


 
' Backupscript moximo  
' carsten.engelATmoximo.de  
' Initialerstellung: 28.12.2010  
' Nutzung von CSBackup basierend auf RSyncBackup Idee  

' ------------------------------------------------------------------  
' Dimensioniere Variablen  
Dim objFileSystem, objOutputfile, Logbuch, PfadIniDatei
Dim ObjShell, objFSO, Fs

' Definieren der Variablen  
Trennlinie = "--------------------------------------------------------------------"  
Programmverzeichnis = "c:\csbackup"  
Programmname = "csbackup.exe"  
Batchdatei = "CSBackup-Start.bat"  
IniDateiname = "config-vbs.xml"  
PfadExeDatei = Programmverzeichnis & "\" & Programmname  
PfadBatDatei = Programmverzeichnis & "\" & Batchdatei  
PfadIniDatei = Programmverzeichnis & "\" & IniDateiname  
Logbuch = Programmverzeichnis & "\vbs_csbackup_" & date()& "_log.txt"  
Startdatum = date()

' Bei Pfadangaben sind KEINE Wildcards erlaubt.  
Quelllaufwerk = "X"  
QuellVerzeichnis = "\IT-Werkzeuge\Putty0"  
Quellpfad = Quelllaufwerk&":"&Quellverzeichnis  
Ziellaufwerk = "E"  
ZielVerzeichnis = "\csbackup"  
Zielpfad = Ziellaufwerk&":"&Zielverzeichnis  


MinDiskSpace = 1 ' Angabe in GB (Wenn Dezimal -> 1.75)  
' MinDiskSpace = 10000000000 ' 1000000000 entspricht 1GB  
UmrechnungGB = 1073741824 ' entspricht einem GB  
Debugmodus = "JA"  
'Debugmodus = "NEIN"  

' -----------------------------------------------------------------  

' Ausgabe der Definitionen  
if Debugmodus = "JA" Then Wscript.Echo "Programmverzeichnis: " & Programmverzeichnis & vbLf & Trennzeile &vbLf _  
& "Pfad zur Exe: " & PfadExeDatei & vbLf & Trennzeile &vbLf _  
& "Pfad zur Bat: " & PfadBatDatei & vbLf & Trennzeile &vbLf _  
& "Pfad zur Ini: " & PfadIniDatei & vbLf & Trennzeile &vbLf _  
& "Logverzeichnis: " & Logbuch & vbLf & Trennzeile &vbLf _  
& "Minimaler Platz: " & MinDiskSpace & " GB" & vbLf & Trennzeile &vbLf  

' Configdatei schreiben  
ConfigInhalt = ""  
ConfigInhalt = "<?xml version=""1.0"" encoding=""utf-8"" ?>"  
ConfigInhalt = Configinhalt & VBCRLF & "<config>"  
ConfigInhalt = Configinhalt & VBCRLF & "<backup>"  
ConfigInhalt = Configinhalt & VBCRLF & "<source>"  
ConfigInhalt = Configinhalt & VBCRLF & "<path>" & Quellpfad & "</path>"  
ConfigInhalt = Configinhalt & VBCRLF & "</source>"  
ConfigInhalt = Configinhalt & VBCRLF & "<targetPath>" & Zielpfad & "</targetPath>"  
ConfigInhalt = Configinhalt & VBCRLF & "</backup>"  
ConfigInhalt = Configinhalt & VBCRLF & "</config>"  

if Debugmodus = "JA" Then Wscript.echo Configinhalt  

' Bereite Dateien vor  
Set objFileSystem = CreateObject ("Scripting.FileSystemObject")  


' prüfen, ob Configdatei vorhanden  
if (objFileSystem.FileExists(PfadIniDatei)) Then
	set open_File = objFileSystem.OpenTextFile(PfadIniDatei,2)
	open_File.Close()
else
	set open_File = objFileSystem.CreateTextFile(PfadIniDatei,true)
	open_File.Close()
End if

Set objIniFile = objFileSystem.OpenTextFile(PfadIniDatei,2)
objIniFile.Write (ConfigInhalt)
objIniFile.Close


' Logdateikopf schreiben  

' prüfen, ob Logdatei vorhanden  
if (objFileSystem.FileExists(Logbuch)) Then
	set open_File = objFileSystem.OpenTextFile(Logbuch,8)
	open_File.Close()
else
	set open_File = objFileSystem.CreateTextFile(Logbuch,true)
	open_File.Close()
End if

Set objLogFile = objFileSystem.OpenTextFile(Logbuch,8)
Logbuchkopf = Trennlinie & VbCrLF & "Dateisicherung vom: " & Date() & VbCrLF &  Trennlinie & VbCrLF   
Logbuchkopf = Logbuchkopf & VbCrLF & time &  " Startparameter: " & PfadBatDatei & " " & PfadExeDatei & " " & PfadIniDatei & " " & Logbuch  & VbCrLF & VbCrLF  
objLogFile.Write (Logbuchkopf)
objLogFile.Close


' Start CSBackup mit der eingestellten XML ConfigDatei (PfadIniDatei)  
set WshShell = Wscript.CreateObject("WScript.Shell")  
WshShell.Run PfadBatDatei & " " & PfadExeDatei & " " & PfadIniDatei & " " & Logbuch,,true ' Starten der Anwendung und auf Rückmeldung warten -> True  
Set WshShell = Nothing
Logbucheintrag =  VbCrLF


' Prüfung, ob freier Speicherplatz ausreichend ist  
'---------------50000000000   = 500 MB  
'---------------10000000000   = 1 GB  
'---------------1000000000000 = 100 GB  
if Debugmodus = "JA" Then Wscript.echo "Prüfung HDD Platz"  

Set objWMIService = GetObject("winmgmts:")  

'set objLogicalDisk1 = objWMIService.Get("Win32_LogicalDisk.DeviceID='e:'")  
Set objZielDisk = objWMIService.Get("Win32_LogicalDisk.DeviceID='"&Ziellaufwerk&":'")  
Set objQuellDisk = objWMIService.Get("Win32_LogicalDisk.DeviceID='" & Quelllaufwerk & ":'")  

' wenn zu wenig Platz auf Ziel  
if (objZielDisk.FreeSpace/UmrechnungGB - MinDiskSpace < 0) then Speicherwarnung = "Kritisch -> Freier Speicherplatz: " & round(objZielDisk.FreeSpace/UmrechnungGB,2) & " GB"  
' wenn Platz ausreicht  
if (objZielDisk.FreeSpace/UmrechnungGB - MinDiskSpace > 0) then Speicherwarnung = "OK -> Freier Speicherplatz: " & round(objZielDisk.FreeSpace/UmrechnungGB,2) & " GB"  

if Debugmodus = "JA" Then wscript.echo "Speicherwarnung: " & Speicherwarnung  

Logbucheintrag = Logbucheintrag & VbCrLF & time () & " Status des Quelllfestplattenspeichers: " & round((objQuellDisk.Size-objQuellDisk.Freespace)/UmrechnungGB,2) & " GB benutzter Speicherplatz"  

Logbucheintrag = Logbucheintrag & VbCrLF & time () & " Status des Zielfestplattenspeichers: " & Speicherwarnung  

Logbucheintrag = Logbucheintrag & VbCrLF & time () & " Hinweis: Die Größe des Zielfestplattenspeichers sollte etwa " & round(((objQuellDisk.Size-objQuellDisk.Freespace)/UmrechnungGB/100*20),2) & " GB nicht unterschreiten."  



' Verzeichnis umbenennen  
' Für Debug -> Generiere Zufallszahl für Ordnername  
Zufallszahl = Int(rnd - 87119)
Randomize
Ordnername = Int((10000 - 10 + 1) * Rnd + 10)

if Debugmodus = "JA" Then Wscript.echo "Zufallszahl für Ordner: " & Ordnername  

set WshShell = Wscript.CreateObject("WScript.Shell")  

if Debugmodus = "JA" Then WshShell.Run("%comspec% /c move " & Zielpfad & "\*_??~?? " & Zielpfad & "\" & date() & "_VBS_" & Ordnername),,true  

WshShell.Run("%comspec% /c move " & Zielpfad & "\*_??~?? " & Zielpfad & "\" & Startdatum),,true  

Logbucheintrag = Logbucheintrag & VbCrLF & time () & " Backupordner wurde umbenannt."  


'Logdatei schreiben  

if Debugmodus = "JA" Then Wscript.echo "Logdatei schreiben"  
if Debugmodus = "JA" Then Wscript.echo Logbucheintrag  
Logbucheintrag = Logbucheintrag & VbCrLF & time () & " Script beendet."  & VbCrLF  

'Set objFileSystem = CreateObject ("Scripting.FileSystemObject")  
Set objLogFile = objFileSystem.OpenTextFile(Logbuch,8)
objLogFile.Write (Logbucheintrag)
objLogFile.Close
Set objFileSystem = Nothing


Das Script liegt bei mir im CSBackup Verzeichnis und wird per Schedule bzw. Aufgabenplaner einmal am Tag aufgerufen....


Weitere Informationen zum Thema Hardlinks bzw. Rsync hier im Heise Artikel

UPDATE 08.07.2012 +++++++++++++++++
Das ganze läuft bei mir jetzt seit einiger Zeit Problemlos.

Das ganze vll. nochmal als "kleine" Batchdatei, die etwas einfacher zu lesen ist?

rem @echo off
setlocal
:start
title RotationBackup

set batchpfad=c:\batch
set toolspfad=c:\batch\tools
set logbuch=c:\batch\logbuch\csbackup-Daten-%date%.txt
set trennzeile=+++++++++++++++++++++++++++++++++++++++++++++++++
set netzlaufwerk=yes
set CSBackuppfad=c:\batch\tools\CSBackup
set KonfigDatei=%appdata%\config.xml



rem ++++++++++++++++++++++++++
rem erste Backupaktion
rem ++++++++++++++++++++++++++

echo +++++++++++++++++++++++++++++++++++++++++++++++++
echo ++                START                        ++>>%logbuch%
echo ++             %time%                     ++>>%logbuch%
echo %trennzeile%>>%logbuch%

rem Backslash am Ende wenn keine UNC Pfade
set quelle=\\alderaan\freigabe
set ziel=\\alderaan\Freigabe\Backup\moximo

if not exist %quelle% mkdir %quelle%
if not exist %ziel% mkdir %ziel%

if %netzlaufwerk%==yes (
net use r: /d /yes
net use q: /d /yes
net use r: %quelle% /persistent:no
net use q: %ziel% /persistent:no
set quelle=r:\dokumente
set ziel=q:\dokumente
)


echo ^<?xml version^=^"1.0^" encoding^=^"utf-8^" ^?^>>%KonfigDatei%  
echo  ^<config^>>>%KonfigDatei%
echo   ^<backup^>>>%KonfigDatei%
echo    ^<source^>>>%KonfigDatei%
echo     ^<path^>%quelle%^</path^>>>%KonfigDatei%
echo    ^<^/source^>>>%KonfigDatei%
echo    ^<targetPath^>%ziel%^<^/targetPath^>>>%KonfigDatei%
echo   ^<^/backup^>>>%KonfigDatei%
echo  ^<^/config^>>>%KonfigDatei%

%csbackuppfad%\csbackup.exe %konfigdatei% >>%logbuch%


rem +++++++++++++++++++++++++++
rem beenden und abschliessen
rem +++++++++++++++++++++++++++


echo %trennzeile%>>%logbuch%
echo +++++++++++++++++++++++++++++++++++++++++++++++++
echo ++                EOF                          ++>>%logbuch%
echo ++             %time%                     ++>>%logbuch%
echo %trennzeile%>>%logbuch%

:end
exit

Content-Key: 157681

Url: https://administrator.de/contentid/157681

Printed on: April 24, 2024 at 09:04 o'clock

Member: Archimedes
Archimedes Jan 04, 2011 at 13:09:27 (UTC)
Goto Top
Hey,

erstmal danke für die Tipps. Genau so etwas suche ich..
ich bin allerdings bei dem original script von heise stehen geblieben (http://www.heise.de/ct/ftp/06/09/126/) und das funktioniert an sich super... eines wundert mich jedoch:

ich habe ein verzeichnis mit einer datei (101MB) 2 mal gesichert. die datei wurde nciht verändert. nun wurden auch brav 2 backups erstellt .... sollte der platzbedarf dank harter links nun nicht nur 101 mb sein? ist er leider nicht... genau 202 werden belegt! face-sad

Denkfehler von mir? Kapiert Windows es nicht?

(Windows XP, Quelle und Ziel NTFS)
Member: Archimedes
Archimedes Jan 18, 2011 at 12:54:25 (UTC)
Goto Top
Member: Knorkator
Knorkator Oct 08, 2011 at 09:38:21 (UTC)
Goto Top
Hallo,

CSBackup bekomme ich ja noch zum laufen, aber mit Deinem Script hab ich als vb laie so meine Probleme.
Wie bekomme ich das ganze zum laufen und in welchen Zeilen muss ich welche Änderungen vornehmen?
Vielleicht hast Du ja noch 2-3 Schritte für vb laien!
face-smile

Danke im voraus!
Member: ceng.de
ceng.de Jul 08, 2012 at 08:05:31 (UTC)
Goto Top
Das ganze vll. nochmal als "kleine" Batchdatei.

rem @echo off
setlocal
:start
title RotationBackup

set batchpfad=c:\batch
set toolspfad=c:\batch\tools
set logbuch=c:\batch\logbuch\csbackup-Daten-%date%.txt
set trennzeile=+++++++++++++++++++++++++++++++++++++++++++++++++
set netzlaufwerk=yes
set CSBackuppfad=c:\batch\tools\CSBackup
set KonfigDatei=%appdata%\config.xml



rem ++++++++++++++++++++++++++
rem erste Backupaktion
rem ++++++++++++++++++++++++++

echo +++++++++++++++++++++++++++++++++++++++++++++++++
echo ++                START                        ++>>%logbuch%
echo ++             %time%                     ++>>%logbuch%
echo %trennzeile%>>%logbuch%

rem Backslash am Ende wenn keine UNC Pfade
set quelle=\\alderaan\freigabe
set ziel=\\alderaan\Freigabe\Backup\moximo

if not exist %quelle% mkdir %quelle%
if not exist %ziel% mkdir %ziel%

if %netzlaufwerk%==yes (
net use r: /d /yes
net use q: /d /yes
net use r: %quelle% /persistent:no
net use q: %ziel% /persistent:no
set quelle=r:\dokumente
set ziel=q:\dokumente
)


echo ^<?xml version^=^"1.0^" encoding^=^"utf-8^" ^?^>>%KonfigDatei%  
echo  ^<config^>>>%KonfigDatei%
echo   ^<backup^>>>%KonfigDatei%
echo    ^<source^>>>%KonfigDatei%
echo     ^<path^>%quelle%^</path^>>>%KonfigDatei%
echo    ^<^/source^>>>%KonfigDatei%
echo    ^<targetPath^>%ziel%^<^/targetPath^>>>%KonfigDatei%
echo   ^<^/backup^>>>%KonfigDatei%
echo  ^<^/config^>>>%KonfigDatei%

%csbackuppfad%\csbackup.exe %konfigdatei% >>%logbuch%


rem +++++++++++++++++++++++++++
rem beenden und abschliessen
rem +++++++++++++++++++++++++++


echo %trennzeile%>>%logbuch%
echo +++++++++++++++++++++++++++++++++++++++++++++++++
echo ++                EOF                          ++>>%logbuch%
echo ++             %time%                     ++>>%logbuch%
echo %trennzeile%>>%logbuch%

:end
exit