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.sqlSie werden nach dem Passwort gefragt.
Einzelne Datenbank sichern
mysqldump -u root -p meine_datenbank > meine_datenbank.sqlAlle Datenbanken sichern
mysqldump -u root -p --all-databases > alle_datenbanken.sqlMehrere Datenbanken
mysqldump -u root -p --databases db1 db2 db3 > mehrere_dbs.sqlNur Tabellenstruktur (keine Daten)
mysqldump -u root -p --no-data meine_datenbank > struktur.sqlNur Daten (keine Struktur)
mysqldump -u root -p --no-create-info meine_datenbank > daten.sqlMit Komprimierung
Große Datenbanken sollten komprimiert werden:
mysqldump -u root -p meine_datenbank | gzip > backup.sql.gzWichtige 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.sqlBackup wiederherstellen
Unkomprimiert
mysql -u root -p meine_datenbank < backup.sqlFalls Datenbank nicht existiert
mysql -u root -p -e "CREATE DATABASE meine_datenbank"
mysql -u root -p meine_datenbank < backup.sqlKomprimiertes Backup
gunzip < backup.sql.gz | mysql -u root -p meine_datenbank
# oder
zcat backup.sql.gz | mysql -u root -p meine_datenbankAlle Datenbanken wiederherstellen
mysql -u root -p < alle_datenbanken.sqlPasswort in Skripten
Option 1: MySQL-Config (empfohlen)
Erstellen Sie ~/.my.cnf:
[mysqldump]
user=backup_user
password=geheimes_passwort
[mysql]
user=backup_user
password=geheimes_passwortRechte setzen:
chmod 600 ~/.my.cnfDann ohne Passwortangabe:
mysqldump meine_datenbank > backup.sqlOption 2: Environment-Variable
export MYSQL_PWD="passwort"
mysqldump -u root meine_datenbank > backup.sql
unset MYSQL_PWDAutomatisches 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.logAusführbar machen:
chmod +x /root/backup-db.shCronjob einrichten
crontab -e# Täglich um 3 Uhr
0 3 * * * /root/backup-db.shBackup 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.sqlBackup verifizieren
Struktur prüfen
head -100 backup.sqlAuf 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;
EOFAlternative: 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_datenbankHä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 = 512MFazit
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!