MySQL-Datenbanken unter Linux täglich automatisch sichern
Automatische MySQL- und MariaDB-Backups auf jedem Linux-Server: Skript, Cronjob und Aufbewahrung einrichten, unter Debian und Ubuntu ebenso wie unter AlmaLinux.
Sie betreiben ein Linux Betriebssystem auf Ihrem vServer, Rootserver oder dedizierten Server und möchten alle Ihre MySQL- und MariaDB-Datenbanken automatisch täglich sichern? Dann sind Sie hier genau richtig. Diese Anleitung funktioniert distributionsübergreifend, also unter Debian und Ubuntu ebenso wie unter AlmaLinux, Rocky Linux und RHEL.
Voraussetzungen
Sie benötigen einen SSH-Zugang mit Root-Rechten und einen installierten MySQL- oder MariaDB-Server. Empfohlen sind die jeweils aktuellen Distributionsversionen: Debian 13 "Trixie" und Debian 12 "Bookworm", Ubuntu 24.04 LTS und 22.04 LTS sowie AlmaLinux und Rocky Linux in den Versionen 9 und 10. Ältere Systeme wie Debian 10, Ubuntu 20.04 oder CentOS 7 erhalten keine regulären Sicherheitsupdates mehr.
Bringen Sie das System zunächst auf den aktuellen Stand.
Für Debian und Ubuntu:
apt update && apt upgrade -y
Für AlmaLinux, Rocky Linux und RHEL:
dnf update -y
Falls der Texteditor Nano noch nicht installiert ist, holen Sie das nach.
Für Debian und Ubuntu:
apt install nano -y
Für AlmaLinux, Rocky Linux und RHEL:
dnf install nano -y
Auf aktuellen Systemen der RHEL-Familie ist dnf der Nachfolger von yum. Der alte Befehl funktioniert dort meist noch als Verweis, verwenden sollten Sie jedoch dnf.
Planen Sie außerdem ausreichend Speicherplatz ein. Eine Woche komprimierter Sicherungen belegt je nach Datenbankgröße schnell mehrere Gigabyte. Den freien Platz prüfen Sie mit df -h.
Zugangsdaten sicher hinterlegen
Das Passwort gehört nicht direkt in den Aufruf von mysqldump, denn Kommandozeilen sind über ps für alle Benutzer des Systems sichtbar. Legen Sie stattdessen eine Zugangsdatei an, die nur root lesen darf:
nano /root/.my.cnf
Inhalt der Datei:
[client]
user=root
password=IHR_DATENBANK_PASSWORT
Setzen Sie anschließend die Rechte so, dass ausschließlich root Zugriff hat:
chmod 600 /root/.my.cnf
Backup-Skript erstellen
Nun erstellen wir ein Bash-Skript, das den Export übernimmt und alte Sicherungen löscht. In unserem Beispiel heißt es mysql_export_all.sh und liegt im Verzeichnis /opt/mysqlbackups:
mkdir -p /opt/mysqlbackups
nano /opt/mysqlbackups/mysql_export_all.sh
In dieses Skript schreiben Sie folgenden Inhalt:
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/opt/mysqlbackups"
KEEP_DAYS=7
DATE=$(date +%Y-%m-%d-%H-%M)
mkdir -p "$BACKUP_DIR"
mysqldump --defaults-extra-file=/root/.my.cnf --all-databases --single-transaction --routines --events | gzip > "$BACKUP_DIR/alldbs_$DATE.sql.gz"
find "$BACKUP_DIR" -type f -name "alldbs_*.sql.gz" -mtime +$KEEP_DAYS -delete
Die wichtigsten Optionen im Überblick:
--defaults-extra-fileliest Benutzer und Passwort aus der eben angelegten Datei. Diese Option muss als erste Option stehen.--single-transactionerzeugt bei InnoDB-Tabellen einen in sich konsistenten Stand, ohne die Datenbank zu sperren.--routinesund--eventsnehmen gespeicherte Prozeduren und geplante Events mit ins Backup.gzipkomprimiert den Export und spart dadurch deutlich Speicherplatz.- Der
find-Befehl löscht ausschließlich Backup-Dateien, die älter als sieben Tage sind. ÜberKEEP_DAYSpassen Sie die Aufbewahrungsdauer an.
Ein Hinweis zum Datenbankserver: Welcher bei Ihnen läuft, hängt von der Distribution ab. Debian enthält kein Paket mysql-server und setzt durchgehend auf MariaDB (Debian 13 in Version 11.8, Debian 12 in 10.11, Debian 11 in 10.5). Ubuntu 24.04 LTS und 22.04 LTS bieten dagegen beides an, MySQL 8.0.46 ebenso wie MariaDB. Das Skript funktioniert in allen Fällen unverändert. Ab MariaDB 11 heißt das Sicherungswerkzeug mariadb-dump, der Name mysqldump bleibt als Verweis darauf erhalten.
Skript ausführbar machen und testen
Machen Sie das Skript ausführbar:
chmod +x /opt/mysqlbackups/mysql_export_all.sh
Führen Sie es einmal von Hand aus und prüfen Sie das Ergebnis, bevor Sie es automatisieren:
/opt/mysqlbackups/mysql_export_all.sh
ls -lh /opt/mysqlbackups/
Die erzeugte Datei sollte deutlich größer als null Byte sein. Einen kurzen Blick in den Inhalt werfen Sie so:
zcat /opt/mysqlbackups/alldbs_*.sql.gz | head -n 20
Cronjob für das tägliche Backup einrichten
Öffnen Sie den Cronjob-Editor:
export VISUAL=nano; crontab -e
Für ein tägliches Backup um 5 Uhr morgens ergänzen Sie folgende Zeile:
0 5 * * * /opt/mysqlbackups/mysql_export_all.sh >> /var/log/mysql-backup.log 2>&1
Die Ausgabe landet damit in einer Logdatei, sodass Sie Fehler später nachvollziehen können. Ob der Cronjob korrekt eingetragen wurde, prüfen Sie mit crontab -l.
Auf minimalen Installationen der RHEL-Familie fehlt der Cron-Dienst gelegentlich. Sie installieren und aktivieren ihn so:
dnf install cronie -y
systemctl enable --now crond
Ab jetzt werden alle Datenbanken jede Nacht um 5 Uhr exportiert, und Sicherungen, die älter als sieben Tage sind, verschwinden automatisch.
Backup zurückspielen
Ein Backup ist erst dann etwas wert, wenn Sie es auch einspielen können. Testen Sie die Wiederherstellung deshalb einmal bewusst, am besten auf einem Testsystem:
zcat /opt/mysqlbackups/alldbs_2026-07-26-05-00.sql.gz | mysql --defaults-extra-file=/root/.my.cnf
Möchten Sie nur eine einzelne Datenbank zurückholen, entpacken Sie das Backup zuerst und extrahieren den passenden Abschnitt, oder Sie sichern einzelne Datenbanken zusätzlich separat mit mysqldump --databases meinedb.
Backups außerhalb des Servers ablegen
Sicherungen, die ausschließlich auf demselben Server liegen, helfen bei einem Datenverlust des gesamten Systems nicht weiter. Übertragen Sie die Dateien deshalb zusätzlich auf ein zweites Ziel, etwa per rsync oder scp auf einen anderen Server oder einen Backup-Speicher:
rsync -avz /opt/mysqlbackups/ benutzer@backupziel:/pfad/zum/backup/
Ergänzen Sie diesen Befehl einfach am Ende Ihres Skripts, dann läuft die Übertragung automatisch mit.
Häufige Fehler und Lösungen
Das Backup ist 0 Byte groß: Meist stimmen die Zugangsdaten in /root/.my.cnf nicht. Testen Sie die Anmeldung mit mysql --defaults-extra-file=/root/.my.cnf -e "SHOW DATABASES;".
"Access denied" im Cron, aber nicht auf der Konsole: Der Cronjob läuft unter einem anderen Benutzer als erwartet. Tragen Sie den Job in die Crontab von root ein und nutzen Sie im Skript ausschließlich absolute Pfade.
SELinux blockiert das Skript (AlmaLinux, Rocky Linux, RHEL): Prüfen Sie mit ausearch -m avc -ts recent, ob eine Zugriffsverweigerung protokolliert wurde, und passen Sie den Kontext des Backup-Verzeichnisses gegebenenfalls an.
Die Festplatte läuft voll: Reduzieren Sie KEEP_DAYS, oder verschieben Sie ältere Sicherungen auf einen externen Speicher.
Fehlermeldung zu --single-transaction bei MyISAM-Tabellen: Diese Option wirkt nur bei InnoDB. Bei MyISAM-Tabellen können Sie stattdessen --lock-tables verwenden, dann werden die Tabellen für die Dauer des Exports gesperrt.
Häufige Fragen
Funktioniert die Anleitung auf jeder Linux-Distribution?
Sollte ich noch yum oder besser dnf verwenden?
Warum sollte das Datenbank-Passwort nicht im mysqldump-Befehl stehen?
Der Cronjob läuft nicht. Was kann ich prüfen?
Reicht es, die Backups auf demselben Server zu speichern?
2024-2026 KernelHost GmbH. Alle Rechte vorbehalten. Diese Anleitung ist urheberrechtlich geschützt. Eine Veröffentlichung auf anderen Webseiten, auch auszugsweise oder in bearbeiteter Form, ist ohne unsere schriftliche Zustimmung nicht gestattet. Zitate mit Quellenangabe und Link sind ausdrücklich willkommen.

