In diesem Artikel:
Kategorie: Linux , PostgreSQL , PrestaShop Linux: chmod , lftp , mkdir , mysqldump , nanoFunktionsweise
- Datenbank sichern
Mitmysqldump
wird die angegebene Datenbank konsistent exportiert. Dabei werden auch Routinen und Events gesichert.
Der Output wird direkt mitgzip
komprimiert und in einem Unterverzeichnis von/var/backups/sql_backups
abgelegt. - 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 {} \;
- FTP-Upload (passiv & verschlüsselt)
Der Upload erfolgt mitlftp
. 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