Datenbank-Backups 

In diesem Hilfecenter-Artikel wird beschrieben, wie Backups von einzelnen MySQL-Datenbanken in unseren Cluster-Setups mithilfe der Linux-Software mysqldump oder eines Shell-Scripts angelegt beziehungsweise wiederhergestellt werden können. Die automatisierten Datenbank-Backups eignen sich, um z. B. stündliche Backups aller Datenbanken anzulegen.


Datenbank-Backup via CLI erstellen

Mithilfe der Linux-Software mysqldump können in wenigen Schritten Backups von einzelnen erstellt werden. Melden Sie sich hierzu zunächst auf Ihrem creoline Datenbank-Server via SSH an.


Optionen Erklärung
--single-transaction Führt Vorgang als eine einzige Transaktion aus.
--no-tablespaces Verhindert die Wiederherstellung von Tablespace-Zuweisungen
-u Benutzername
-p Erfordert Passwortauthentifizierung
-h Hostname (Standard: localhost/127.0.0.1)
> backup.sql Leitet die Befehlsausgabe in den Dateinamen weiter (erforderlich)
Optionen (optional)
-P Port (Standard: 3306)
Platzhalter Erklärung Beispiel
DB_USER Datenbank-Benutzername my_dbuser
DB_HOST VPC-IPv4-Adresse 10.20.0.21
DB_NAME Name der Datenbank my_database


Bestimmte MySQL-Datenbank sichern:


Ersetzen Sie backup.sql durch den Dateinamen Ihres Backups:


Der Systembenutzer Ihres ersten Datenbank-Servers besitzt Schreibrechte für das Verzeichnis unter /var/backups/mysql. Tauschen die die oben beschriebenen Platzhalter entsprechend Ihrem Setup in dem folgenden Befehl aus, um ein Backup in diesem Verzeichnis zu erstellen.

mysqldump --single-transaction --no-tablespaces \
 -u DB_USER -p -h DB_HOST DB_NAME > /var/backups/mysql/backup.sql



Datenbank-Backup via CLI wiederherstellen

Um das Backup einer bestehenden Datenbank wiederherzustellen, melden Sie sich zunächst auf Ihrem creoline Server via SSH an. Führen Sie anschließend folgenden Befehl aus, um das Backup backup.sql der Datenbank DB_NAME wiederherzustellen:

Bestimmte MySQL-Datenbank wiederherstellen

mysql -u DB_USER -p -h DB_HOST DB_NAME < /var/backups/mysql/backup.sql



Geplante automatische Backups

Einrichtung

Führen Sie folgende Befehle mit dem Systembenutzer Ihres Datenbank-Servers aus:

touch /var/backups/mysql/mysql_backup.sh
chmod +x /var/backups/mysql/mysql_backup.sh

nano /var/backups/mysql/mysql_backup.sh


Fügen Sie folgenden Inhalt in der Datei ein und passen Sie die Variablen MYSQL_HOST, MYSQL_USER, MYSQL_PASS und MYSQL_DBNAME entsprechend den Zugangsdaten für Ihre Datenbank an:

#!/bin/bash
set -e

KEEP_LATEST=7
BACKUP_DIR=/var/backups/mysql

MYSQL_HOST="<localhost>"
MYSQL_USER="<username>"
MYSQL_PASS="<password>"
MYSQL_DBNAME="<databasename>"

DATE=$(date +"%m_%d_%Y")_$(date +"%H_%M")
BACKUP_FILENAME=backup_$MYSQL_DBNAME_$DATE

# Create Backup Directory if not exists
if [ ! -d $BACKUP_DIR ]; then
    echo -e "Backup directory $BACKUP_DIR does not exist!"
    exit 1
fi

# Create Backup
echo "Creating MySQL Backup $MYSQL_USER@$MYSQL_HOST for $MYSQL_DBNAME"

mariadb-dump --single-transaction --host=$MYSQL_HOST --user=$MYSQL_USER --password=$MYSQL_PASS --max_allowed_packet=1024M $MYSQL_DBNAME | gzip > $BACKUP_DIR/$BACKUP_FILENAME.sql.gz

# replace "mariadb-dump" with "mysqldump" if you're using MySQL instead of MariaDB

echo "MySQL Backup $BACKUP_FILENAME has been created succesfully"

# Remove old backups
cd $BACKUP_DIR
ls -tr | head -n -$(($KEEP_LATEST)) | xargs --no-run-if-empty rm

echo "Old MySQL Backups has been cleaned succesfully"


Speichern Sie die Datei mit Strg + s und schließen Sie den Editor mit Strg + x. 


In diesem Beispiel wird die --single-transaction Option für InnoDB Tabellen verwendet, um eine globale Transaktion zu starten, um die Integrität der zu sichernden Daten zu gewährleisten. Die Storage Engine MyISAM unterstützt keine Transaktionen. Sollten Sie mit diesem Script auch MyISAM Tabellen sichern wollen, sollte stattdessen die --lock-tables Option verwendet werden.


Das Script kann anschließend wie folgt getestet werden:

./mysql_backup.sh


Im Verzeichnis /var/backups/mysql sollte anschließend das erste vollständige MySQL Backup abgebildet werden:

ls -lah /var/mysql/backups

# Beispiel Ausgabe:
insgesamt 47M
drwxr-xr-x 2 root root 4,0K 21. Dez 17:01 .
drwxr-xr-x 3 root root 4,0K 21. Dez 16:31 ..
-rw-r--r-- 1 root root  47M 21. Dez 17:01 backup_12-21-2022_17:01:00.sql.gz


Die MySQL-Backups werden mithilfe von gzip komprimiert. Sofern das Backup wiederhergestellt werden soll, muss zunächst das Backup entpackt werden. ( Z.B: gunzip backup_12-21-2022_17:01:00.sql.gz )



Cronjob anlegen

Für die automatische Ausführung der Datenbank-Backups kann entweder ein Linux-Cronjob oder ein Cronjob über unser Kundencenter angelegt werden.


Kundencenter Cronjob

Eine detaillierte Anleitung zum Anlegen eines Cronjobs über unser Kundencenter finden Sie in dem Hilfecenter-Artikel Cronjobs.


Linux-Cronjob

Öffnen Sie den Crontab-Editor über den Befehl crontab -e.

 crontab -e


Stündliche Backups, um Minute 0:

0 * * * * mysql_backup.sh

Siehe: https://crontab.guru/every-1-hour


Tägliche Backups, um 00:00 Uhr:

0 0 * * * /var/backups/mysql_backup.sh

Siehe: https://crontab.guru/every-day-at-1am


Nach dem Hinzufügen der Zeile, verlassen Sie den Crontab-Editor über die Tastenkombination CTRL + X. Darauf folgt die Frage, ob die Änderungen gespeichert werden sollen. Benutzen Sie hierzu die Taste Y (für Yes) und drücken Sie anschließend die Enter Taste. Der Crontab-Editor quittiert die erfolgreiche Anpassung über die Ausgabe:

crontab: installing new crontab



Bestimmte MySQL-Datenbank der automatischen Backups wiederherstellen

Da das automatische Backup den Datenbank-Dump mit gzip⁣ komprimiert hat, muss folgender Befehl verwendet werden.

Der Befehl zcat gibt die gzip-komprimierte Datei an die Standardeingabe des mysql-Import-Befehls:

zcat /var/backups/mysql/backup.sql.gz | mysql -u DB_USER -p -h DB_HOST DB_NAME