Sicheres Backup von MySQL Datenbanken mit Cronjob

Wer eine Datenbank besitzt, sollte diese auch mit regelmäßigen Backups sichern! Wie genau man das unter Linux Systemen auf eine sichere Art und Weise erledigen kann, erkläre ich in diesem Artikel! Im Laufe der Anleitung benötigen wir folgende Programme:

  • pixz („apt-get install pixz“ auf dem Server)
  • Putty (nur falls die Verbindung von einem Windows PC erfolgt)

Verbindung per SSH 

Wenn ihr bereits eine entsprechende Datenbank besitzt, dann kennt ihr euch sicher schon ein wenig aus.
Ich gehe also davon aus, dass ihr wisst, wie ihr eine Verbindung zum Terminal eures Servers aufbaut.
Wenn ihr euch verbunden habt, könnt ihr mit dem nächsten Schritt fortfahren.

Read-Only User

Damit wir die Datenbank(en) nicht mit dem Root User lesen müssen, erstellen wir einen extra User. Dieser wird nur berechtigt sein im Read-Only Mode auf die Datenbank zuzugreifen. Somit können diese nicht verändert werden.

Um den Read-Only User zu erstellen, melden wir uns mit dem MySQL Root user an:

mysql -u root -p

Mit dem folgenden Kommando erstellen wir dann einen Benutzer. Die Werte „backupuser“ und „12345“ solltet ihr mit euren eigenen Credentials ersetzen. Der erste definiert den Namen vom Benutzer und der zweite das Passwort.

CREATE USER 'backupuser'@'localhost' IDENTIFIED BY '12345';

Um dem User die Leserechte auf alle Datenbanken zu erteilen, führen wir das folgende Kommando aus:

GRANT SELECT ON *.* TO 'backupuser'@'localhost';

Skript für Backup 

Damit der User die Dateien lesen kann, und diese danach in eine Datei gepackt werden können, müsst ihr ein Skript mit dem folgenden Inhalt erstellen. Mit diesem wird ein Dump aller Datenbanken erstellt, welcher dabei in eine Datei geschrieben und anschließend noch komprimiert wird. Ich habe den Dateiname backupdb.sh gewählt. 
Die Datei könnt ihr mit einem Editor eurer Wahl erstellen. Außerdem benötigt diese die Dateiendung .sh.

#!/bin/bash 
DATE=$(date +%d%m%Y-%H) 
mysqldump -u backupuser -p'12345' --all-databases > alldb-"$DATE".sql 
sleep 5 
pixz alldb-"$DATE".sql

Statt „backupuser“ und „12345“ müsst ihr hier wieder eure eigenen Login-Daten eintragen.

Skript ausführbar machen 

Aktuell könnt ihr das Skript nur mit dem User bearbeiten / verändern, mit dem ihr es erstellt habt.
Damit das Skript später ausgeführt werden kann, müssen wir es mit dem folgenden Kommando noch executable (ausführbar) machen.

chmod +x backupdb.sh

Um das Script zu testen, können wir es mit ./backupdb.sh ausführen. Eine neue Datei sollte im Home Verzeichnis vom User erscheinen.

Cronjob einrichten 

In meinem Fall soll der Cronjob jeden Mittwoch um Mitternacht laufen. Da ich vor der Anleitung nicht genau wusste, wie die Zeitangaben bei der Einrichtung funktionieren, habe ich einen Generator verwendet. Dort könnt ihr einstellen, was ausgeführt werden soll, und wann er laufen soll. Ich erhielt von der Seite den folgenden Output:

0 0 * * 3 ./backupdb.sh >/dev/null 2>&1

Mit dem folgenden Kommando rufen wir dann die Übersicht der Crontabs auf.

crontab -e

Unter den instructions können wir dann unsere vom Generator erstellte Zeile einfügen.

Zurückspielen (falls nötig)

Sollte es nötig sein, dass die gesicherte Datei zurückgespielt wird, gelingt dies mit den folgenden beiden Schritten.

Entpacken der jeweiligen Backup-Datei:

unxz alldb-12062019-00.sql.xz

Importieren der Sql-Datei:

mysql -u root -p < alldb-12062019-00.sql

Zusammenfassung

Jeden Mittwoch wird ein Skript zum Backups erstellen ausgeführt. Alle Datenbanken werden dabei von dem MySQL User „backupuser“ ausgelesen, und anschließend in eine Datei gepackt, deren Name wie folgt aufgebaut ist: alldb-AKTUELLESDATUM-STUNDE.sql.xz. Die Dateiendung .xz entsteht, weil wir die .sql Datei mit dem Programm pixz zu einer .xz Datei komprimiert haben.
Diese Datei wird immer im Home Verzeichnis des Users gespeichert, mit dem das Skript ausgeführt wird. In meinem Fall „root“. Mit „unxz“ könnt ihr die Datei später wieder entpacken.

Add a Comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert