Um nicht nur die Binärdateien aus MySQL heraus zu sichern, sondern zusätzlich auch lesbare SQL-Dateien (am Beispiel einer Zabbix-DB) zu haben, kann logrotate genutzt werden. Damit ist es möglich, mit geringem Aufwand (also ohne cronjobs) regelmäßige Ausgaben zu erhalten. Zudem werden veraltete Dateien automatisch gelöscht.

Um den Speicheraufwand gering zu halten, wird auf ein Backup von Trend- und Historiendaten der Zabbix-DB verzichtet.

Die betreffenden Tabellen werden herausgefiltert, während die anderen an mysqldump übergeben werden.

Auf einen Dienststop/start des MySQL-Servers wird zur Vereinfachung verzichtet.

Die Daten werden in einem gemounteten Verzeichnis abgelegt, dass nur für die Dauer des Skripts eingebunden ist.

MySQL-Backup Variante 1 (mit Skript)

Diese Variante ist für die Ausführung per cronjob geeignet.

#!/bin/bash
SRCDIR="SERVER:/backup/server/zabbix"
DSTDIR="/backup/data/"
DBUSER="DBUSER"
DBPASS="DBPASS"
DBNAME="zabbix"
DBTABLES=`echo "SHOW TABLES;" | mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} | tail -n +2 | grep -v ^trends | grep -v ^history | sed ':a;N;$!ba;s/\n/ /g'`
/bin/mount ${SRCDIR} ${DSTDIR}
/usr/bin/mysqldump -u ${DBUSER} -p${DBPASS} ${DBNAME} ${DBTABLES} | gzip -c > ${DSTDIR}/zabbix-`date '+%Y-%m-%d'`.sql.gz
/bin/umount ${DSTDIR}
exit 0;

MySQL-Backup Variante 2 (mit logrotate)

Die Backupdateien werden in einem gemounteten Verzeichnis abgelegt.

Damit das Logrotate überhaupt los läuft, muss allerdings im nicht-gemounteten Verzeichnis die Standarddatei (zabbix.sql.gz) vorliegen.

Diese Datei kann leer sein, da die eigentlichen rotates dann nach dem mount im Verzeichnis stattfinden.

/backup/data/zabbix.sql.gz {
    daily
    dateext
    dateformat _%Y-%m-%d
    extension .sql.gz
    nocompress
    create
    missingok
    rotate 8

    firstaction
        /bin/mount SERVER:/backup/server/zabbix /backup/data/ 2>&1 >/dev/null
        if [ ! -f /backup/data/zabbix.sql.gz ]; then
                touch /backup/data/zabbix.sql.gz
        fi
    endscript

    postrotate
        /usr/bin/mysqldump -u ${DBUSER} -p{DBPASS} {DBNAME} `echo "SHOW TABLES;" | mysql -u ${DBUSER} -p{DBPASS} {DBNAME} | tail -n +2 | grep -v ^trends | grep -v ^history | sed ':a;N;$!ba;s/\n/ /g'` | gzip -c > /backup/data/zabbix.sql.gz
    endscript

    lastaction
        /bin/umount /backup/data/ 2>&1 >/dev/null
    endscript
}