Datenbank-Backup automatisieren mit Cronjobs
Ein Backup, das du manuell machst, machst du irgendwann nicht mehr. Punkt. Wer seine Datenbank ernsthaft schützen will, automatisiert den Prozess. Ich zeig dir vier bewährte Methoden — vom einfachen Cronjob mit mysqldump bis zum MySQLDumper-Perl-Script, das auch auf Shared Hosting funktioniert.
Methode 1: MySQLDumper Cronjob (Perl-Script)
MySQLDumper bringt ein eigenes Perl-Script mit, das speziell für Shared Hosting entwickelt wurde. Der Vorteil: Es umgeht das PHP-Timeout, weil es direkt als CGI läuft.
Einrichtung
- Öffne die Datei
perl/perlconfig.cgiin einem Texteditor - Trage deine Datenbank-Zugangsdaten ein:
$dbhost = "localhost"; $dbname = "meine_datenbank"; $dbuser = "mein_benutzer"; $dbpass = "mein_passwort"; $dbport = "3306"; - Lade die Perl-Dateien per FTP hoch und setze die Rechte:
chmod 755 perl/*.cgi chmod 755 perl/*.pl
Cronjob beim Hoster einrichten
Die meisten Hoster bieten ein Web-Interface für Cronjobs. Trage dort folgende URL ein:
https://deine-domain.de/mysqldumper/perl/crondump.pl
Alternativ als System-Cronjob:
# Tägliches Backup um 3:00 Uhr
0 3 * * * /usr/bin/perl /var/www/html/mysqldumper/perl/crondump.pl
Bei Hostern wie all-inkl oder Hetzner kannst du den Cronjob auch per wget aufrufen:
0 3 * * * wget -q -O /dev/null "https://deine-domain.de/mysqldumper/perl/crondump.pl?config=1"
Konfiguration in MySQLDumper
In der MySQLDumper-Oberfläche unter „Cron“ kannst du festlegen:
- Welche Datenbank gesichert wird
- Ob die Backup-Datei komprimiert werden soll (GZip)
- Ob alte Backups automatisch gelöscht werden
- E-Mail-Benachrichtigung nach erfolgreichem Backup
Methode 2: crontab + mysqldump
Die klassische Methode für alle, die SSH-Zugang haben. Simpel, zuverlässig, kein Schnickschnack.
Einfaches Backup-Script
Erstelle eine Datei /home/user/backup_db.sh:
#!/bin/bash
# Konfiguration
DB_USER="backup_user"
DB_PASS="sicheres_passwort"
DB_NAME="meine_datenbank"
BACKUP_DIR="/home/user/backups"
DATE=$(date +%Y-%m-%d_%H-%M)
# Verzeichnis erstellen falls nötig
mkdir -p $BACKUP_DIR
# Backup erstellen und komprimieren
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz
# Backups älter als 30 Tage löschen
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
# Optional: Erfolgsmeldung
echo "Backup $DB_NAME erstellt: ${DB_NAME}_${DATE}.sql.gz"
Rechte setzen und Cronjob einrichten:
chmod 700 /home/user/backup_db.sh
# Crontab bearbeiten
crontab -e
# Zeile hinzufügen (täglich um 2:30 Uhr):
30 2 * * * /home/user/backup_db.sh >> /home/user/backup.log 2>&1
Sicherheitshinweis: Passwort nicht im Script
Besser als das Passwort im Script zu haben ist eine .my.cnf im Home-Verzeichnis:
# ~/.my.cnf
[mysqldump]
user=backup_user
password=sicheres_passwort
chmod 600 ~/.my.cnf
Dann kann das Script ohne -u und -p Optionen arbeiten:
mysqldump $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz
Mehrere Datenbanken sichern
#!/bin/bash
BACKUP_DIR="/home/user/backups"
DATE=$(date +%Y-%m-%d_%H-%M)
DATABASES="db_wordpress db_shop db_forum"
mkdir -p $BACKUP_DIR
for DB in $DATABASES; do
mysqldump $DB | gzip > $BACKUP_DIR/${DB}_${DATE}.sql.gz
done
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
Methode 3: Perl-Script (ohne MySQLDumper)
Falls du Perl auf dem Server hast, aber kein MySQLDumper installieren willst, geht es auch mit einem einfachen Perl-Script:
#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw(strftime);
my $db_user = "backup_user";
my $db_name = "meine_datenbank";
my $backup_dir = "/home/user/backups";
my $date = strftime("%Y-%m-%d_%H-%M", localtime);
my $filename = "${db_name}_${date}.sql.gz";
system("mysqldump -u $db_user $db_name | gzip > $backup_dir/$filename");
# Alte Backups aufräumen (30 Tage)
opendir(my $dh, $backup_dir);
while (my $file = readdir($dh)) {
next unless $file =~ /\.sql\.gz$/;
my $filepath = "$backup_dir/$file";
if (-M $filepath > 30) {
unlink $filepath;
}
}
closedir($dh);
print "Backup erstellt: $filename\n";
Methode 4: FTP-Backup (Offsite-Sicherung)
Ein Backup auf demselben Server ist besser als keins — aber nicht viel. Für echte Sicherheit brauchst du eine Offsite-Kopie. Hier ein Script, das das Backup automatisch per FTP auf einen zweiten Server überträgt:
#!/bin/bash
# Lokales Backup erstellen
DB_NAME="meine_datenbank"
BACKUP_DIR="/home/user/backups"
DATE=$(date +%Y-%m-%d_%H-%M)
FILE="${DB_NAME}_${DATE}.sql.gz"
mysqldump $DB_NAME | gzip > $BACKUP_DIR/$FILE
# Per FTP hochladen
ftp -inv <<EOF
open backup-server.de
user ftp_benutzer ftp_passwort
binary
cd /backups
put $BACKUP_DIR/$FILE
bye
EOF
echo "Backup $FILE lokal und remote gesichert."
Besser als FTP ist natürlich SFTP oder SCP:
# Per SCP auf Remote-Server kopieren (SSH-Key nötig)
scp $BACKUP_DIR/$FILE [email protected]:/backups/
Oder mit rclone direkt in die Cloud (S3, Google Drive, etc.):
rclone copy $BACKUP_DIR/$FILE remote:backups/mysql/
Restore — Backup wiederherstellen
Das beste Backup ist nutzlos, wenn du nicht weißt, wie du es wiederherstellst. Hier die Methoden für die verschiedenen Backup-Formate.
Unkomprimiertes SQL-Backup
mysql -u root -p meine_datenbank < backup.sql
GZip-komprimiertes Backup
gunzip < backup.sql.gz | mysql -u root -p meine_datenbank
Oder in zwei Schritten:
gunzip backup.sql.gz
mysql -u root -p meine_datenbank < backup.sql
Restore über MySQLDumper
- MySQLDumper im Browser öffnen
- „Wiederherstellung" im Menü wählen
- Backup-Datei aus der Liste auswählen (oder hochladen)
- Ziel-Datenbank wählen und „Start" klicken
MySQLDumper macht den Restore ebenfalls in Chunks — damit klappt auch die Wiederherstellung großer Datenbanken ohne Timeout.
Nur bestimmte Tabellen wiederherstellen
Falls du nur einzelne Tabellen brauchst:
# Tabelle aus Dump extrahieren (mit sed)
sed -n '/^-- Table structure for table `users`/,/^-- Table structure for table/p' backup.sql > users_only.sql
# Oder direkt bei mysqldump nur eine Tabelle sichern
mysqldump meine_datenbank users > users_backup.sql
Cron-Zeitformate — Kurzreferenz
Weil ich das selbst jedes Mal nachschlage:
| Ausdruck | Bedeutung |
|---|---|
0 3 * * * |
Täglich um 3:00 Uhr |
0 */6 * * * |
Alle 6 Stunden |
30 2 * * 0 |
Sonntags um 2:30 Uhr |
0 4 1 * * |
Am 1. jedes Monats um 4:00 |
*/15 * * * * |
Alle 15 Minuten |
Fazit
Welche Methode du wählst, hängt von deiner Hosting-Situation ab:
- Shared Hosting ohne SSH: MySQLDumper Perl-Script (Methode 1)
- Root-Server / VPS: crontab + mysqldump (Methode 2)
- Maximale Sicherheit: Lokales Backup + Offsite-Kopie (Methode 2 + 4)
Egal welche Variante — teste den Restore regelmäßig. Ein Backup, das sich nicht wiederherstellen lässt, ist kein Backup. Ich mache einmal im Quartal einen Test-Restore auf einer leeren Datenbank. Kostet 10 Minuten, spart im Ernstfall Tage.