Windows: Rotationssicherung mit Drive Snapshot

Anbei ein Beispiel-Skript, wie man mit Hilfe der Tools weekday.exe, smtpsend.exe und der Software Drive Snapshot eine automatische Datensicherung realisieren kann.


Eine neuere Version des Skripts ist hier verfügbar!


@echo off

rem Fenstertitel anzeigen

 title Datensicherung...

rem Netzlaufwerk verbinden

net use V: \\BACKUPSERVER\backup KENNWORT /user:BENUTZERNAME /persistent:no

rem Woche Auslesen

 set /p week=< week.txt

 if %week%==1 set week=1
 if %week%==2 set week=2

rem Tag Auslesen

 weekday.exe > day.txt
 set /p weekday=< day.txt

rem Sicherungsart/Tag für die Voll-Sicherung festlegen

 if %weekday%==Monday goto full
 goto diff

rem Voll-Sicherung
:full

 snapshot.exe C: V:\Backup\%computername%\Full-%week%-%weekday%-$disk.sna -oV:\Backup\%computername%\Full-%week%-$disk.hsh -RWT -L307200 > %week%-%weekday%.txt
 goto email

rem Differentielle-Sicherung
:diff

 snapshot.exe C: V:\Backup\%computername%\Diff-%week%-%weekday%-$disk.sna -hV:\Backup\%computername%\Full-%week%-$disk.hsh -RWT -L307200 > %week%-%weekday%.txt

rem Wochenwechsel

 if %weekday%==Sunday goto week-change
 goto email

:week-change
 if %week%==1 echo 2 > week.txt
 if %week%==2 echo 1 > week.txt

rem E-Mail
:email

 smtpsend.exe -fABSENDER -tEMPFÄNGER -hMAILSERVER -sBackup -i%week%-%weekday%.txt -lBENUTZERNAME -lKENNWORT
 goto end

:end

rem Netzlaufwerk trennen

 net use V: /d

Erklärung

Das Skript wird als Geplanter Task eingebunden. Ausgeführt wird es immer täglich um 22:00 Uhr.

Die Sicherungen werden auf einem Backup-Server gespeichert.

Montags wird die Vollsicherung erstellt. Dienstag bis Sonntag werden differentielle Sicherungen erstellt.

Es handelt sich um eine Rotationssicherung, d.h. es gibt immer die aktuelle Woche und eine vorherige Woche.

Das Limit für eine Sicherungsdatei, bevor gesplittet wird, ist auf 300 GB festgelegt.

Zum Schluss wird das aktuelle Protokoll via E-Mail versendet.

Update 16.08.2012

Norbert hat mir per E-Mail seine Version einer Rotationssicherung mit Drive Snapshot zukommen lassen. Am besten gefällt mir folgende Vereinfachung:

set numberOfWeeksToKeep=4
set /A week=week %% numberOfWeeksToKeep + 1

Diese zwei kleinen Zeilen stellen (natürlich) nur einen kleinen Teil dar, aber dadurch wird es erheblich einfacher, das Skript anzupassen.

Nachfolgend der Download des gesamten Skripts:

runSnapshot.txt (Von *.txt in *.cmd umbenennen.)

So oder so müssen die Skripte für die eigene Umgebung und Anforderung angepasst werden.

Danke an Norbert für das Skript und die Änderungen.

Einen Teil der Änderungen übernehme ich bereits bei einem Kunden.

36 Kommentare

  1. Klaus

    Hallo Andy,
    vielen Dank für Deinen ausführlichen Artikel.
    Wollte Dein Script für mich umfunktionieren aber bisher ohne Erfolg vielleicht kannst Du mir dabei helfen.
    Hier mein Anliegen:
    1. Die Sicherungen sollen auf G:\Sicherung gespeichert.
    2. Sonntags wird die Vollsicherung erstellt.
    3. Montag bis Samstag sollen differentielle Sicherungen erstellt.
    4. Sicherung möglichst für 3 Wochen
    5. Das Limit für eine Sicherungsdatei, bevor gesplittet wird, ist auf 300 GB festgelegt.
    6. Zum Schluss wird das aktuelle Protokoll via E-Mail versendet.

    Möglicherweise ist das auch für andere User interessant.

    Viele Grüße
    Klaus

  2. andy

    Hallo Klaus,

    das ist ja alles auf Grundlage meines Skripts machbar. Wo kommst du denn nicht weiter?
    Handelt es sich bei Laufwerk G: um ein Netzlaufwerk oder lokales bzw. USB-Laufwerk?

    Bei den Punkten 5 und 6 ist das ja bereits so, wie du es brauchst.

  3. Klaus

    Hallo Andy,
    habe alles mögliche probiert und am Ende klappte nichts mehr.
    Laufwerk G:\ ist meine externe USB Festplatte.
    Habe Drive Snapshot zum booten auch schon auf meinen Rettungsstick mir fehlt nur noch das richtige Script.
    Gruß Klaus

  4. andy

    Ich gehe mal davon aus, das du die Tools weekday.exe und smtsend.exe wie im Artikel beschrieben heruntergeladen und im gleichen Ordner wie Drive Snapshot und das Skript hast.

    Auf die schnelle angepasst, aber ungetestet sieht das Skript dann so aus (Der E-Mail-Teil muss natürlich mit deinen Angaben konfiguriert werden):


    @echo off

    rem Fenstertitel anzeigen

    title Datensicherung...

    rem Woche Auslesen

    set /p week=< week.txt if %week%==1 set week=1 if %week%==2 set week=2 if %week%==3 set week=3 rem Tag Auslesen weekday.exe > day.txt
    set /p weekday=< day.txt rem Sicherungsart/Tag für die Voll-Sicherung festlegen if %weekday%==Sunday goto full goto diff rem Voll-Sicherung :full snapshot.exe C: G:\Sicherung\%computername%\Full-%week%-%weekday%-$disk.sna -oG:\Sicherung\%computername%\Full-%week%-$disk.hsh -RWT -L307200 > %week%-%weekday%.txt
    goto email

    rem Differentielle-Sicherung
    :diff

    snapshot.exe C: G:\Sicherung\%computername%\Diff-%week%-%weekday%-$disk.sna -hG:\Sicherung\%computername%\Full-%week%-$disk.hsh -RWT -L307200 > %week%-%weekday%.txt

    rem Wochenwechsel

    if %weekday%==Saturday goto week-change
    goto email

    :week-change
    if %week%==1 echo 2 > week.txt
    if %week%==2 echo 3 > week.txt
    if %week%==3 echo 1 > week.txt

    rem E-Mail
    :email

    smtpsend.exe -fABSENDER -tEMPFÄNGER -hMAILSERVER -sBackup -i%week%-%weekday%.txt -lBENUTZERNAME -lKENNWORT
    goto end

    :end

  5. Klaus

    erst mal vielen Dank für Deine Hilfe.
    Momentan läuft es noch nicht, werde mich am Mittwoch nochmals daransetzen.

    Danke Klaus

  6. andy

    Bis zu welcher Stelle kommst du denn?

  7. andy

    Also ich hab’ das mal auf die Schnelle unter Windows XP getestet. Bei mir läuft es wie erwartet. Vielleicht ist irgendeine Voraussetzung noch nicht erfüllt. Starte mal alle *.exe-Dateien per Hand, und deaktivier evtl. Sicherheitswarnungen von Windows (Haken rausnehmen, damit die Meldung nicht noch mal kommt). Ferner muss am Ziel, also “G:\Sicherung” ein Ordner mit dem Computernamen existieren ODER man das Skript entsprechend abändern (“\%computername%” entfernen). Du hast ja geschrieben, das du die Tools auf einem Rettungsstick hast. Evtl. stimmt der Laufwerksbuchstabe nicht. Bei Boot-CDs/DVDs/Sticks ist die Laufwerkszuordnung mitunter anders, als es im normalen Windows-Betrieb der Fall ist. Dann bleibt noch die Frage, welche Windows-Version gesichert wird. Ab Windows Vista gibt es da noch zusätzlich eine 100 MB große “System-reserviert”-Partition, die man ebenfalls mitsichern sollte.

  8. Klaus

    Hallo Andy,
    hier mein Fehler
    rem Woche Auslesen
    set /p week=< week.txt
    "Das System kann die angegebene Datei nicht finden"
    Hier komme ich leider nicht weiter.
    Ist doch richtig es als *.cmd abzuspeichern und irgendwie (habe noch keine Ahnung wie ?) als Task einzubinden.
    Wann und wie löscht Du die alten Daten ??

    Gruß Klaus

  9. andy

    Die Datei “week.txt” gibt es in deinem Ordner? Falls nein, einfach mit Notepad anlegen, eine “1” reinschreiben und abspeichern.
    Alte Daten, sofern du die Backups meinst, braucht man nicht zu löschen, da Drive Snapshot Diese überschreibt, wenn wieder z.B. Woche Nr. 1 mit Tag “Monday” kommt.

  10. Klaus

    Hallo Andy,
    vielen Dank – nun läuft alles sauber durch.
    Gibt es die Möglichkeit daß nur die diif’s überschrieben werden und 3 full’s stehen bleiben ?

    Gruß Klaus

  11. andy

    Kleine Ursache, große Wirkung 😉
    Als Schnellschuss könnte man einfach das Full-Backup (Voll-Sicherung) auskommentieren, dazu einfach im entsprechenden Abschnitt ein “rem” für snapshot.exe setzen.
    Es müsste aber erstmal die drei Vollsicherungen geben. Nachteil dieser Methode ist aber, das von Woche zu Woche (und in Abhängigkeit der Änderungen) die Diff-Sicherungen immer größer werden!


    rem Voll-Sicherung
    :full

    REM snapshot.exe...

  12. Klaus

    Erst mal vielen Dank werde am Wochenende weiterprobieren.

  13. Klaus

    Hallo Andy,
    ich will nun einen neuen Versuch starten.
    Meine Wunschvorstellung wäre folgende:
    1. Nach 3 FullBackups wird das jeweils älteste mit delage gelöscht
    http://www.horstmuc.de/win/delage-de.htm

    2. Die DiffBackups werden nach einem FullBackup ebenfalls gelöscht.
    3. Mein modifizierter Full Aufruf:
    snapshot.exe C: F:\Backup\Full-%date%-%weekday%-%computername%-$disk.sna -oF:\Backup\Full-%date%-$disk.hsh -RWT -L307200 > %date%-%weekday%.txt

    Irgendwie komme ich nun nicht mehr weiter ??
    Kannst Du mir nochmals “Unter die Arme greifen” ??

    Gruß Klaus

  14. andy

    Das Tool “delage” kenne ich nicht. Damit muss ich mich erstmal auseinandersetzen und das kann dauern, hab’ da grad ein Projekt am köcheln.
    Sicherst du nun doch nicht nach “G:\Sicherung”?
    Fehlermeldung?

  15. Klaus

    Hallo Andy,
    set “Ordner=F:\Backup”
    ::: Löschen mit for /f geht unter FoxproW nicht
    :: http://www.horstmuc.de/win/delage-de.htm
    DelAge32 %Ordner%\*.* 15
    Bin wegen der Platzprobleme auf F:\umgestiegen.
    Gruß Klaus

  16. andy

    Sorry, aber mit dieser Antwort kann ich gerade nicht viel anfangen.

    Also F:… ist klar.

    set “Ordner=F:\Backup” <- Das soll wohl die Variable für das Backup-Ziel sein?!
    Dann müsste die Zeile für Drive Snapshot quasi so anfangen:

    snapshot.exe C: %Ordner%\Full….

    Was ist damit?

    ::: Löschen mit for /f geht unter FoxproW nicht
    :: http://www.horstmuc.de/win/delage-de.htm
    DelAge32 %Ordner%\*.* 15

    Wie gesagt, das Tool kenne ich nicht. Ist dein Problem gerade wegen der Variablen und DelAge?
    Ich kann jetzt nur raten, aber vielleicht muss die Variable für DelAge ebenfalls in Anführungszeichen gesetzt werden:

    DelAge32 "%Ordner%\*.*" 15

    Zumindest in meinem Schnelltest hat's erst so funktioniert. Vorher gab's immer die (Fehler-)Meldung: "DelAge32 – Age (number of days) required".
    Ich habe es jetzt allerdings nicht in Verbindung mit Drive Snapshot getestet, sondern einfach nur mit ein paar alten Dateien in einem Test-Ordner.

  17. Klaus

    Sorry ich habe mich wohl etwas undeutlich ausgedrückt.
    Bin zum löschen nur auf delage umgestiegen weil ein 16 bit Programm mit der for /f Klausel nicht klar kam.

    DelAge32 F:\Backup\Full*.* 4

    Gruß Klaus

  18. andy

    OK.
    16 bit, holy shit, das ist ja richtig old school.
    Mit dem DelAge32-Befehl willst du nun die alten Full-Backups löschen?
    So wie das jetzt da steht, werden alle Dateien mit Full… die älter als 4 Tage sind gelöscht.
    In meinen Schnelltest ist das zumindest so.

  19. Carl

    Hallo Andy,
    dein Script ist toll und funktioniert gut, nur leider der Versand der E-mail mit dem Protokoll am Ende klappt nicht. Als Absender gebe ich meinen Namen oder eine E-Mail-Adresse, Empfänger eine meiner E-Mail-Adressen, als Mail-Server den pop3-Server des E-Mail-Anbieters, dann Benutzer und Passwort – klappt aber nicht.
    Gerne würde ich auch im Script einen bestimmten Ordner von der Sicherung ausschließen – geht das
    Danke und Gruß
    Carl

  20. andy

    Hi Carl,

    erstmal danke.
    Absender und Empfänger sind immer E-Mail-Adresse, bei Mailserver den SMTP-Server des Anbieters.
    Das Ausschließen von Ordner und Dateien ist auch recht einfach, muss man nur in die snapshot.exe-Zeile integrieren.

    Schau dazu mal hier:

    http://drivesnapshot.de/de/commandline.htm

    Komfortabler ist es, eine Variable zu definieren und Diese dann in die snapshot.exe-Zeilen zu integrieren. So muss man nicht alles doppelt machen.

  21. Carl

    Hallo Andy,
    vielen Dank für deinen Tipp. Ich habe noch relativ wenig Erfahrung mit Scripten und Kommandozeile. Daher meine Frage: Wie und wo genau füge ich dieses exclude usw. in die Zeile ein?
    Also ich sichere Laufwerk “E”, darin befindet sich der Ordner “VMs” (virtuelle Maschinen, die viel Platz brauchen), den ich samt Unterordner und Inhalt von der Sicherung ausschließen möchte. Ich Sichere in den Pfad “G:\Backup\Daten\”.
    Grüße
    Carl

  22. andy

    Zum einen müssen die zwei Zeilen, die mit “snapshot.exe C:…” von “C:” auf “E:” geändert werden.
    Ferner muss aus “V:\” “G:\Backup\Daten\” gemacht werden.

    In den gleichen Zeilen fügst du “–exclude:%ex%” vor (!) ” > %week%-%weekday%.txt” ein.

    Unterhalb von “@echo off” fügst du folgende Zeile ein:

    set ex=”\Vms”

    Damit wird eine neue Variable definiert, die dazu benutzt wird, sowohl bei der Voll- als auch bei der differentiellen Sicherung den Ordner auszuschließen.

    Bei den Zeilen, die mit “net use…” beginnen, stellst du ein “REM” voran, damit werden diese Befehle auskommentiert.

  23. Carl

    Hallo Andy,
    das sichern klappt wunderbar nur die E-Mail kommt aus irgendeinem Grund nicht an??
    Was mache ich falsch?
    Absender “cpn2@gmx.de” Empänger “cpn2@gmx.de” Smtp-Mail-Server “mail.gmx.net” Benutzername “mein E-Mail-Konto-Benutzername” Passwort “mein E-Mail-Konto-Passwort”
    Ist doch richtig oder?
    Danke und Grüße
    Carl

  24. andy

    Sieht prinzipiell schon mal gut aus. Was bekommst du denn für eine Fehlermeldung von smtpsend.exe?

  25. Carl

    Ich kann keine Fehlermeldung erkennen. Die Konsole schließt sich sofort und so schnell nach Beenden des Sicherungsauftrags, dass man nichts erkennen kann.
    Hier nochmal die letzten Zeilen meines Skriptes:
    .
    .
    .
    rem E-Mail
    :email

    smtpsend.exe -fcpn2@gmx.de -tcpn2@gmx.de -hmail.gmx.net -sBackup -i%week%-%weekday%.txt -lMEINMAILKONTOBENUTZER -lMEINMAILKONTOPASSWORT
    goto end

    :end

  26. andy

    Hm, sieht erstmal soweit gut aus, aber ich weiß grad nicht, ob GMX vor dem Mailversand erstmal eine POP-Abfrage (SMTP-after-Pop3) haben möchte.
    Alternativ kannst du die smtpsend-Zeile aus dem Skript kopieren und direkt in der Eingabeaufforderung in dem Ordner wo sich die smtpsend.exe befindet ausführen. Da sollte dann auf jeden Fall eine Meldung zu sehen sein. Oder du hängst an die smtpsend-zeile mal ” > mailreport.txt” an und lässt mal das backup-skript laufen und prüfst dann den Inhalt der mailreport.txt.

  27. andy

    Vielleicht hilft das noch weiter:

    http://faq.gmx.de/messages/email/optionen/sicherheit/1.html

  28. Carl

    Hi Andy, jetzt klappt alles.
    Ich Blödmann hatte einen Tippfehler in der E-Mail-Zeile, was bisher nicht gemerkt hatte. (Tja, wer lesen kann ist eindeutig im Vorteil!)
    Vielen Dank für alles!
    Grüße
    Carl

  29. andy

    Kleine Ursache, große Wirkung. Freut mich das es nun klappt.

  30. nw

    Hallo,
    erstmal danke für das Skript! Ich hab es ein wenig erweitert und vereinfacht um es variabler einsetzbar und stabiler zu machen.
    Konkret hatte ich Probleme mit der Anzahl der Wochen die gesichert werden sollen (wenn sich das ändert ist an mehreren Stellen was anzupassen) sowie mit dem Tag an dem das Full-Backup passieren soll. Da ist es so, dass der week-Wechsel unbedingt mit dem Full-Backup zusammen fallen muss weil sich sonst die Diff-Backups auf eine nicht vorhandene Hashdatei aus dem Full-Backup bezieht. Gefährliche Falle weil an 2 Stellen – bei der Entscheidung ob ein Full- oder Diff- Backup gemacht werden soll sowie beim Wochenwechsel – die Tage richtig angepasst werden müssen, und ein Fehler erstmal nicht auffällt…
    Deshalb habe ich den oberen Teil des Skripts folgendermaßen angepasst:


    @echo off

    rem Fenstertitel anzeigen

    title Datensicherung...

    rem Parameter und Pfade setzen

    set numberOfWeeksToKeep=4
    set fullBackupDay=Monday

    set targetDrive=V:
    set targetDir=%targetDrive%\Backup\%computername%

    rem Netzlaufwerk verbinden

    net use %targetDrive% \\BACKUPSERVER\backup KENNWORT /user:BENUTZERNAME /persistent:no

    rem Woche und Tag auslesen (and remove any spaces)

    set /p week= day.txt
    set /p weekday= week.txt

    snapshot.exe C:+E: %targetDir%\...
    goto email

    rem Differentielle-Sicherung
    :diff
    ...
    rem E-Mail
    :email
    ...

    Der Abschnitt 'Wochenwechsel' aus dem Originalskript entfällt, da schon in :full mit eingebaut

    Damit brauchts den etwas seltsamen und vor allem nicht für verschiedene Anzahl von Wochen geeigneten Code für das Setzen und Inkrementieren des week-Wertes nicht mehr, und die Gefahr von Inkonsistenzen bei Full-Backup und week-Wechsel ist auch weg.

    Vielleicht kann’s ja noch jemand brauchen…

  31. nw

    Oups, leider ist vom Code einiges verschluckt worden. Hier nochmal ohne Code-Tag, vielleicht klappts da besser…

    @echo off

    rem Fenstertitel anzeigen

    title Datensicherung…

    rem Parameter und Pfade setzen

    set numberOfWeeksToKeep=4
    set fullBackupDay=Monday

    set targetDrive=V:
    set targetDir=%targetDrive%\Backup\%computername%

    rem Netzlaufwerk verbinden

    net use %targetDrive% \\BACKUPSERVER\backup KENNWORT /user:BENUTZERNAME /persistent:no

    rem Woche und Tag auslesen (and remove any spaces)

    set /p week= day.txt
    set /p weekday= week.txt

    snapshot.exe C:+E: %targetDir%\…
    goto email

    rem Differentielle-Sicherung
    :diff

    rem E-Mail
    :email

  32. nw

    Sorry, es scheint der Inhalt zwischen einem kleiner- und einem größer- Zeichen zu verschwinden. Meine letzten beiden Posts sind dadurch leider unbrauchbar, sorry 🙁

  33. andy

    Vielleicht kannst du nochmal das ganze Skript posten oder per Mail schicken.
    Im Moment fehlt mir irgendwie der Durchblick bei der Modifikation.

  34. andy

    Kein Thema. Das passiert leider bei der Kommentarfunktion von WP. Ist halt nicht so ohne weiteres drin, Code zu posten. Wie gesagt, kannst es ja grad per Mail schicken.

  35. adam

    Hallo,

    kannst du vielleicht das angepasste Skript nochmal posten? Würde es gerne mal ausprobieren.

    Vielen Dank!

  36. andy

    Die aktuelle Version gibt es hier:

    Windows: Rotationssicherung mit Drive Snapshot – Version 3.0

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

© 2024 Andy's Blog

Theme von Anders NorénHoch ↑