MySQL-Datenbanken unter Ubuntu täglich automatisch sichern

Veröffentlicht am Aktualisiert am 4 Min. Lesezeit

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-file liest Benutzer und Passwort aus der eben angelegten Datei. Diese Option muss als erste Option stehen.
  • --single-transaction erzeugt bei InnoDB-Tabellen einen in sich konsistenten Stand, ohne die Datenbank zu sperren.
  • --routines und --events nehmen gespeicherte Prozeduren und geplante Events mit ins Backup.
  • gzip komprimiert den Export und spart dadurch deutlich Speicherplatz.
  • Der find-Befehl löscht ausschließlich Backup-Dateien, die älter als sieben Tage sind. Über KEEP_DAYS passen 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?
Kommandozeilen sind über den Befehl ps für alle Benutzer des Systems sichtbar. Hinterlegen Sie Benutzer und Passwort deshalb in der Datei /root/.my.cnf und setzen Sie die Rechte mit chmod 600, sodass ausschließlich root sie lesen kann.
Wie lange werden die Backups aufbewahrt?
Im Beispielskript sieben Tage. Ältere Dateien löscht der find-Befehl automatisch. Über die Variable KEEP_DAYS im Skript passen Sie die Aufbewahrungsdauer an Ihren Speicherplatz an.
Wie spiele ich ein Backup wieder ein?
Mit zcat und einer Weiterleitung an den Datenbank-Client, zum Beispiel zcat /opt/mysqlbackups/alldbs_2026-07-26-05-00.sql.gz gefolgt von einer Pipe an mysql. Testen Sie die Wiederherstellung am besten einmal bewusst auf einem Testsystem.
Reicht es, die Backups auf demselben Server zu speichern?
Nein. Bei einem Ausfall oder Datenverlust des gesamten Systems wären die Sicherungen ebenfalls betroffen. Übertragen Sie die Dateien zusätzlich per rsync oder scp auf ein zweites Ziel.
Der Cronjob meldet Access denied, auf der Konsole klappt es. Warum?
Dann läuft der Cronjob unter einem anderen Benutzer als erwartet. Tragen Sie den Job in die Crontab von root ein und verwenden Sie im Skript ausschließlich absolute Pfade.

MySQL Backup MariaDB Backup mysqldump Backup Cronjob MySQL Ubuntu