mysqldump — Der komplette Guide
mysqldump ist das Standard-Werkzeug für MySQL-Backups auf der Kommandozeile. Es erzeugt SQL-Dumps, die du auf jedem MySQL- oder MariaDB-Server wieder importieren kannst. Hier findest du alles, was du über mysqldump wissen musst — von der Grundsyntax bis zu den Flags, die dir in der Praxis das Leben retten.
Grundsyntax
mysqldump [Optionen] datenbankname [tabellenname ...] > ausgabe.sql
Die wichtigsten Bausteine:
mysqldump -u BENUTZER -p DATENBANK > backup.sql
Nach -p wirst du nach dem Passwort gefragt. Du kannst es auch direkt anhängen (-pMeinPasswort ohne Leerzeichen), aber das taucht dann in der Prozessliste und der Shell-History auf — nicht ideal auf Produktionsservern.
Die wichtigsten Anwendungsfälle
Einzelne Datenbank sichern
mysqldump -u root -p meine_datenbank > meine_datenbank.sql
Einzelne Tabelle sichern
mysqldump -u root -p meine_datenbank users > users.sql
Mehrere Tabellen sichern
mysqldump -u root -p meine_datenbank users orders products > auswahl.sql
Alle Datenbanken sichern
mysqldump -u root -p --all-databases > alle_datenbanken.sql
Mehrere bestimmte Datenbanken sichern
mysqldump -u root -p --databases db_shop db_blog db_forum > drei_dbs.sql
Nur Struktur, keine Daten
mysqldump -u root -p --no-data meine_datenbank > struktur.sql
Nur Daten, keine Struktur
mysqldump -u root -p --no-create-info meine_datenbank > daten.sql
Mit GZip-Komprimierung
mysqldump -u root -p meine_datenbank | gzip > backup.sql.gz
Bei großen Datenbanken spart das 70-90% Speicherplatz.
Mit bzip2 (noch stärkere Komprimierung)
mysqldump -u root -p meine_datenbank | bzip2 > backup.sql.bz2
Wichtige Flags im Detail
–single-transaction
mysqldump --single-transaction -u root -p meine_datenbank > backup.sql
Das ist vermutlich das wichtigste Flag für Produktionsserver. Es startet eine Transaktion, bevor der Dump beginnt, und liest einen konsistenten Snapshot der Datenbank. Heißt: Kein Table-Lock, keine Downtime, andere Anwendungen können normal weiterarbeiten.
Funktioniert nur mit InnoDB. Bei MyISAM-Tabellen wird es ignoriert.
–lock-tables
mysqldump --lock-tables -u root -p meine_datenbank > backup.sql
Sperrt alle Tabellen der Datenbank vor dem Dump (READ LOCK). Garantiert Konsistenz, aber blockiert Schreibzugriffe. Standard-Verhalten wenn --single-transaction nicht gesetzt ist.
–lock-all-tables
mysqldump --lock-all-tables -u root -p --all-databases > backup.sql
Globaler Lock über alle Datenbanken. Nötig wenn du --all-databases benutzt und datenbankübergreifende Konsistenz brauchst.
–routines und –triggers
mysqldump --routines --triggers -u root -p meine_datenbank > backup.sql
--triggers ist standardmäßig aktiv, --routines nicht. Wenn du Stored Procedures oder Functions hast, musst du --routines explizit angeben.
–events
mysqldump --events -u root -p meine_datenbank > backup.sql
Sichert auch MySQL Events (geplante Aufgaben). Vergisst man leicht.
–add-drop-table
mysqldump --add-drop-table -u root -p meine_datenbank > backup.sql
Fügt vor jedem CREATE TABLE ein DROP TABLE IF EXISTS ein. Standard-Verhalten — nützlich damit der Import auf einer bestehenden Datenbank sauber durchläuft.
–extended-insert
Standardmäßig aktiv. Fasst mehrere INSERT-Befehle in einen zusammen:
-- Statt:
INSERT INTO users VALUES (1, 'Max');
INSERT INTO users VALUES (2, 'Anna');
-- Erzeugt:
INSERT INTO users VALUES (1, 'Max'), (2, 'Anna');
Das ist deutlich schneller beim Import. Deaktivieren mit --skip-extended-insert wenn du das SQL zeilenweise in einem Diff vergleichen willst.
–quick
Liest Zeilen einzeln vom Server statt die gesamte Tabelle in den RAM zu laden. Standardmäßig aktiv, aber wichtig zu wissen bei sehr großen Tabellen.
–hex-blob
mysqldump --hex-blob -u root -p meine_datenbank > backup.sql
Exportiert BINARY, VARBINARY und BLOB-Spalten als Hexadezimal. Verhindert Encoding-Probleme beim Import.
–where (bedingte Exporte)
mysqldump -u root -p meine_datenbank users --where="created_at > '2025-01-01'" > neue_user.sql
Exportiert nur Zeilen, die der WHERE-Bedingung entsprechen. Genial für partielle Backups.
Die perfekte Kombination für Produktionsserver
Hier mein Standard-Befehl, den ich für die meisten Produktions-Backups verwende:
mysqldump \
--single-transaction \
--routines \
--triggers \
--events \
--hex-blob \
--set-gtid-purged=OFF \
-u backup_user \
-p \
meine_datenbank | gzip > backup_$(date +%Y-%m-%d).sql.gz
Das gibt dir:
- Konsistenten Snapshot ohne Locks (InnoDB)
- Stored Procedures, Triggers und Events gesichert
- Binärdaten sauber exportiert
- GZip-komprimiert
- Dateiname mit Datum
Restore — Backup wieder einspielen
Standard-Restore
mysql -u root -p meine_datenbank < backup.sql
GZip-komprimiertes Backup
gunzip < backup.sql.gz | mysql -u root -p meine_datenbank
In neue Datenbank importieren
mysql -u root -p -e "CREATE DATABASE neue_db;"
mysql -u root -p neue_db < backup.sql
Mit Fortschrittsanzeige (pv)
pv backup.sql.gz | gunzip | mysql -u root -p meine_datenbank
pv (Pipe Viewer) zeigt dir eine Fortschrittsanzeige mit geschätzter Restzeit. Bei großen Dumps Gold wert.
Häufige Fehler und Fallstricke
Fehler: „MySQL server has gone away"
Passiert bei sehr großen Dumps. Lösung:
mysql --max_allowed_packet=512M -u root -p meine_datenbank < backup.sql
Fehler: Encoding-Probleme nach Import
Immer den Zeichensatz explizit angeben:
mysqldump --default-character-set=utf8mb4 -u root -p meine_datenbank > backup.sql
mysql --default-character-set=utf8mb4 -u root -p meine_datenbank < backup.sql
Fehler: Dump ist inkonsistent
Ohne --single-transaction (InnoDB) oder --lock-tables (MyISAM) können Daten inkonsistent sein, wenn während des Dumps Schreibvorgänge stattfinden.
Fehler: Views verursachen Probleme beim Import
Views werden als Tabellen exportiert und brauchen die Basis-Tabellen. Reihenfolge im Dump kann Probleme machen. Lösung:
# Erst Tabellen importieren, dann Views separat
mysqldump --no-data --routines meine_datenbank > struktur_und_views.sql
Fehler: Passwort in der Bash-History
Statt -pPasswort lieber eine ~/.my.cnf verwenden:
[mysqldump]
user=backup_user
password=geheim
[mysql]
user=backup_user
password=geheim
chmod 600 ~/.my.cnf
mysqldump Cheat Sheet
| Aufgabe | Befehl |
|---|---|
| Eine DB sichern | mysqldump -u root -p db > db.sql |
| Alle DBs sichern | mysqldump --all-databases > all.sql |
| Nur Struktur | mysqldump --no-data db > struct.sql |
| Nur Daten | mysqldump --no-create-info db > data.sql |
| Eine Tabelle | mysqldump db tabelle > tab.sql |
| Komprimiert | mysqldump db | gzip > db.sql.gz |
| Ohne Locks | mysqldump --single-transaction db > db.sql |
| Mit Routines | mysqldump --routines db > db.sql |
| Restore | mysql db < db.sql |
| Restore (gz) | gunzip < db.sql.gz | mysql db |
mysqldump ist nicht das schnellste und nicht das modernste Tool — aber es ist auf jedem MySQL-Server da, funktioniert zuverlässig und ist seit Jahrzehnten bewährt. Für die meisten Anwendungsfälle ist es alles, was du brauchst.