Auf den Punkt - einfache inkrementelle Backups mit MySQL

Beim Betrieb von Datenbanken auf Basis der freien MySQL Community Edition stellt sich immer wieder die Frage nach einer passenden Sicherungsstrategie. Dabei stehen zwei Kriterien im Vordergrund: Verfügbarkeit der Daten und die Aktualität der Sicherungen. In der Praxis hat sich dabei ein einfacher Weg bewährt, der eine Art "Online-Sicherung" für MySQL Datenbanken bereitstellt. Diese soll hier einmal exemplarisch auf Basis von Debian/GNU Linux 7.x und MySQL 5.5 Community Edition dargestellt werden.

> Bitte keine Kommandos per Copy 'n Paste auf Produktivsystemen ausführen, ohne zu verstehen, was diese auslösen <
Dies sind Beispiele, die an die eigenen Bedürfnisse angepasst werden müssen. Gewöhnlich werden Datenbanken mit dem MySQL-eigenen Tool mysqldump vollständig gesichert:

mysqldump -u x -p y -r dumpfile.sql example_db

Während sich bei kleineren Datenbanken ein solcher Dump auch im laufenden Betrieb erstellen lässt, ohne das parallele Datenbankzugriffe spürbare Wartezeiten in Kauf nehmen müssen, gestaltet es sich bei größeren Datenbanken etwas schwieriger. Die Erstellung eines Dumps bei Datenbanken mit einer Größe über 1 GByte kann in einem produktiven System über 10 Sekunden Wartezeit für die Anwender bedeuten. Im Hinblick auf die Aktualität der Sicherung müsste dies dann halbstündlich oder gar viertelstündlich ausgeführt werden, was die Akzeptanz bei den Anwender deutlich strapazieren würde.

Eine einfache und recht elegante Lösung hierfür ist die Verwendung von Binary Logs. In der Regel werden diese für die Replikation von Datenbank zwischen mehreren Systemen verwendet, aber Binary Logs sind auch zur Datensicherung konzipiert. Sie sind dabei grob mit Transaction Logs auf Microsoft SQL Server vergleichbar.

Jede Änderung an Datenbanken, für die Binary Logs aktiviert sind, werden dabei in entsprechende Dateien geschrieben und können im Fehlerfall wie Inkremente, aufbauend auf dem letzten Vollbackup, eingespielt werden. Dazu wird für die zu sichernde Datenbank das Binary Log in der Konfiguration des MySQL Servers aktiviert.

[mysqld] ... 
log_bin = /var/log/mysql/mysql-bin.log expire_logs_days= 2
max_binlog_size = 100M
binlog-do-db = example_db  ... Anschließend natürlich durch entsprechendes Reload die Konfiguration aktivieren.
service mysql reload

Nun findet sich bereits die erste Log Datei im Verzeichnis /var/log/mysql/ die dann beispielsweise mysql-bin.000001 benannt sein könnte. Hinzu kommt der entsprechende vollständige Dump außerhalb der Produktivzeit, in diesem Fall per Cronjob um 3:30Uhr: 30 3 * * * /usr/bin/mysqldump -u x -p y –flush-logs --master-data=2 -r /var/log/mysql/dump.sql example_db