Schon lange auf der ToDo Liste war bei mir ein automatisiertes Backup meiner Datenbanken auf diesem Server einzurichten.
Zur Gedächtnisstütze, und falls jemand ähnliches nützlich findet nun eine Beschreibung dessen was ich eingerichtet habe.
Anforderung
Ich wollte ein automatisiertes Backup einzelner Datenbanken (damit ich selektiv wiederherstellen kann), welches täglich läuft.
Zusätzlich wollte ich, für den Fall eines kompromittierten oder anderweitig nicht mehr zugreifbaren Servers diese Backupdateien außerhalb des gehosteten Servers speichern.
Daher sollte mein zu Hause befindliches NAS die Backupdateien automatisch holen.
Umsetzung
Datenbankbackup
Crontab
Das Backupscript soll regelmäßig ausgeführt werden, das mach man indem man in die Crontab Liste einen Eintrag macht – eine genaue Beschreibung der crontab Syntax findet man z.B. hier.
Mein Eintrag sieht wie folgt aus
15 3 * * * /verzeichnisname/dbbackup.sh
Das Backupscript
Das Script hat folgenden Inhalt
/bin/bash
mysqldump --user=USERNAME --password='PASSWORT' datenbankname > datenbankbackupdatei.sql | gzip > /Zielverzeichnis/`date '+%Y%m%d'`_datenbankname.sql.gz
Damit wird jede Nacht um 3:15 Uhr eine mit GZIP komprimierte Backupdatei im Zielverzeichnis erstellt, welche das Tagesdatum mit im Dateinamen trägt.
So würde die Datei die am 24.12.2017 erstellt wird 2017-12-24_datenbankname.sql.gz heißen.
Abholen der Dateien
Zum Abholen der Dateien habe ich gemäß der Anleitung von Heiko Schlittermann auf meinem NAS via
ssh-keygen -t dsa
einen SSH Key erstellt und diesen via
cat ~/.ssh/*.pub | ssh user@highwaytohoell.de 'umask 077; cat >>.ssh/authorized_keys'
auf meinen Webserver übertragen.
Dann habe ich via crontab -e ebenfalls einen Eintrag erzeugt:
30 3 * * * scp user@highwaytohoell.de:/Zielverzeichnis/* /mein/Verzeichnis
Damit werden jede Nacht um 3:30 Uhr die Backupdateien in /mein/Verzeichnis auf meinem NAS geschrieben.
Damit nicht jeden Tag alle Dateien abgeholt werden und sich die Backupdateien auf dem Server stapeln habe ich auf meinem Datenbankserver den Crontab Eintrag noch erweitert, via
55 3 * * * rm /Zielverzeichnis/*.gz
werden die Backupdateien nach Abholung gelöscht (im Zielverzeichnis liegen natürlich keine anderen Dateien mit .gz Endung, die würden sonst auch gelöscht). Somit liegen in diesem Ordner immer nur die aktuellen Dateien.
Diese Lösung ist mit Sicherheit weit von der Perfektion entfernt, so verliere ich sollte mein Internetanschluss zu Hause gestört sein möglicherweise mal einen Satz Backupdateien – da ich aber nicht täglich ändere kann ich damit gut leben.
Ich wollte eine Lösung die automatisch und dauerhaft funktioniert und das habe ich damit.