Automatisiertes MySQL-Backup mit Upload auf einen FTP-Server

In diesem Artikel:

Kategorie: , , Linux: , , , ,

Funktionsweise

  1. Datenbank sichern
    Mit mysqldump wird die angegebene Datenbank konsistent exportiert. Dabei werden auch Routinen und Events gesichert.
    Der Output wird direkt mit gzip komprimiert und in einem Unterverzeichnis von /var/backups/sql_backups abgelegt.
  2. Alte Backups bereinigen
    Backupdateien, die älter als 14 Tage sind, werden automatisch gelöscht.
    Das geschieht über den Befehl: find "$BACKUP_DIR" -type f -name "*.sql.gz" -mtime +14 -exec rm {} \;
  3. FTP-Upload (passiv & verschlüsselt)
    Der Upload erfolgt mit lftp. Das Skript nutzt passiven FTP-Modus und erzwingt TLS-Verschlüsselung (FTPS).
    Damit ist die Übertragung sowohl NAT-freundlich als auch sicher.
    Auf dem Zielserver wird das Verzeichnis automatisch angelegt, falls es noch nicht existiert.

Skript

Die Bash-Datei erstellen mit nano.

nano /var/backups/backup.sh

Und das folgende Skript einfügen und anpassen.

#!/bin/bash

# === Einstellungen ===
DB_NAME="db_name"
DB_USER="db_user"
DB_PASS="db_password"
BACKUP_DIR="/var/backups/sql_backups"
DATE=$(date +"%Y-%m-%d_%H-%M")
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_$DATE.sql.gz"

# === Lokales Backup erstellen ===
mkdir -p "$BACKUP_DIR"
mysqldump \
  --single-transaction --quick --routines --events \
  --no-tablespaces \
  -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" | gzip > "$BACKUP_FILE"

# === Alte lokale Backups löschen (älter als 14 Tage) ===
find "$BACKUP_DIR" -type f -name "*.sql.gz" -mtime +14 -exec rm {} \;

# === FTP Upload ===
FTP_SERVER="ip-adresse-ftp-server"
FTP_USER="ftp_user"
FTP_PASS="ftp_password"
FTP_DIR="RemoteBackups/sql_backups"

lftp -u "$FTP_USER","$FTP_PASS" "$FTP_SERVER" <<EOF
set ftp:passive-mode on
set ftp:ssl-allow yes
set ftp:ssl-force yes
set ftp:ssl-protect-data yes
set ftp:sync-mode no
set ssl:verify-certificate no
set ssl:check-hostname no
mkdir -p $FTP_DIR
cd $FTP_DIR
put $BACKUP_FILE
bye
EOF

Das Skript ausführbar machen.

chmod +x /var/backups/backup.sh

Einen Cronjob für die automatische Ausführung erstellen. Mit flock wird verhindert, dass mehrere Backup Jobs gleichzeitig laufen. Außerdem erfolgt eine Ausgabe der Fehler in eine Log-File.

0 1 * * * flock -n /var/lock/backup.lock /bin/bash /var/backups/sql_backup/backup.sh >> /var/log/sql_backup.log 2>&1

Hinweise

  • Der FTP-Server sollte passiven Modus (PASV) unterstützen.
    Nur so funktionieren Verbindungen zuverlässig hinter NAT-Routern oder Firewalls.
  • Für zusätzliche Sicherheit kann auf dem Zielserver FTPS (explizit über Port 21) aktiviert werden.

Ergebnis

  • Lokales Backup: /var/backups/sql_backups/db_name_YYYY-MM-DD_HH-MM.sql.gz
  • Remote-Backup: RemoteBackups/sql_backups/ auf dem FTP-Server

Das Skript ist stabil, einfach erweiterbar und eignet sich ideal, um Datenbanken automatisiert zu sichern und Offsite-Backups bereitzuhalten.

Backup von Datenbank und Webdaten

Das nachfolgende Skript sichert auch die Webdaten.

#!/bin/bash

# === Einstellungen ===
DB_NAME="db_name"
DB_USER="db_user"
DB_PASS="db_password"
BACKUP_DIR="/var/backups/sql_backups"
DATE=$(date +"%Y-%m-%d_%H-%M")
SQL_BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_$DATE.sql.gz"

mkdir -p "$BACKUP_DIR"

# MySQL-Dump erstellen
mysqldump \
  --single-transaction --quick --routines --events \
  --no-tablespaces \
  -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" | gzip > "$SQL_BACKUP_FILE"

# Web-Backup
WEB_SRC_DIR="/var/www"
WEB_BACKUP_FILE="$BACKUP_DIR/presta_web_$DATE.tar.gz"

# === Webroot packen (Caches auslassen) ===
# Passe die Excludes bei Bedarf an deine Struktur an.
tar -C "$(dirname "$WEB_SRC_DIR")" \
  --exclude="$(basename "$WEB_SRC_DIR")/var/cache/*" \
  --exclude="$(basename "$WEB_SRC_DIR")/var/logs/*" \
  --exclude="$(basename "$WEB_SRC_DIR")/log/*" \
  -czf "$WEB_BACKUP_FILE" "$(basename "$WEB_SRC_DIR")"

# === Alte lokale Backups (älter als 14 Tage) löschen ===
find "$BACKUP_DIR" -type f \( -name "*.sql.gz" -o -name "web_*.tar.gz" \) -mtime +14 -exec rm -f {} \;

# === FTP Upload ===
FTP_SERVER="ip-adresse-ftp-server"
FTP_USER="ftp_user"
FTP_PASS="ftp_password"
FTP_DIR="RemoteBackups/sql_backups"

lftp -u "$FTP_USER","$FTP_PASS" "$FTP_SERVER" <<EOF
set ftp:passive-mode on
set ftp:ssl-allow yes
set ftp:ssl-force yes
set ftp:ssl-protect-data yes
set ftp:sync-mode no
set ssl:verify-certificate no
set ssl:check-hostname no

mkdir -p $FTP_DIR
cd $FTP_DIR

put -c "$SQL_BACKUP_FILE"
put -c "$WEB_BACKUP_FILE"

bye
EOF