Zum Hauptinhalt springen
Zurück zur Kategorie

Datenbank-Backup: MySQL und PostgreSQL Dump-Anleitung

MySQL und PostgreSQL Datenbank-Backup und -Wiederherstellung mit mysqldump und pg_dump. Automatische Backups mit Cron, Wiederherstellungsverfahren und Best Practices.

Lesezeit: 13 min Serververwaltung
mysqlpostgresqlbackupdumprestorecrondatenbankmysqldump

Inhaltsverzeichnis

Datenbank-Backup: MySQL und PostgreSQL Dump-Anleitung

Datenbank-Backups gehören zu den kritischsten Aufgaben der Serververwaltung. Regelmäßige Backups sind unerlässlich, um sich von Hardwareausfällen, menschlichen Fehlern oder Cyberangriffen zu erholen. Diese Anleitung behandelt Backup- und Wiederherstellungsverfahren für MySQL und PostgreSQL.

Warum Datenbank-Backup?

  • Hardwareausfall oder Festplattenkorruption
  • Versehentlich gelöschte Daten
  • Probleme nach Software-Updates
  • Cyberangriffe oder Ransomware
  • Datenkopie für Entwicklungs-/Testumgebungen

Ohne Backups ist Datenverlust irreversibel. Befolgen Sie die 3-2-1-Regel: 3 Kopien, 2 verschiedene Medientypen, 1 externer Standort.

MySQL / MariaDB Backup

Grundlegendes Backup mit mysqldump

hljs bash
# Einzelne Datenbank sichern
mysqldump -u root -p datenbankname > backup.sql

# Mit Passwort (für Skripte)
mysqldump -u root -pPASSWORT datenbankname > backup.sql

# Alle Datenbanken sichern
mysqldump -u root -p --all-databases > alle_datenbanken.sql

# Bestimmte Tabellen sichern
mysqldump -u root -p datenbankname tabelle1 tabelle2 > tabellen.sql

# Komprimiertes Backup
mysqldump -u root -p datenbankname | gzip > backup_$(date +%Y%m%d).sql.gz

Erweiterte mysqldump-Optionen

hljs bash
# Konsistentes Backup für große Datenbanken
mysqldump -u root -p \
  --single-transaction \
  --routines \
  --triggers \
  --events \
  datenbankname > vollbackup.sql

# Nur Struktur (ohne Daten)
mysqldump -u root -p --no-data datenbankname > schema.sql

# Nur Daten (ohne Struktur)
mysqldump -u root -p --no-create-info datenbankname > daten.sql

# Backup von Remote-Server
mysqldump -h remote_server -u benutzer -p datenbankname > remote_backup.sql

MySQL Wiederherstellung

hljs bash
# Aus SQL-Datei wiederherstellen
mysql -u root -p datenbankname < backup.sql

# Aus komprimiertem Backup wiederherstellen
gunzip -c backup.sql.gz | mysql -u root -p datenbankname

# Neue Datenbank erstellen und wiederherstellen
mysql -u root -p -e "CREATE DATABASE neue_datenbank;"
mysql -u root -p neue_datenbank < backup.sql

# Alle Datenbanken wiederherstellen
mysql -u root -p < alle_datenbanken.sql

Sichere Anmeldedaten-Speicherung

hljs bash
# ~/.my.cnf erstellen
nano ~/.my.cnf
hljs ini
[client]
user=root
password=IHR_PASSWORT
host=localhost
hljs bash
# Dateiberechtigungen einschränken
chmod 600 ~/.my.cnf

# Jetzt ohne Passwortabfrage verwenden
mysqldump datenbankname > backup.sql

PostgreSQL Backup

Grundlegendes Backup mit pg_dump

hljs bash
# Einzelne Datenbank sichern
pg_dump -U postgres datenbankname > backup.sql

# Komprimiertes benutzerdefiniertes Format (empfohlen)
pg_dump -U postgres -Fc datenbankname > backup.dump

# Verzeichnisformat (für parallele Wiederherstellung)
pg_dump -U postgres -Fd datenbankname -f backup_verzeichnis/

# Alle Datenbanken sichern (inkl. Rollen)
pg_dumpall -U postgres > alle_pg.sql

# Komprimiertes Backup
pg_dump -U postgres datenbankname | gzip > backup_$(date +%Y%m%d).sql.gz

PostgreSQL Wiederherstellung

hljs bash
# Aus SQL-Format wiederherstellen
psql -U postgres datenbankname < backup.sql

# Benutzerdefiniertes Format (.dump) wiederherstellen
pg_restore -U postgres -d datenbankname backup.dump

# Parallele Wiederherstellung (schneller)
pg_restore -U postgres -d datenbankname -j 4 backup.dump

# Neue Datenbank erstellen und wiederherstellen
psql -U postgres -c "CREATE DATABASE neue_datenbank;"
pg_restore -U postgres -d neue_datenbank backup.dump

Passwortloser Zugriff (.pgpass)

hljs bash
nano ~/.pgpass
# Format: host:port:database:user:password
localhost:5432:*:postgres:IHR_PASSWORT
hljs bash
chmod 600 ~/.pgpass

Automatische Backups mit Cron

MySQL Automatisches Backup-Skript

hljs bash
#!/bin/bash

# Konfiguration
DB_USER="root"
DB_PASS="IHR_PASSWORT"
DB_NAME="datenbankname"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# Backup-Verzeichnis erstellen
mkdir -p $BACKUP_DIR

# Backup erstellen
mysqldump -u $DB_USER -p$DB_PASS \
  --single-transaction \
  --routines \
  --triggers \
  $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz

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

echo "Backup abgeschlossen: ${DB_NAME}_${DATE}.sql.gz"
hljs bash
# Skript ausführbar machen
chmod +x /root/scripts/mysql-backup.sh

# Zu Crontab hinzufügen (täglich um 02:00 Uhr)
crontab -e
0 2 * * * /root/scripts/mysql-backup.sh >> /var/log/mysql-backup.log 2>&1

Backups auf Remote-Server übertragen

hljs bash
# Mit rsync auf Remote-Server kopieren
rsync -avz /var/backups/mysql/ benutzer@remote-server:/backup/mysql/

# Mit scp einzelne Datei senden
scp /var/backups/mysql/backup.sql.gz benutzer@remote-server:/backup/

# Mit rclone in Cloud-Speicher (S3, Google Drive, etc.)
rclone copy /var/backups/mysql/ remote:bucket-name/mysql/

Backup-Verifizierung

hljs bash
# Backup-Dateigröße prüfen
ls -lh /var/backups/mysql/

# Durch Wiederherstellung in Testdatenbank verifizieren
mysql -u root -p -e "CREATE DATABASE test_restore;"
mysql -u root -p test_restore < backup.sql
mysql -u root -p -e "SHOW TABLES;" test_restore
mysql -u root -p -e "DROP DATABASE test_restore;"

Testen Sie Ihre Backups regelmäßig. Ein Backup, das Sie nicht wiederherstellen können, ist nutzlos. Führen Sie mindestens einmal im Monat eine Test-Wiederherstellung durch.

Best Practices

  1. Regelmäßige Backups: Täglich oder stündlich für kritische Datenbanken
  2. Komprimierung: gzip zur Einsparung von Speicherplatz verwenden
  3. Remote-Speicherung: Backups auf einem anderen Server oder in der Cloud speichern
  4. Aufbewahrungsrichtlinie: 7 tägliche, 4 wöchentliche, 12 monatliche Backups
  5. Verschlüsselung: Backups mit sensiblen Daten verschlüsseln
  6. Überwachung: E-Mail-Benachrichtigungen bei Backup-Fehlern
  7. Tests: Backups regelmäßig durch Wiederherstellung verifizieren

Fazit

Regelmäßige Datenbank-Backups sind die wichtigste Verteidigung gegen Datenverlust. Durch automatische Backup-Skripte für MySQL und PostgreSQL und externe Speicherung können Sie Ihre Daten auf REXE-Servern sicher halten.