Backup der ZODB
Zope bringt mit repozo.py ein Skript mit, das das Backup der ZODB im laufenden Betrieb ermöglicht. Es befindet sich wie schon zeopack.py in parts/zope2/utilities/ZODBTools/. Zudem lassen sich mit repozo.py auch inkrementelle Backups erstellen. plone.recipe.zope2instance erstellt einen Wrapper bin/repozo.
Um nun ein inkrementelles Backup zu erzeugen, erstellen wir zunächst das Verzeichnis backups, bevor wir repozo mit den entsprechenden Parametern aufrufen:
$ mkdir backups $ ./bin/repozo -BvzQ -r backups -f var/filestorage/Data.fs
Soll ein Backup wieder zurückgespielt werden, sollte die Zope-Instanz zunächst gestoppt werden, eine Kopie der voraussichtlich korrupten Data.fs erstellt werden und erst dann repozo aufgerufen werden:
$ ./bin/repozo -Rv -r backups -o Data.fs
Anmerkung: Da repozo nach jedem Packen der ZODB wieder nur ein vollständiges Backup durchführen kann, empfiehlt sich das Packen deutlich weniger häufig als das Backup.
Dieser Eintrag kann auch automatisiert mit dem Rezept z3c.recipe.usercrontab erstellt werden. Hierzu wird in der deployment.cfg folgendes eingetragen:
[buildout]
parts =
…
backup-crontab
…
[backup-crontab]
recipe = z3c.recipe.usercrontab
times = 15 0 * * *
command = ${buildout:directory}/bin/repozo -BvzQ -r ${buildout:directory}/backups -f ${buildout:directory}/var/filestorage/Data.fs
Backup mehrerer ZODBs einer Instanz
Mit collective.recipe.backup wird ein Skript erstellt, das für mehrere ZODBs Backups erstellen kann, z.B. zusätzlich für den Katalog in eigener ZODB:
[buildout]
parts =
…
backup
…
[backup]
recipe = collective.recipe.backup
additional_filestorages =
Catalog
Extra
Folgende zusätzliche Optionen bietet collective.recipe.backup:
- location
Ort, an dem die Backups gespeichert werden.
Der Standardwert ist var/backups innerhalb des Buildout-Verzeichnisses.
Bei der expliziten Verwendung von location ist zu beachten, dass der letzte Teil der Angabe als Präfix verwendet wird. Die Angabe:
location = ${buildout:directory}/backupswerden im Ordner des Buildout-Projekts die Unterordner backups_Catalog und backups_Extra erzeugt. Diese enthalten dann die Backups der jeweiligen Datenbank.
- keep
Anzahl der vollständigen Backups, die aufbewahrt werden.
Der Standardwert ist 2.
Alle älteren Backups einschließlich ihrer inkrementellen Backups werden automatisch gelöscht.
Wird der Wert auf 0 gesetzt, werden alle Backups aufbewahrt.
- datafs
- Falls sich die Data.fs nicht im Standardordner var/filestorage/Data.fs befindet kann der Pfad mit dieser Option überschrieben werden.
- full
- Üblicherweise werden inkrementelle Backups erstellt. Wird der Wert hier auf true gesetzt, werden jedesmal vollständige Backups erstellt.
- debug
- In seltenen Fällen sollte in die Log-Datei im debug-Level geschrieben werden. Dann sollte hier der Wert auf true gesetzt werden.
- snapshotlocation
Ort, an dem die Schnappschüsse gespeichert werden sollen.
Der Standardwert ist var/snapshotbackups innerhalb des Buildout-Verzeichnisses. Bei expliziter Festlegung gelten bezüglich des Pfads dieselben Regeln für das Ordner-Präfix wie bei location.
- gzip
Der Standardwert ist true.
Dabei ist die Endung gezippter ZODBs *.fsz und nicht *.fs.gz.
- additional_filestorages
- Hier können Sie zusätzliche Angaben machen, z.B. wenn Sie Ihren Katalog in eine eigene ZODB ausgelagert oder weitere ZODBs als Mount-Point eingebunden haben.
Bei Verwendung von collective.recipe.backup nach diesem Muster ändert man den command im Abschnitt [backup-crontab] auf:
[backup-crontab]
…
command = ${buildout:directory}/bin/backup
Löschen alter Backups
Alte Backups sollten nach einer bestimmter Zeit wieder gelöscht werden. In unserem folgenden Beispiel werden inkrementelle Backups nach zwei Wochen und vollständige Backups nach fünf Wochen gelöscht:
[buildout]
parts =
…
remove-incremental-backups
remove-full-backups
…
[remove-incremental-backups]
recipe = z3c.recipe.usercrontab
times = 8 0 * * *
command = find ${buildout:directory}/backups -name \*deltafs -ctime +14 -exec rm {} \;
[remove-full-backups]
recipe = z3c.recipe.usercrontab
times = 8 0 * * *
command = find ${buildout:directory}/backups -name \*dat -ctime +35 -exec rm {} \;

