Dieser Artikel zeigt dir, wie du mit mysqldump deine aktuelle Datenbank in einzelnen Dateien sichern kannst. Zum Abschluss erstellt ein Cronjob jeden Tag ein neues Backup.

Zu Beginn möchte ich auf den Artikel von  Mattias Geniar verlinken (MySQL Back-up: Take a mysqldump with each database). Von ihm habe ich die Idee erhalten, es mit einem Bash-Script anstatt Python zu automatisieren 🙂

Vorbereitung

Falls ihr auf eurem Linux Computer bereits eine Mysql/MariaDB-Datenbank installiert habt, ist mysqldump bereits installiert. Ansonsten könnt ihr die Client-Programme (ohne Datenbank) mit folgendem Befehl nachträglich installieren:

sudo apt-get install mysql-client

Das Script

Das Script verwendet mysql und mysqldump. Mysql wird verwendet, um alle Datenbanken zu ermitteln. Mysqldump erstellt anschließend das Backup. Erklärungen der Befehle habe ich als Kommentare im Script eingefügt:

##!/bin/bash
# Das heutige Datum als YYYY-MM-dd in einer Variablen speichern.
DATE_TODAY=$(date +%F)

# Die Liste an Datenbanken in einer Variablen speichern.
DB_LIST=$(mysql -N -uBENUTZER -e 'show databases')

# Den Zielordner für die Dumps benamen. Die geschweiften Klammern
# begrenzen den Namen der Variablen.
DUMPS="${DATE_TODAY}_MysqlDumps"

# Ausgabeordner für die Dumps erstellen.
mkdir $DUMPS

# Schleife über die einzelnen Datenbanken. Der aktuelle Name wird
# in der Variablen 'dbName' gespeichert.
for dbName in $DB_LIST
do
  # Dateinamen für die aktuelle Datenbank erzeugen.
  FILENAME="${dbName}.sql"
  
  # mysqldump aufrufen. Den Datenbanknamen und Zieldatei angeben
  mysqldump -uBENUTZER --routines --triggers --single-transaction "$dbName" > ${DUMPS}/$FILENAME

done

Der Platzhalter Benutzer steht stellvertretend für euren Datenbankadministrator, welcher auf die Datenbanken zugreifen kann. Wenn der Parameter mit nur einem Buchstaben gewählt wird, muss der Parameter ohne Leerzeichen direkt dahinter stehen. Wenn ihr auf ein entferntes System zugreifen wollt, könnt ihr mit -h (–host) den Server spezifizieren. Der Parameter -p (–password) setzt das Passwort.

Es kann eine Sicherheitslücke sein, Passwörter im Klartext in einer Scriptdatei zu speichern. Daher bietet es sich an, das Script lokal auf dem Datenbankserver auszuführen. Parallel dazu legt man einen Datenbankbenutzer an, der sich nur lokal anmelden kann und verwendet diesen.

Das Script legt einen neuen Ordner im aktuellen Verzeichnis an. Falls ihr das Verzeichnis ändern möchtet, passt die Pfade in Zeile 14 und 24 an. Eventuell müsst ihr es mit mkdir vorher anlegen. Als Backupstrategie könnte hier ein USB-Stick oder ein Netzlaufwerk verwendet werden.

Nach Ausführung des Scripts erhaltet ihr folgende Ordnerstruktur:

  • 2018-01-01_MysqlDumps\
    • Datenbank_1.sql
    • Datenbank_2.sql

Cronjob anlegen

Um einen Cronjob anzulegen gebt crontab -e ein und fügt folgende Zeile hinzu:

# m h dom mon dow command
# Datenbank täglich um 2 Uhr morgens sichern
0 2 * * * bash /home/pi/mysqlDump.sh

Damit wird das Backup jeden Tag um 2 Uhr Morgens durchgeführt. Passt darauf auf, dass der Pfad zur Scriptdatei stimmt 🙂

Möglicher Fehler:
Mysql/mysqldump werden vom cronjob nicht gefunden

In diesem Falle müsst die die Aufrufe anpassen. Die Programme liegen (bei Raspbian) unter /usr/bin. Die Aufrufe sehen dann folgendermaßen aus:

# Vorher  -> Nachher
mysql     -> /usr/bin/mysql ...
mysqldump -> /usr/bin/mysqldump ...

Fazit

Hier habt ihr ein grundlegendes Script, um eure Datenbanken mit mysqldump in eigenen Dateien zu sichern. Im Idealfall bindet ihr ein externes Laufwerk (USB, Netzwerk) ein und sichert dort eure Dateien. Falls der Datenbankserver ausfällt, könnt ihr die Scripte ausführen und die Daten zurückspielen.

Wie sichert ihr eure Mysql-Datenbanken? Habt ihr ein Backup schonmal benötigt?


Bildnachweis: Pixabay.com