MySQL-Datenbanken unter Linux täglich automatisch sichern

Veröffentlicht am Aktualisiert am 5 Min. Lesezeit

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-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: 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?
Ja. Das Backup-Skript selbst ist distributionsunabhängig. Unterschiedlich ist nur die Paketverwaltung: Debian und Ubuntu nutzen apt, AlmaLinux, Rocky Linux und RHEL verwenden dnf.
Sollte ich noch yum oder besser dnf verwenden?
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.
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.
Der Cronjob läuft nicht. Was kann ich prüfen?
Auf minimalen Installationen der RHEL-Familie fehlt der Cron-Dienst oft. Installieren Sie das Paket cronie und aktivieren Sie den Dienst crond. Prüfen Sie außerdem mit crontab -l, ob der Eintrag wirklich gespeichert wurde.
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.

MySQL Backup MariaDB Backup mysqldump Backup Cronjob MySQL Linux