Tägliches Backup mit Bordmitteln und Skripten
28.12.2010
20:21:21 Uhr4612 Aufrufe
3 Antworten
20:21:21 Uhr
3 Antworten
Noch nicht bewertet
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
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 ->
und haben Datei folgende Vorteile ->
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)
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
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)
01.
02.
' Backupscript moximo 03.
' carsten.engelATmoximo.de 04.
' Initialerstellung: 28.12.2010 05.
' Nutzung von CSBackup basierend auf RSyncBackup Idee 06.
07.
' ------------------------------------------------------------------ 08.
' Dimensioniere Variablen 09.
Dim objFileSystem, objOutputfile, Logbuch, PfadIniDatei 10.
Dim ObjShell, objFSO, Fs 11.
12.
' Definieren der Variablen 13.
Trennlinie = "--------------------------------------------------------------------" 14.
Programmverzeichnis = "c:\csbackup" 15.
Programmname = "csbackup.exe" 16.
Batchdatei = "CSBackup-Start.bat" 17.
IniDateiname = "config-vbs.xml" 18.
PfadExeDatei = Programmverzeichnis & "\" & Programmname 19.
PfadBatDatei = Programmverzeichnis & "\" & Batchdatei 20.
PfadIniDatei = Programmverzeichnis & "\" & IniDateiname 21.
Logbuch = Programmverzeichnis & "\vbs_csbackup_" & date()& "_log.txt" 22.
Startdatum = date() 23.
24.
' Bei Pfadangaben sind KEINE Wildcards erlaubt. 25.
Quelllaufwerk = "X" 26.
QuellVerzeichnis = "\IT-Werkzeuge\Putty0" 27.
Quellpfad = Quelllaufwerk&":"&Quellverzeichnis 28.
Ziellaufwerk = "E" 29.
ZielVerzeichnis = "\csbackup" 30.
Zielpfad = Ziellaufwerk&":"&Zielverzeichnis 31.
32.
33.
MinDiskSpace = 1 ' Angabe in GB (Wenn Dezimal -> 1.75) 34.
' MinDiskSpace = 10000000000 ' 1000000000 entspricht 1GB 35.
UmrechnungGB = 1073741824 ' entspricht einem GB 36.
Debugmodus = "JA" 37.
'Debugmodus = "NEIN" 38.
39.
' ----------------------------------------------------------------- 40.
41.
' Ausgabe der Definitionen 42.
if Debugmodus = "JA" Then Wscript.Echo "Programmverzeichnis: " & Programmverzeichnis & vbLf & Trennzeile &vbLf _ 43.
& "Pfad zur Exe: " & PfadExeDatei & vbLf & Trennzeile &vbLf _ 44.
& "Pfad zur Bat: " & PfadBatDatei & vbLf & Trennzeile &vbLf _ 45.
& "Pfad zur Ini: " & PfadIniDatei & vbLf & Trennzeile &vbLf _ 46.
& "Logverzeichnis: " & Logbuch & vbLf & Trennzeile &vbLf _ 47.
& "Minimaler Platz: " & MinDiskSpace & " GB" & vbLf & Trennzeile &vbLf 48.
49.
' Configdatei schreiben 50.
ConfigInhalt = "" 51.
ConfigInhalt = "<?xml version=""1.0"" encoding=""utf-8"" ?>" 52.
ConfigInhalt = Configinhalt & VBCRLF & "<config>" 53.
ConfigInhalt = Configinhalt & VBCRLF & "<backup>" 54.
ConfigInhalt = Configinhalt & VBCRLF & "<source>" 55.
ConfigInhalt = Configinhalt & VBCRLF & "<path>" & Quellpfad & "</path>" 56.
ConfigInhalt = Configinhalt & VBCRLF & "</source>" 57.
ConfigInhalt = Configinhalt & VBCRLF & "<targetPath>" & Zielpfad & "</targetPath>" 58.
ConfigInhalt = Configinhalt & VBCRLF & "</backup>" 59.
ConfigInhalt = Configinhalt & VBCRLF & "</config>" 60.
61.
if Debugmodus = "JA" Then Wscript.echo Configinhalt 62.
63.
' Bereite Dateien vor 64.
Set objFileSystem = CreateObject ("Scripting.FileSystemObject") 65.
66.
67.
' prüfen, ob Configdatei vorhanden 68.
if (objFileSystem.FileExists(PfadIniDatei)) Then 69.
set open_File = objFileSystem.OpenTextFile(PfadIniDatei,2) 70.
open_File.Close() 71.
else 72.
set open_File = objFileSystem.CreateTextFile(PfadIniDatei,true) 73.
open_File.Close() 74.
End if 75.
76.
Set objIniFile = objFileSystem.OpenTextFile(PfadIniDatei,2) 77.
objIniFile.Write (ConfigInhalt) 78.
objIniFile.Close 79.
80.
81.
' Logdateikopf schreiben 82.
83.
' prüfen, ob Logdatei vorhanden 84.
if (objFileSystem.FileExists(Logbuch)) Then 85.
set open_File = objFileSystem.OpenTextFile(Logbuch,8) 86.
open_File.Close() 87.
else 88.
set open_File = objFileSystem.CreateTextFile(Logbuch,true) 89.
open_File.Close() 90.
End if 91.
92.
Set objLogFile = objFileSystem.OpenTextFile(Logbuch,8) 93.
Logbuchkopf = Trennlinie & VbCrLF & "Dateisicherung vom: " & Date() & VbCrLF & Trennlinie & VbCrLF 94.
Logbuchkopf = Logbuchkopf & VbCrLF & time & " Startparameter: " & PfadBatDatei & " " & PfadExeDatei & " " & PfadIniDatei & " " & Logbuch & VbCrLF & VbCrLF 95.
objLogFile.Write (Logbuchkopf) 96.
objLogFile.Close 97.
98.
99.
' Start CSBackup mit der eingestellten XML ConfigDatei (PfadIniDatei) 100.
set WshShell = Wscript.CreateObject("WScript.Shell") 101.
WshShell.Run PfadBatDatei & " " & PfadExeDatei & " " & PfadIniDatei & " " & Logbuch,,true ' Starten der Anwendung und auf Rückmeldung warten -> True 102.
Set WshShell = Nothing 103.
Logbucheintrag = VbCrLF 104.
105.
106.
' Prüfung, ob freier Speicherplatz ausreichend ist 107.
'---------------50000000000 = 500 MB 108.
'---------------10000000000 = 1 GB 109.
'---------------1000000000000 = 100 GB 110.
if Debugmodus = "JA" Then Wscript.echo "Prüfung HDD Platz" 111.
112.
Set objWMIService = GetObject("winmgmts:") 113.
114.
'set objLogicalDisk1 = objWMIService.Get("Win32_LogicalDisk.DeviceID='e:'") 115.
Set objZielDisk = objWMIService.Get("Win32_LogicalDisk.DeviceID='"&Ziellaufwerk&":'") 116.
Set objQuellDisk = objWMIService.Get("Win32_LogicalDisk.DeviceID='" & Quelllaufwerk & ":'") 117.
118.
' wenn zu wenig Platz auf Ziel 119.
if (objZielDisk.FreeSpace/UmrechnungGB - MinDiskSpace < 0) then Speicherwarnung = "Kritisch -> Freier Speicherplatz: " & round(objZielDisk.FreeSpace/UmrechnungGB,2) & " GB" 120.
' wenn Platz ausreicht 121.
if (objZielDisk.FreeSpace/UmrechnungGB - MinDiskSpace > 0) then Speicherwarnung = "OK -> Freier Speicherplatz: " & round(objZielDisk.FreeSpace/UmrechnungGB,2) & " GB" 122.
123.
if Debugmodus = "JA" Then wscript.echo "Speicherwarnung: " & Speicherwarnung 124.
125.
Logbucheintrag = Logbucheintrag & VbCrLF & time () & " Status des Quelllfestplattenspeichers: " & round((objQuellDisk.Size-objQuellDisk.Freespace)/UmrechnungGB,2) & " GB benutzter Speicherplatz" 126.
127.
Logbucheintrag = Logbucheintrag & VbCrLF & time () & " Status des Zielfestplattenspeichers: " & Speicherwarnung 128.
129.
Logbucheintrag = Logbucheintrag & VbCrLF & time () & " Hinweis: Die Größe des Zielfestplattenspeichers sollte etwa " & round(((objQuellDisk.Size-objQuellDisk.Freespace)/UmrechnungGB/100*20),2) & " GB nicht unterschreiten." 130.
131.
132.
133.
' Verzeichnis umbenennen 134.
' Für Debug -> Generiere Zufallszahl für Ordnername 135.
Zufallszahl = Int(rnd - 87119) 136.
Randomize 137.
Ordnername = Int((10000 - 10 + 1) * Rnd + 10) 138.
139.
if Debugmodus = "JA" Then Wscript.echo "Zufallszahl für Ordner: " & Ordnername 140.
141.
set WshShell = Wscript.CreateObject("WScript.Shell") 142.
143.
if Debugmodus = "JA" Then WshShell.Run("%comspec% /c move " & Zielpfad & "\*_??~?? " & Zielpfad & "\" & date() & "_VBS_" & Ordnername),,true 144.
145.
WshShell.Run("%comspec% /c move " & Zielpfad & "\*_??~?? " & Zielpfad & "\" & Startdatum),,true 146.
147.
Logbucheintrag = Logbucheintrag & VbCrLF & time () & " Backupordner wurde umbenannt." 148.
149.
150.
'Logdatei schreiben 151.
152.
if Debugmodus = "JA" Then Wscript.echo "Logdatei schreiben" 153.
if Debugmodus = "JA" Then Wscript.echo Logbucheintrag 154.
Logbucheintrag = Logbucheintrag & VbCrLF & time () & " Script beendet." & VbCrLF 155.
156.
'Set objFileSystem = CreateObject ("Scripting.FileSystemObject") 157.
Set objLogFile = objFileSystem.OpenTextFile(Logbuch,8) 158.
objLogFile.Write (Logbucheintrag) 159.
objLogFile.Close 160.
Set objFileSystem = NothingDas 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
Archimedes schreibt am 04.01.2011 um 14:09:27 Uhr
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!
Denkfehler von mir? Kapiert Windows es nicht?
(Windows XP, Quelle und Ziel NTFS)
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!
Denkfehler von mir? Kapiert Windows es nicht?
(Windows XP, Quelle und Ziel NTFS)
Archimedes schreibt am 18.01.2011 um 13:54:25 Uhr
Knorkator schreibt am 08.10.2011 um 11:38:21 Uhr
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!

Danke im voraus!
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!
Danke im voraus!








