mysqldump — Der komplette Guide

mysqldump Tutorial — Datenbanken per Kommandozeile exportieren

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.