MySQL Backup Script mit FTP-Upload

Nicht gerade selten kommt es vor, das Backups eine sinnvolle und vorallem hilfreiche Lösung bieten, wenn nach Updates oder dem Wechsel eines Servers etwas schief geht. Gerade die Datenbanken sind hierbei oftmals mit sensiblen Daten gefüllt, welche unbedingt gesichert werden sollten und dies am Besten redundant. Ich möchte an dieser Stelle ein kleines Script vorstellen, welches die Möglichkeit bietet Backups der einzelnen Datenbanken zu erstellen und diese lokal auf den Server selbst, sowie Remote auf einen FTP-Server ablegt.

Was benötigen wir hierfür? Zunächst einmal benötigen wir einen MySQL-Zugang, der Zugriff auf alle Datenbanken hat. Hier reicht es, wenn für den entsprechenden Benutzer Zugriffe aus localhost (127.0.0.1 in IPv4 oder ::1 in IPv6) gewährt werden. Sollen besagte Sicherungen von einem anderen Server erstellt werden, muss dafür natürlich ebenfalls ein entsprechendes Zugriffsrecht existieren.

Wenn wir zusätzlich den Upload auf einen Remote FTP-Server nutzen möchten, benötigen wir dafür entsprechende FTP-Zugangsdaten. Außerdem muss die „wput“-Funktionalität auf dem Server installiert sein. Dies lässt sich mit der einfachen Befehlszeile „apt-get install wput“ unter Ubuntu sowie Debian realisieren. Da dies allerdings nur für den FTP-Push notwendig ist, kann dies (wenn nicht erwünscht) auch ignoriert werden. Kommen wir nun also zum Script. Dies sie wie folgt aus:

suffix=`date +%Y-%m-%d`
backupdir="/backup/mysql"

dbhost="MySQL Server IP"
dbuser="MySQL Benutzername"
dbpass="MySQL Passwort"

ftpserver="IP des FTP Servers"
ftpuser="FTP Benutzername"
ftppass="FTP Passwort"

databases=`mysql -u$dbuser -h$dbhost -p$dbpass -e"show databases"`

for database in $databases
do
if [ $database != "Database" ] && [ $database != "information_schema" ] && [ $database != "performance_schema" ] && [ $database != "phpmyadmin" ] && [ $database != "mysql" ]; then
filename=$suffix-mysql-$database.gz
mysqldump -u$dbuser -h$dbhost -p$dbpass $database | gzip --best > $backupdir/$filename

cd $backupdir && wput "$filename" "ftp://$ftpuser:$ftppass@$ftpserver/mysql/" -uqB
fi
done

Die Variablen für den FTP-Zugriff, sowie der entsprechende Upload, sind hier an den Namen der Variablen zu erkennen. Aktuell werden von dem Script alle Datenbanken außer „information_schema“, „performance_schema“, „phpmyadmin“ sowie „mysql“ gesichert. Da ich diese für unnötig erachtet habe, sind diese in der IF-Abfrage gefiltert worden. Wer auch diese sichern möchte, kann einfach die entsprechenden IF-Anweisungen entfernen. Natürlich müssen auch noch die Felder „dbhost“, „dbuser“ und „dbpass“ sowie, wenn der FTP-Upload gewünscht ist „ftpserver“, „ftpuser“ und „ftppass“ gefüllt werden. Außerdem muss der Ordner, welcher in der Variable „backupdir“ angegeben ist, erstellt werden und mit Schreibrechten versehen werden. Dies geht mittels „chmod +w /backup -R„.

Damit das Script nun noch ausgeführt werden kann, sollte dies noch mit entsprechenden Rechten versehen werden. Dies geht mit den Befehl „chmod +x mysql-backup-script.sh„. Anschließend kann z.B. noch ein Crobjob wie folgt erstellt werden „0 2 * * * /backup/mysql-backup-script.sh“ (Crobjobs können mit dem Befehl „crontab -e„, erstellt werden).

Bash-Skripting-Guide für Anfänger: http://goo.gl/QILdm