mysqldump erstellt SQL-Dumps Ihrer Datenbanken - portable Backups, die Sie auf jedem MySQL/MariaDB-Server wiederherstellen können.

Grundlegende Syntax

mysqldump -u BENUTZER -p DATENBANKNAME > backup.sql

Sie werden nach dem Passwort gefragt.

Einzelne Datenbank sichern

mysqldump -u root -p meine_datenbank > meine_datenbank.sql

Alle Datenbanken sichern

mysqldump -u root -p --all-databases > alle_datenbanken.sql

Mehrere Datenbanken

mysqldump -u root -p --databases db1 db2 db3 > mehrere_dbs.sql

Nur Tabellenstruktur (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 Komprimierung

Große Datenbanken sollten komprimiert werden:

mysqldump -u root -p meine_datenbank | gzip > backup.sql.gz

Wichtige Optionen

| Option | Beschreibung | |--------|--------------| | --single-transaction | Konsistentes Backup ohne Locks (InnoDB) | | --quick | Zeilenweise lesen (weniger RAM) | | --lock-tables | Tabellen während Backup sperren | | --routines | Stored Procedures einschließen | | --triggers | Trigger einschließen | | --events | Scheduled Events einschließen |

Produktions-Backup (empfohlen)

mysqldump -u root -p \
    --single-transaction \
    --quick \
    --routines \
    --triggers \
    --events \
    meine_datenbank > backup.sql

Backup wiederherstellen

Unkomprimiert

mysql -u root -p meine_datenbank < backup.sql

Falls Datenbank nicht existiert

mysql -u root -p -e "CREATE DATABASE meine_datenbank"
mysql -u root -p meine_datenbank < backup.sql

Komprimiertes Backup

gunzip < backup.sql.gz | mysql -u root -p meine_datenbank
# oder
zcat backup.sql.gz | mysql -u root -p meine_datenbank

Alle Datenbanken wiederherstellen

mysql -u root -p < alle_datenbanken.sql

Passwort in Skripten

Option 1: MySQL-Config (empfohlen)

Erstellen Sie ~/.my.cnf:

[mysqldump]
user=backup_user
password=geheimes_passwort

[mysql]
user=backup_user
password=geheimes_passwort

Rechte setzen:

chmod 600 ~/.my.cnf

Dann ohne Passwortangabe:

mysqldump meine_datenbank > backup.sql

Option 2: Environment-Variable

export MYSQL_PWD="passwort"
mysqldump -u root meine_datenbank > backup.sql
unset MYSQL_PWD

Automatisches Backup mit Cron

Backup-Skript erstellen

nano /root/backup-db.sh
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/backup/mysql
RETENTION_DAYS=7

# Verzeichnis erstellen
mkdir -p $BACKUP_DIR

# Backup erstellen
mysqldump --single-transaction --quick --routines --all-databases | gzip > $BACKUP_DIR/all-databases_$DATE.sql.gz

# Alte Backups löschen
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

# Ergebnis loggen
echo "[$DATE] Backup erstellt: all-databases_$DATE.sql.gz" >> /var/log/mysql-backup.log

Ausführbar machen:

chmod +x /root/backup-db.sh

Cronjob einrichten

crontab -e
# Täglich um 3 Uhr
0 3 * * * /root/backup-db.sh

Backup auf Remote-Server

Per SSH

mysqldump -u root -p meine_datenbank | gzip | ssh user@backup-server "cat > /backup/db.sql.gz"

Mit rsync (nach lokalem Dump)

mysqldump -u root -p --all-databases | gzip > /backup/db.sql.gz
rsync -avz /backup/db.sql.gz user@backup-server:/backup/

Einzelne Tabellen sichern

mysqldump -u root -p meine_datenbank tabelle1 tabelle2 > tabellen.sql

Backup verifizieren

Struktur prüfen

head -100 backup.sql

Auf Test-Server wiederherstellen

mysql -u root -p -e "CREATE DATABASE test_restore"
mysql -u root -p test_restore < backup.sql
# Daten prüfen...
mysql -u root -p -e "DROP DATABASE test_restore"

Komprimiertes Backup prüfen

gunzip -t backup.sql.gz && echo "OK" || echo "FEHLER"

Große Datenbanken

Problem: Dump dauert ewig

Lösung: --quick und --single-transaction

Problem: Wiederherstellung langsam

Temporär Checks deaktivieren:

mysql -u root -p << EOF
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
SOURCE backup.sql;
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
SET UNIQUE_CHECKS = 1;
SET AUTOCOMMIT = 1;
EOF

Alternative: mydumper/myloader

Für sehr große Datenbanken paralleles Dumpen:

apt install mydumper
mydumper -u root -p password -B meine_datenbank -o /backup/
myloader -u root -p password -d /backup/ -B meine_datenbank

Häufige Fehler

"Access denied"

Benutzer hat keine LOCK TABLES Berechtigung:

mysqldump --single-transaction ...  # Statt --lock-tables

"Table doesn't exist"

View referenziert gelöschte Tabelle. Mit --force ignorieren:

mysqldump --force ...

"Got packet bigger than max_allowed_packet"

In /etc/mysql/my.cnf:

[mysqldump]
max_allowed_packet = 512M

Fazit

mysqldump ist einfach und zuverlässig. Für Produktions-Backups: --single-transaction, --quick, und regelmäßig per Cron. Vergessen Sie nicht, die Wiederherstellung gelegentlich zu testen!