Filesystem und MySQL Backup
Ein vernünftiges und vor allen Dingen regelmäßiges Backup ist unerlässlich und hat mir aufgrund diverser Festplatten-Crashs schon einige Male den Hintern gerettet.
Wie immer gibt es etliche Wege, die zum Ziel führen. Wie ich es bei mir realisiert habe, möchte ich in diesem Artikel etwas näher beschreiben.
Das Backup sollte selbstverständlich auf eine andere Festplatte geschrieben werden, als die Systemfestplatte – ich denke, die Gründe dafür muss ich nicht näher erläutern. Am besten ist es, man stellt eine Festplatte bereit, welche ausschließlich für das Auslagern der Backups vorgesehen ist (z.B. eine ausreichend große USB-Festplatte).
Für das gesamte Filesystem empfehle ich das Paket „rdiff-backup“, da man es bequem von der Konsole aus steuern kann, und es zudem inkrementell sichern kann – das spart Zeit, minimiert Schreib-/Lesezugriffe und vor allen Dingen die Größe der gespeicherten Backups.
Weiterhin ist es mit „rdiff-backup“ möglich, auf historische Backups einer frei konfigurierbaren Zeit zurückzugreifen.
Für die MySQL Datenbanken können wir rdiff-backup nicht verwenden, da die Datenbanken im geöffneten Zustand auf Filesystemebene mit Pech inkosistent gesichert werden und somit unbrauchbar wären. Hierfür reicht aber das in MySQL integrierte Tool „mysqldump“ völlig aus, da es vollständige und konsistente Exporte einzelner Datenbanken vornimmt.
Nun geht es ans Eingemachte. Unter Gentoo muss lediglich das Paket „app-backup/rdiff-backup“ installiert werden:
emerge -av app-backup/rdiff-backup
Da das Tool „mysqldump“ Bestandteil des MySQL Paketes ist, muss dieses nicht zusätzlich installiert werden.
Um den gesamten Backupprozess zu automatisieren, benötigt man natürlich einige Scripte.
Fangen wir mit dem Datenbank-Backup an – hierfür legen wir ein Skript namens „dbbackup“ an:
nano -w /usr/local/sbin/dbbackup
Die Namen der einzelnen Datenbanken (mit Leerzeichen getrennt) müssen natürlich entsprechend der eigenen Umgebung in der Variable ${db}, das Kennwort des MySQL root-Users in der Variable ${passwd}, sowie der Backup-Pfad in der Variable ${backup_path} angepasst werden. Wie viele Tage die Datenbank-Backups aufbewahrt werden, lässt sich in der Zeile „find ${backup_path}/ -mtime +7 -exec rm {} \;“ anpassen.
Dieses Skript übernimmt zusätzlich das Löschen der Bin-Logs (Transaktions Logs), welche die Festplatte bei vielen Schreibvorgängen innerhalb der DB schnell zuschaufeln können.
Das entsprechende Skript zum Löschen der Bin-Logs (bei mir liegt es unter „/root/scripts/backup/bin-log-reset.sql“ – bitte im oberen Quelltext anpassen, wenn es bei euch in einem anderen Pfad liegt) sieht wie folgt aus:
RESET MASTER; QUIT
Zudem werden im dbbackup-Skript sämtliche Datenbanken mittels „mysqloptimize“ optimiert und repariert.
Nun erstellen wir ein Skript namens „fullbackup“, welches das DB-Backup sowie das rdiff-backup ausführt:
nano -w /usr/local/sbin/fullbackup
Der Backup-Pfad sollte hier wieder auf die eigene Umgebung angepasst werden.
Die Verzeichnisse „log“, „filesystem“ und „db“ sollten bereits vor Ausführen des Skriptes unterhalb des Pfades ${backup_root} existieren.
Das Mounten und Entmounten des Boot- sowie des Backup-Verzeichnisses wird automatisch durch dieses Script übernommen. Das Backup-Verzeichniss sollte aus Sicherheitsgründen im täglichen Betrieb nicht gemountet sein, um ungewollte Schreib- oder Löschvorgänge hierauf zu vermeiden.
Die Retention-Time – also der Gültigkeitszeitraum der geschriebenen Backups – kann in der Variable ${retention} angepasst werden. Der aktuelle Wert „2W“ entspricht zwei Wochen. Alle älteren Backups werden beim nächsten Durchlauf des Scriptes gelöscht.
Die in diesem Script verwendete Exclude- und Include-Liste kann natürlich auch den eigenen Ansprüchen entsprechend angepasst werden. Ganz wichtig ist aber, dass der Backup-Pfad, sowie die virtuellen Filesysteme unter „/dev“, „/proc“ und „/sys“ als „–exclude“ aufgeführt sind.
Zum automatischen Start sollte noch ein Cronjob für unser „fullbackup“-Skript angelegt werden.
Hierzu muss die Crontab editiert…
nano -w /etc/crontab
…und folgende Zeile ans Ende der Crontab hinzugefügt werden:
20 3 * * * root /usr/local/sbin/fullbackup >> /mnt/backup/log/$(hostname)_fullbackup_$(date +%Y%m%d).log 2>&1
In diesem Fall wird das Backup jede Nacht um 03:20 Uhr gestartet und eine Log-Datei inkl. eventueller Fehlermeldungen aus dem STDERR Output ins Verzeichnis /mnt/backup/log/ geschrieben.
Viel Erfolg und „Happy Backuping“!