Kurztipp: Tipps und Stolperfallen bei mysqldump-Backups

Zur Sicherung von MySQL-Datenbanken wird ein sehr nützliches Tool mitgeliefert: mysqldump. Anbei einige Tipps, die das Backup-Vergnügen vereinfachen oder überhaupt erst ermöglichen.

Der Artikel erhebt nicht den Anspruch, vollständig zu sein. Ich werde ihn nach Belieben erweitern. Wer hier einen Tipp vermisst, kann mich das gerne wissen lassen. 🙂

Mehrere Datenbanken sichern

Wer mehrere Datenbanken sichern möchte, hat vermutlich keine Lust mehrere Statements abzusetzen:

1# mysqldump dataA -u root -p > data.sql
2# mysqldump dataB -u root -p >> data.sql
3# mysqldump dataC -u root -p >> data.sql

Ein Blick in die Manpage verrät - dafür gibt es den Schalter --databases:

1# mysqldump --databases dataA dataB dataC -u root -p > data.sql

Wer alle Datenbanken eines Servers sichern will, kann das mit dem Schalter --all-databases leicht umsetzen:

1# mysqldump --all-databases -u root -p > data.sql

Maximale Paketgröße wird übeschritten

Der Paketpuffer ist in der Regel auf 25 MB beschränkt, wenn größere Dumps generiert werden, kommt es hier oft zu Problemen:

1mysqldump: Got packet bigger than 'max_allowed_packet' bytes

Für mysqldump gibt es hier einen Schalter (--max_allowed_packet), um die Puffergröße zur Laufzeit anzupassen:

1# mysqldump database -u user -p --max_allowed_packet=512M > data.sql

Wer häufig größere Dumps erzeugt, sollte darüber nachdenken, für mysqldump eine Sektion mit angepasster max_allowed_packet-Variable in der MySQL-Konfigurationsdatei (/etc/my.cnf) zu definieren:

1# vi /etc/my.cnf
2...
3
4[mysqldump]
5max_allowed_packet = 512M

Got errno 28 on write

In aller Regel erscheint diese nichtssagende Fehlermeldung, wenn das Verzeichnis, in dem der Dump gesichert wird, "volläuft". Ein Blick auf df hilft hier:

1# df -h .
2Dateisystem          Größe Benut  Verf Ben% Eingehängt auf
3/dev/vda5             9,8G  9,8G     0 100% /var/lib/mysql

Wiederherstellen sehr großer MySQL-Dumps

Bei sehr großen MySQL-Dumps kann es vorkommen, dass o.g. mysqldump-Trick mit verwendetem --max_allowed_packet-Schalter nicht greift und auch utopische große Werte keine Abhilfe schaffen:

1# mysql -u root -p --max_allowed_packet=3072000M < backup.sql
2Warning: option 'max_allowed_packet': unsigned value 3221225472000 adjusted to 2147483648
3Enter password:
4ERROR 1153 (08S01) at line 226: Got a packet bigger than 'max_allowed_packet' bytes

Abhilfe schafft das temporären Anpassen der o.g. Variable im MySQL-Server:

1$ echo "SET GLOBAL max_allowed_packet=1000000000000;" | mysql -u root -p

Und schon klappt auch der Import:

1# mysql -u root -p < backup.sql
2Enter password:
3#