Inkrementelle Backups mit TAR
Mit der Anschaffung meines eigenen Mailservers musste ich mich nun auch selbst um Backups kümmern. Dabei suchte ich nach einer möglichst einfachen Lösung, die allerdings auch inkrementelle Backups ermöglicht, die immer nur die Unterschiede zum vorigen Backup speichern. Im Vergleich zur Gesamtdatenmenge ändert sich bei den Mails täglich nicht soviel, außerdem sparen inkrementelle Backups Speicherplatz. Am Ende konnte ich das ganze mit Tar lösen, da es die Möglichkeit dafür liefert und in einzelnen TAR-Dateien nur die Unterschiede zur vorigen Datei speichert.
Grundlagen
Sichern
Zum Erzeugen von inkrementellen Backups gibt es den Parameter --listed-incremental
oder kurz -g
. Mit diesem kann eine
zusätzliche Snapshot-Datei spezifiert werden, in die die
Dateiinformationen des angegebenen Ordners gespeichert werden.
Existiert diese Datei noch nicht, wird sie zusammen mit einem
vollständigen Backup erzeugt.
tar -czg snapshot.snar -f backup1.tar.gz /my/folder
Bei jedem weiteren Backup wird anhand dieser Datei überprüft, was sich geändert hat, die Unterschiede in eine weitere TAR-Datei gesichert und der aktuelle Stand in die Snapshot-Datei geschrieben.
Ein weiteres Backup wird also mit den gleichen Parametern erzeugt, lediglich der Dateiname der Archivdatei wird geändert:
tar -czg snapshot.snar -f backup2.tar.gz /my/folder
Wichtig hierbei: Tar benötigt lediglich die Snapshot-Datei, um ein weiteres Backup zu erstellen. Die vorigen Archivdateien müssen nicht vorhanden sein. Das ist ganz hilfreich, wenn man die Backup-Dateien vom Server abholt, weil man sie anschließend löschen kann.
Wiederherstellen
Zum Wiederherstellen benötigt man lediglich die Archivdateien, aber
nicht die Snapshot-Datei. Man entpackt die Dateien einfach in der
Reihenfolge der Sicherung, beginnt also mit der ersten vollständigen
Datei. Wichtig ist hierbei jedoch, als Snapshot-Datei /dev/null
anzugeben, damit Tar weiß, dass es sich um ein inkrementelles Backup
handelt.
tar -xzg /dev/null -f backup1.tar.gz
tar -xzg /dev/null -f backup2.tar.gz
Interna
Die Snapshot-Datei enthält die Metadaten einer Datei, d.h. neben dem Dateipfad auch Besitzer, Berechtigungen und Zeitstempel. In jeder Backup-Datei ist immer die vollständige Dateiliste enthalten (aber nur die geänderten Dateiinhalte), so kann Tar beim Zurückspielen auch feststellen, welche Dateien zwischen zwei Backups gelöscht wurden.
Wöchentliche Backups
Wenn man nun für jede Woche ein vollständiges Backup machen will, kann man dies einfach über den Dateinamen lösen. So kann man für die Snapshot-Datei die Wochennummer verwenden, während man für die einzelnen Backups das aktuelle Datum verwendet.
tar -czg "$(date +%G-%V).snar" -f "$(date -I).tar.gz" /my/folder
date +%G-%V
gibt das Jahr und die Wochennummer aus, z.B. 2020-03
.
date -I
gibt das aktuelle Datum aus, z.B. 2020-01-28
.
Durch Anpassung der Dateinamen kann man auch andere Szenarien leicht
umsetzen, z.B. ein vollständiges monatliches Backup mit date +%Y-%m
.
Das Kommando kann sowohl für das erste als auch für alle folgenden Backups ausgeführt werden. Solange die Snapshot-Datei noch nicht existiert, wird einfach ein vollständiges Backup erzeugt. Es reicht also, täglich immer den gleichen Befehl auszuführen.
Abschließend kann man noch die alten Snapshot-Dateien aus den vorigen Wochen mit find löschen, da diese nicht mehr benötigt werden:
find -name '*.snar' -not -name "$(date +%G-%V).snar" -delete