Für das Backup der Datenbank auf dem (Web)-Server gibt es im Netz reichlich Anleitungen. Meist wird ein MySQL Dump auf dem Server erzeugt, welcher dann auf einem FTP-Server geladen wird.
Jedoch haben Anleitungen oftmals einige Makel:
-
Extra Speicherplatz für den Dump wird benötigt
-
Dumps können sehr viel Speicherplatz brauchen 😉
-
Sensible Daten in den Dumps liegen auf einem unbekannten FTP-Server
-
Es gibt immer nur eine Version des Datenbank-Backups, beim nächsten Backupvorgang wird das vorherige Backup überschrieben.
Hiermit wollte ich eine EINFACHE, aber effektive versionierte Backuplösung entwickeln. Das Geheimnis des Skripts sind die Pipes, welche, vereinfacht gesagt, Ausgaben eines Programms an ein weiteres Programm weitergeben. In der Unixwelt sind allgemein bekannt als das “|”-Zeichen. Dabei wird der Datenbank-Dump komprimiert und verschlüsselt auf dem FTP-Server gespeichert.
Das Skript wurde auf einem Debian System entwickelt/getestet und benötigt folgende Pakete:
-
mysql-server
-
gpg
-
lftp (erlaubt Binden einer bestimmten IP an das Programm, siehe FAQ)
Mit Hilfe eines Cronjobs lässt sich dieses Skript regelmäßig ausführen. Sinnvoll ist hierbei das täglich durchzuführen, da die Backups nach den Tag im Monat durchnummeriert werden und eine Ausgabe nach folgendem Schema erstellt wird:
5073 Nov 16 04:12 backup-16.sql.gz.pgp 5067 Nov 15 04:12 backup-15.sql.gz.pgp 5054 Nov 14 04:12 backup-14.sql.gz.pgp 5045 Nov 13 04:12 backup-13.sql.gz.pgp 5018 Nov 12 04:12 backup-12.sql.gz.pgp 4977 Nov 11 04:12 backup-11.sql.gz.pgp ....
In dem Skript müssen vor der ersten Ausführung noch folgende Konstanten gesetzt werden:
#!/bin/bash MYSQLDB= MYSQLUSER= MYSQLPASS= PASSPHRASE= FTPSERVER= FTPDIR= FTPUSER= FTPPASS= HTMLOUTPUT= # here starts the magic mysqldump -u $MYSQLUSER -p$MYSQLPASS --all-databases | gzip -9 | gpg -c --cipher-algo TWOFISH --digest-algo SHA512 --passphrase $PASSPHRASE | lftp -u $FTPUSER,$FTPPASS $FTPSERVER/$FTPDIR/ -e "put /dev/stdin -o backup-$(date +%d).sql.gz.gpg; echo Pro Zeile eine Backup-Datei mit Groesse, Datum und Name<pre\> > $HTMLOUTPUT ;cls --sort=date -s --date -1 >> $HTMLOUTPUT; echo </pre\> >> $HTMLOUTPUT; exit"
MYSQL* und FTP* sollten selbst erklärend sein, PASSPHRASE entspricht dem Passwort für das verschlüsselte Archiv. HTMLOUTPUT stellt einen Pfad zu einer Datei im Dateisystem dar, in welche die existierenden Backups angezeigt werden – hier empfiehlt sich eine HTML-Datei in einem vom Webserver lesbaren Bereich zu anzugeben.
FAQ
Wie kann ich ein bestimmtes Backup automatisch wiederherstellen?
Ein automatisiertes Wiederherstellen der Datenbank-Dumps wäre sehr viel aufwendiger(, wenn auch nicht unmöglich). Da vorerst das Backup betrachtet wurde, gibt es keine automatisierte Lösung.
Wie kann ich dann ein Backup wiederherstellen?
Manuell..
- das korrekte Backup von dem FTP-Server laden
- das Archive entschlüssel mit dem Passwort
- das Archive entpacken
- den Datenbank-Dump in die Datenbank laden
wget ftp://user:passwort@server/mysqlbackup/backup-xx.sql.gz.gpg gpg -d backup-xx.sql.gz.gpg gunzip backup-xx.sql.gz mysql -u Mysqluser -pMysqlPasswort dbname < backup-xx.sql
..et voilà.
Wieso wurde lftp verwendet?
Manche Serveranbieter binden den FTP-Backup-Space an die IP-Adresse des Servers, jedoch an die Haupt-IP – sobald weitere virtuelle Adressen auf dem Server eingerichtet werden, kann es sein, dass Verbindung über eine zusätzliche IP hergestellt wird. Diese Verbindung lehnt der Backup-Server jedoch ab. So muss man die Haupt-IP-Adresse im FTP-Client binden. Dies unterstützt der Standard-Linux-FTP Client jedoch nicht.
Ein Gedanke zu „MySQL-Backup “On-The-Fly”“
Für deine Leser ist auch das Script hier: http://www.monkey-business.biz/282/debian-backup-mittels-paketlisten-mysql-dumps-ftp-upload/ interessant. Es erstellt Backups aller MySQL Datenbanken, ausgewählten Verzeichnissen, den Debian Paketlisten und läd diese per FTP auf einen Backup Space.