Veeam Backup MySQL oder MariaDB
Aus znilwiki
Vorwort
Auf Grundlage von dieser Quelle:
https://www.veeam.com/wp-consistent-protection-mysql-mariadb.html
Hab ich mir folgende Methoden für die Sicherung einer MySQL-Instanz erstellt. In dem Beispiel handelt es sich um einen Zabbix Server unter Ubuntu 16.04., das ganze sollte aber auf quasi jeder Linux-Distribution mit installierten VMware-Tools funktionieren.
Auf die erste Methode war ich selbst kommen - unter obigen Link gibt es eine Version mit Timeout, bei mir ohne.
Die 2. Lösung habe ich ergoogelt und die Skripts an meine Bedürfnisse angepasst.
Die Lorbeeren dafür gebühren Pascal Di Marco
Methode 1: Cold Backup - Zabbix und Datenbank anhalten
Bei dieser Methode passiert folgendes:
- Die Zabbix-Server und die Datenbank werden vor einem Snapshot angehalten
- Der Snapshot wird erstellt
- Die Datenbank und der Zabbix-Server werden wieder gestartet
Unter VMware funktioniert das mit 2 Skripten die wir wie folgt anlegen:
nano /usr/sbin/pre-freeze-script
mit folgendem Inhalt:
#!/bin/sh
echo "$(date) pre-freeze start" >> /tmp/snapshot.log
systemctl stop zabbix-server.service
systemctl stop mysql.service
echo "$(date) pre-freeze stop" >> /tmp/snapshot.log
und
nano /usr/sbin/post-thaw-script
#!/bin/sh
echo "$(date) post-thaw start" >> /tmp/snapshot.log
systemctl start mysql.service
systemctl start zabbix-server.service
echo "$(date) post-thaw stop" >> /tmp/snapshot.log
Jetzt müssen wir die beiden Skripte noch ausführbar machen und dem root zuordnen:
chmod 0700 /usr/sbin/pre-freeze-script chmod 0700 /usr/sbin/post-thaw-script chown root:root /usr/sbin/pre-freeze-script chown root:root /usr/sbin/post-thaw-script
Voraussetzung ist das die VMware-Tools installiert sind!
Dabei ist es egal ob es sich um die Original VMware-Tools oder um die Open-VM-Tools aus den Repositories handelt.
Nun können wir die Skripts testen indem wir einen Snapshot mit den folgenden Einstellungen erstellen:
Wenn wir uns die Logs ansehen sollte
- Ein Eintrag in die Datei /tmp/snapshot.log vorgenommen
- Der Zabbix-Server gestoppt
- Der MySQL-Server gestoppt
- Wieder ein Eintrag in die Datei /tmp/snapshot.log geschrieben
- Der MySQL-Server wieder gestartet
- Der Zabbix-Server wieder gestartet
werden.
Methode 2: Hot Backup - Datenbank einfrieren
Bei dieser Methode passiert folgendes:
- Die Datenbank wird vor einem Snapshot auf "READ ONLY" gesetzt - zuvor werden noch alle Daten geschrieben ("FLUSH TABLES")
- Der Snapshot wird erstellt
- Die Datenbank wird wieder für Schreibzugriffe freigegeben
Unter VMware funktioniert das mit 2 Skripten die wir wie folgt anlegen:
nano /usr/sbin/pre-freeze-script
mit folgendem Inhalt:
#!/bin/sh
# 2018-04-20 Bernhard Linz
# Original script by Pascal Di Marco, check https://www.veeam.com/wp-consistent-protection-mysql-mariadb.html for more information
# Log will be write to syslog and(!) to /tmp/snapshot.log
echo "$0 pre-freeze start" | logger
echo "-------------------------------------------------------------------------------------" >> /tmp/snapshot.log
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') pre-freeze start" >> /tmp/snapshot.log
# Set Username and Passwort for MySQL Access. Set mysql_password="" if no password needed
mysql_username="root"
mysql_password="ThePassword"
timeout=300
# ************************************************************************************************
# No Changes behind this line!
# ************************************************************************************************
# Check if username + password is used
if [ -n "$mysql_password" ]; then
use_credentials="-u$mysql_username -p$mysql_password"
else
use_credentials=""
fi
# Name of the Lockfile
lock_file=/tmp/mysql_tables_read_lock
sleep_time=$((timeout+10))
rm -f $lock_file
echo "$0 executing FLUSH TABLES WITH READ LOCK" | logger
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') executing FLUSH TABLES WITH READ LOCK" >> /tmp/snapshot.log
# Start READ LOCK - Process will send to background (and will still run after script is completed. Lock will stop if process is stopped
# After READ ONLY mode is entered the lockfile will be created. Process will stop when getting stop signal from post-thaw-script or timeout reached
mysql $use_credentials -e "FLUSH TABLES WITH READ LOCK; system touch $lock_file; system nohup sleep $sleep_time; system echo lock released|logger; " > /dev/null &
# get the PID of the mysql process
mysql_pid=$!
echo "$0 child pid $mysql_pid" | logger
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') child pid $mysql_pid" >> /tmp/snapshot.log
# Waiting for the lockfile ...
c=0
while [ ! -f $lock_file ]
do
# check if mysql is running
if ! ps -p $mysql_pid 1>/dev/null ; then
echo "$0 mysql command has failed (bad credentials?)" | logger
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') mysql command has failed (bad credentials?)" >> /tmp/snapshot.log
exit 1
fi
sleep 1
c=$((c+1))
# check if the script run into timeout
if [ $c -gt $timeout ]; then
echo "$0 timed out waiting for lock" | logger
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') timed out waiting for lock" >> /tmp/snapshot.log
touch $lock_file
kill $mysql_pid
fi
done
# write PID into the lockfile
echo $mysql_pid > $lock_file
echo "$0 pre-freeze stop" | logger
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') pre-freeze stop" >> /tmp/snapshot.log
exit 0
und
nano /usr/sbin/post-thaw-script
#!/bin/sh
# 2018-04-20 Bernhard Linz
# Original script by Pascal Di Marco, check https://www.veeam.com/wp-consistent-protection-mysql-mariadb.html for more information
# Log will be write to syslog and(!) to /tmp/snapshot.log
echo "$0 post-thaw start" | logger
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') post-thaw start" >> /tmp/snapshot.log
lock_file=/tmp/mysql_tables_read_lock
# get PID from lockfile
mysql_pid=$(cat $lock_file)
echo "$0 sending sigterm to $mysql_pid" | logger
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') sending sigterm to $mysql_pid" >> /tmp/snapshot.log
# and send stop to process
pkill -9 -P $mysql_pid
rm -f $lock_file
echo "$0 post-thaw stop" | logger
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') post-thaw stop" >> /tmp/snapshot.log
exit 0
Jetzt müssen wir die beiden Skripte noch ausführbar machen und dem root zuordnen:
chmod 0700 /usr/sbin/pre-freeze-script chmod 0700 /usr/sbin/post-thaw-script chown root:root /usr/sbin/pre-freeze-script chown root:root /usr/sbin/post-thaw-script
Voraussetzung ist das die VMware-Tools installiert sind!
Dabei ist es egal ob es sich um die Original VMware-Tools oder um die Open-VM-Tools aus den Repositories handelt.
Nun können wir die Skripts testen indem wir einen Snapshot mit den folgenden Einstellungen erstellen:
Beispielausgabe aus der \tmp\snapshot.log
:
------------------------------------------------------------------------------------- /usr/sbin/pre-freeze-script 2018-04-20 11:37:12 pre-freeze start /usr/sbin/pre-freeze-script 2018-04-20 11:37:12 executing FLUSH TABLES WITH READ LOCK /usr/sbin/pre-freeze-script 2018-04-20 11:37:12 child pid 10992 /usr/sbin/pre-freeze-script 2018-04-20 11:37:13 pre-freeze stop /usr/sbin/post-thaw-script 2018-04-20 11:37:16 post-thaw start /usr/sbin/post-thaw-script 2018-04-20 11:37:16 sending sigterm to 10992 /usr/sbin/post-thaw-script 2018-04-20 11:37:16 post-thaw stop
Zabbix selbst nimmt den Vorgang relativ locker und meldet einige slow query bei inserts.