Wie man MySQL Datenbanken sichert ohne MySQL zu unterbrechen

Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>

Diese Anleitung veranschaulicht, wie man MySQL Datenbanken sichert ohne den MySQL Dienst zu unterbrechen. Wenn Du ein MySQL Backup erstellen möchtest, musst Du normalerweise MySQL entweder stoppen oder eine Lesesperre an Deinen MySQL Tabellen anbringen, um ein einwandfreies Backup zu erhalten; wenn Du dies nicht tust, endest Du mit einem inkonsistenten Backup. Um aber konsistente Backups ohne eine Unterbrechung von MySQL zu erhalten, wende ich einen kleinen Trick an: Ich repliziere meine MySQL Datenbank auf einen zweiten MySQL Server. Auf dem zweiten MySQL Server verwende ich einen Cron Job, der reguläre Backups der replizierten Datenbank erstellt.

Diese Anleitung ist ohne jegliche Gewähr! Ich möchte darauf hinweisen, dass dies nicht der einzige Weg ist, ein solches System einzurichten. Es gibt viele Möglichkeiten dieses Ziel zu erreichen – dies ist der Weg, den ich gewählt habe. Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!

Vorbemerkung

Für diese Anleitung benötigst Du einen zweiten MySQL Server (den Slave) und Du musst die MySQL Replikation Deines ersten MySQL Servers (das System, von dem Du Sicherheitskopien machen möchtest, den Master) auf den zweiten einrichten, z.B. wie in dieser Anleitung beschrieben wird: https://www.howtoforge.com/mysql_database_replication. Das Einrichten der MySQL Replikation liegt nicht im Rahmen dieser Anleitung.

Das gesamte Setup, das hier beschrieben wird, muss auf dem slave MySQL Server ausgeführt werden!

Ich habe dies auf einem Debian System getestet; es sollte aber auch auf anderen Distributionen funktionieren, es kann jedoch sein, dass einige Pfade abweichen (im Skript /usr/local/sbin/mysqlbackup.sh).

Automatische Backups der replizierten Datenbank auf dem Slave ausführen

Nachdem Du eine funktionierende MySQL Replikation des Masters auf den Slave eingerichtet hast, nehme ich an, dass Du automatische Backups der Slave Datenbank in dem Verzeichnis /home/sqlbackup vornehmen möchtest. Zunächst müssen wir dieses Verzeichnis erstellen:

mkdir /home/sqlbackup

Als Nächstes erstellen wir das Shell Skript /usr/local/sbin/mysqlbackup.sh das den Slave stoppt, einen SQL Dump der gesamten MySQL Datenbank in /home/sqlbackup (der Dateiname des SQL Dumps wird so aussehen: backup-20070423-18.sql; dieser Dump stammt vom am 23. April 2007 um 18.00 Uhr) erstellt, den Slave danach neu startet (der Slave wird dann alles aufholen, was in der Zwischenzeit auf dem Master passiert ist, damit keine Daten verloren gehen) und all SQL Dumps in /home/sqlbackup, die älter als zwei Tage sind, löscht:

vi /usr/local/sbin/mysqlbackup.sh

#!/bin/sh

datum=`/bin/date +%Y%m%d-%H`

/usr/bin/mysqladmin --user=root --password=yourrootsqlpassword stop-slave

/usr/bin/mysqldump --user=root --password=yourrootsqlpassword --lock-all-tables
      --all-databases > /home/sqlbackup/backup-${datum}.sql

/usr/bin/mysqladmin --user=root --password=yourrootsqlpassword start-slave

for file in "$( /usr/bin/find /home/sqlbackup -type f -mtime +2 )"
do
  /bin/rm -f $file
done

exit 0

(Bitte pass auf, dass Du yourrootsqlpassword mit dem Passwort des Root MySQL Benutzers auf dem Slave ersetzt!)

Nun müssen wir das Skript ausführbar machen:

chmod 755 /usr/local/sbin/mysqlbackup.sh

Natürlich wollen wir /usr/local/sbin/mysqlbackup.sh nicht manuell ausführen; stattdessen erstellen wir einen Cron Job, der das Skrip automatisch jede drei Stunden ausführt:

crontab -e

0 */3 * * * /usr/local/sbin/mysqlbackup.sh &> /dev/null

Du kannst den Cron Job selbstverständlich so bearbeiten, dass er so oft ausgeführt wird, wie Du willst.

Das war’s. Mit dieser Methode kannst Du Deine MySQL Datenbank nun ohne eine Unterbrechung des MySQL Dienstes auf dem Master Server sichern.

Links

Das könnte dich auch interessieren …