MySQL-Datenbanken unter Ubuntu täglich automatisch sichern
Ein kleines Skript plus Cronjob genügt, um alle MySQL- und MariaDB-Datenbanken auf Ihrem Ubuntu-Server jede Nacht komprimiert zu sichern und alte Backups aufzuräumen.
Sie betreiben ein Ubuntu 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. In dieser Anleitung richten Sie ein Backup-Skript ein, das jede Nacht alle Datenbanken als komprimierte SQL-Datei exportiert und alte Sicherungen automatisch aufräumt.
Voraussetzungen
Sie benötigen einen SSH-Zugang mit Root-Rechten auf einem aktuellen Ubuntu mit installiertem MySQL- oder MariaDB-Server. Empfohlen werden Ubuntu 24.04 LTS "Noble Numbat" und Ubuntu 22.04 LTS "Jammy Jellyfish". Ubuntu 20.04 LTS hat im Mai 2025 das Ende des regulären Supports erreicht und sollte nicht mehr produktiv eingesetzt werden.
Bringen Sie das System zunächst auf den aktuellen Stand:
apt update && apt upgrade -y
Falls der Texteditor Nano noch nicht installiert ist, holen Sie das nach:
apt install nano -y
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: Ubuntu 24.04 LTS und 22.04 LTS liefern sowohl mysql-server (MySQL 8.0.46) als auch mariadb-server mit. Das Skript funktioniert mit beiden unverändert. Läuft bei Ihnen MariaDB ab Version 11, heißt das Sicherungswerkzeug dort mariadb-dump, der Name mysqldump bleibt als Verweis darauf erhalten und funktioniert weiterhin.
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.
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.
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
Warum sollte das Datenbank-Passwort nicht im mysqldump-Befehl stehen?
Wie lange werden die Backups aufbewahrt?
Wie spiele ich ein Backup wieder ein?
Reicht es, die Backups auf demselben Server zu speichern?
Der Cronjob meldet Access denied, auf der Konsole klappt es. Warum?
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.

