Aktionen

Veeam Backup MySQL oder MariaDB

Aus znilwiki

1 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


2 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:

Pre-and-Post-Scripts-001.png


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.

Important.png
Hinweis: Das ganze funktioniert sowohl mit den original VMware-Tools als auch den Open-VM-Tools!




3 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:

Pre-and-Post-Scripts-001.png


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.

Important.png
Hinweis: Das ganze funktioniert sowohl mit den original VMware-Tools als auch den Open-VM-Tools!




4 Kommentare


Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen.