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