Mit mysqldump lassen sich MySQL- und MariaDB-Datenbanken direkt im Terminal sichern. Die erzeugte SQL-Datei enthält Tabellenstrukturen und Daten und kann bei Bedarf mit dem MySQL-Client wieder eingespielt werden. Diese Anleitung zeigt die wichtigsten Befehle für einzelne Datenbanken, mehrere Datenbanken und automatisierte Backups.

Voraussetzungen

  • SSH-Zugang zum Server
  • ein MySQL- oder MariaDB-Benutzer mit den erforderlichen Rechten
  • ausreichend freier Speicherplatz für die Sicherungsdatei

Wichtig: Geben Sie das Datenbankpasswort nicht direkt in der Befehlszeile an. Verwenden Sie nur -p; der Client fragt das Passwort anschließend verdeckt ab. So erscheint es weder in der Shell-Historie noch in der Prozessliste.

Eine MySQL-Datenbank sichern

Die allgemeine Syntax für eine einzelne Datenbank lautet:

mysqldump -u BENUTZER -p DATENBANK > backup.sql

Beispiel für die Datenbank wordpress:

mysqldump -u adminer -p wordpress > wordpress.sql

Für InnoDB-Datenbanken empfiehlt sich --single-transaction. Dadurch entsteht in der Regel ein konsistentes Backup, ohne die Tabellen während der gesamten Sicherung zu sperren:

mysqldump --single-transaction --routines --triggers -u adminer -p wordpress > wordpress.sql

Mit --routines werden gespeicherte Prozeduren und Funktionen einbezogen. Trigger sichert mysqldump normalerweise standardmäßig; die ausdrückliche Angabe macht die Absicht jedoch deutlich.

Backup komprimieren

Größere SQL-Dateien können direkt während der Sicherung mit gzip komprimiert werden:

mysqldump --single-transaction -u adminer -p wordpress | gzip > wordpress.sql.gz

Datenbank auf einem entfernten Server sichern

Wenn der MySQL-Server Netzwerkverbindungen erlaubt, geben Sie den Host mit -h und optional den Port mit -P an:

mysqldump -h mysql-01.example.net -P 3306 -u adminer -p wordpress > wordpress.sql

Der Datenbankport sollte nicht unnötig öffentlich erreichbar sein. Sicherer ist meist, sich per SSH auf dem Server anzumelden und mysqldump dort auszuführen oder einen SSH-Tunnel zu verwenden.

Mehrere oder alle Datenbanken sichern

Mehrere Datenbanken werden mit --databases angegeben:

mysqldump -u adminer -p --databases wordpress shop > datenbanken.sql

Alle Datenbanken eines Servers sichern Sie mit:

mysqldump -u adminer -p --all-databases > alle-datenbanken.sql

Für eine vollständige Sicherung sollten Sie prüfen, ob der verwendete Benutzer die benötigten Rechte für alle Datenbanken, Views, Trigger, Events und Routinen besitzt.

Nur Struktur oder nur Daten sichern

Nur die Tabellenstruktur ohne Datensätze:

mysqldump -u adminer -p --no-data wordpress > wordpress-struktur.sql

Nur die Daten ohne Anweisungen zum Erstellen der Tabellen:

mysqldump -u adminer -p --no-create-info wordpress > wordpress-daten.sql

Einzelne Tabellen sichern

Tabellennamen werden nach dem Datenbanknamen aufgeführt. Das folgende Beispiel sichert die Tabellen wp_posts und wp_postmeta:

mysqldump -u adminer -p wordpress wp_posts wp_postmeta > wordpress-tabellen.sql

MySQL-Datenbank wiederherstellen

Die Zieldatenbank muss bereits existieren. Falls sie noch nicht vorhanden ist, erstellen Sie sie zunächst mit einem Benutzer, der dafür ausreichende Rechte besitzt:

mysql -u adminer -p -e "CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

Danach importieren Sie die SQL-Datei:

mysql -u adminer -p wordpress < wordpress.sql

Ein komprimiertes Backup kann ohne vorheriges Entpacken wiederhergestellt werden:

gunzip -c wordpress.sql.gz | mysql -u adminer -p wordpress

Achtung: Ein Import kann vorhandene Tabellen und Daten überschreiben. Prüfen Sie deshalb Datenbankname, Sicherungsdatei und Zielsystem sorgfältig. Erstellen Sie vor einer Wiederherstellung möglichst ein aktuelles Backup.

Automatisiertes Backup per Bash-Skript

Das folgende Skript legt für jede Datenbank eine eigene, komprimierte Datei in einem datumsbasierten Ordner ab. Vorhandene Sicherungen werden nicht automatisch gelöscht. Systemdatenbanken werden übersprungen.

#!/usr/bin/env bash
set -euo pipefail

BACKUP_ROOT="/var/backups/mysql"
BACKUP_DIR="$BACKUP_ROOT/$(date +%Y-%m-%d_%H-%M-%S)"
MYSQL_USER="backup"

mkdir -p "$BACKUP_DIR"

mysql -u "$MYSQL_USER" -p -N -e "SHOW DATABASES" |
while IFS= read -r database; do
    case "$database" in
        information_schema|performance_schema|mysql|sys)
            continue
            ;;
    esac

    mysqldump --single-transaction --routines --triggers         -u "$MYSQL_USER" -p "$database" |
        gzip > "$BACKUP_DIR/$database.sql.gz"
done

echo "Backup gespeichert in: $BACKUP_DIR"

Dieses einfache Beispiel fragt das Passwort bei jedem Aufruf erneut ab und eignet sich daher vor allem für manuelle Tests. Für zeitgesteuerte Backups per Cron sollten Zugangsdaten nicht im Skript stehen. Verwenden Sie stattdessen beispielsweise mysql_config_editor, eine restriktiv geschützte MySQL-Konfigurationsdatei oder die sichere Geheimnisverwaltung Ihrer Hosting-Umgebung.

Backup prüfen

Ein Backup ist erst dann zuverlässig, wenn sich seine Wiederherstellung nachweisen lässt. Prüfen Sie daher regelmäßig:

  • ob die Sicherungsdateien vorhanden und größer als null Byte sind,
  • ob die Protokolle keine Fehler enthalten,
  • ob eine Wiederherstellung in einer getrennten Testdatenbank funktioniert,
  • ob Aufbewahrungsdauer, Verschlüsselung und externer Speicherort zum eigenen Sicherheitskonzept passen.

Bewahren Sie mindestens eine Sicherung außerhalb des produktiven Servers auf. So bleibt das Backup auch bei einem Serverausfall, Schadsoftwarebefall oder versehentlichem Löschen verfügbar.