Ich habe dazu jetzt nochmal ein anderes Script geschrieben, dass auf meine Umgebung passt. Dort sichere ich nicht mit automysqldump, sondern mit einem eigenen Script. Hier passt automysqldump für mich nicht, weil es gleich mehrere Rotationen von Backups schreibt. Ich will aber nur genau ein Exemplar auf der Platte haben. Um die Aufbewahrungszeiträume kümmert sich bei mir die Datensicherung.
Das Script führt nur genau 3 einfache und wenig resourcenintensive Prüfungen aus:
- Backupdatei ist zu klein(<500 Bytes). Mögliche dahinterliegende Fehlerursache: Dump wurde abgebrochen.
- Backupdatei ist zu alt(>2 Tage). Mögliche dahinterliegende Fehlerursache: Dump wurde gar nicht ausgeführt.
- Anzahl Dumpdateien(Eine Dumpdatei pro DB) weicht zu sehr von der gespeicherten Anzahl ab. Mögliche dahinterliegende Fehlerursache: Dump wurde abgebrochen.
Grund dafür ist, dass auf einem System längere Zeiten die Dumps schief gelaufen sind und ich das viel zu spät erst bemerkt habe.
Ich habe das hier bewusst einfach gehalten und noch nicht mal den Dump dekrompimiert, um ihn zu testen, um wenig Systemlast zu verursachen. Die Erfahrung damit ist bis jetzt gut. Das Script hat sich gelegentlich mal gemeldet. Die Ursache, warum die Dumps gelegentlich fehlschlagen habe ich allerdings noch nicht gefunden.
novalix hat geschrieben: 07.01.2017 01:46:01
heisenberg hat geschrieben: cron kann durchaus auch mal kaputt sein und automysqlbackup nicht starten lassen(Deswegen wird dieses Script bzw. das Prüfscript für dieses hier nicht über cron gestartet).
Dann ist aber eben cron kaputt und nicht die daraus zu startenden Programme. Dann müsste man doch eher cron monitoren.
Cron war nur ein Beispiel. Natürlich kann man mögliche Ursachen alle einzeln untersuchen und für diese dann jeweils ein Monitoring aufsetzen. Ich habe hier einen anderen Weg gewählt: Ich prüfe den Ist-Zustand auf Plausibilität und melde Fehler, falls der nicht so ist, wie er sein soll.
Code: Alles auswählen
#!/bin/bash
#
# mysqlbackup_check: Check_MK local Check für checking Mysql-Dump-File Plausibility/Validity
#
export LC_ALL=C
export PATH=/bin:/usr/bin:/usr/local/bin
export MY_BACKUP_DIR=/var/backups/mysql
export MY_CHECK_DIR=/var/mysqlbackup_check
export MAX_DUMP_COUNT_DIFFERENCE=5 # If the dump count differs for this number, report critical state
export MAX_DUMP_COUNT_FILE_AGE=14 # If the dump file count is older than this number in days, recreate
export MAX_DUMP_AGE=2 # If dump files older than this number in days are found, report critical state
export MIN_DUMP_SIZE_BYTES=500 # If dump files smaller than this are found, report critical state
db_dump_count() {
cd $MY_BACKUP_DIR
ls -1 | grep -E 'sql.(xz|bz(ip)?2|gz|lzma|zstd)' | cut -d. -f1 | sort -u| wc -l
}
check_dump_count() {
local db_dump_count_age
local current_dump_count
local saved_dump_count
local now="$(date +%s)"
DB_DUMP_COUNT_CHECK=0
DB_DUMP_COUNT_DIFF=0
# regenerate current db dump count once a week
if [ -f $MY_CHECK_DIR/db_dump_count ] ; then
db_dump_count_age=$(stat -c "%Y" $MY_CHECK_DIR/db_dump_count)
if [ $(( $db_dump_count_age + $MAX_DUMP_COUNT_FILE_AGE * 86400 )) -lt $now ] ;then
# regenerating too old db dump count file
db_dump_count >$MY_CHECK_DIR/db_dump_count
return 0 # no use to check if file has just been generated
fi
else
# create so for non-existent db dump count file
db_dump_count >$MY_CHECK_DIR/db_dump_count
return 0 # no use to check if file has just been generated
fi
current_dump_count=$(db_dump_count)
saved_dump_count=$(cat $MY_CHECK_DIR/db_dump_count)
diff=$(( $current_dump_count - $saved_dump_count ))
diff=${diff#-}
DB_DUMP_COUNT_DIFF=$diff
DB_DUMP_COUNT_CHECK=1
if [ $diff -le $MAX_DUMP_COUNT_DIFFERENCE ] ; then
DB_DUMP_COUNT_CHECK=0
fi
}
check_backups_age() {
# check if any dump file is too old
local nr_old_dumps
cd $MY_BACKUP_DIR
nr_old_dumps=$(find . -maxdepth 1 -name "*.sql.*" -mtime +$MAX_DUMP_AGE 2>&1 | wc -l)
DB_DUMP_AGE_CHECK=1
DB_DUMP_AGE_CHECK_NR_OLD_DUMPS=$nr_old_dumps
if [ $nr_old_dumps -eq 0 ] ;then
DB_DUMP_AGE_CHECK=0
fi
}
check_dump_size() {
# check if any dump file is smaller than a certain size
local nr_too_small_dumps
cd $MY_BACKUP_DIR
nr_too_small_dumps="$(find . -maxdepth 1 -name "*.sql.*" -size -${MIN_DUMP_SIZE_BYTES}c | wc -l)"
DB_DUMP_SIZE_CHECK=1
DB_DUMP_SIZE_CHECK_COUNT=$nr_too_small_dumps
if [ $nr_too_small_dumps -eq 0 ] ;then
DB_DUMP_SIZE_CHECK=0
fi
}
main() {
# abort if backup directory does not exist
[ -d $MYSQL_BACKUP_DIR ] || return
[ -d $MY_CHECK_DIR ] || mkdir -p $MY_CHECK_DIR
check_dump_count
check_backups_age
check_dump_size
CHECK_MARKER[0]=""
CHECK_MARKER[1]="(!)"
CHECK_STATE=1
if [ $DB_DUMP_COUNT_CHECK -eq 0 -a $DB_DUMP_AGE_CHECK -eq 0 -a $DB_DUMP_SIZE_CHECK -eq 0 ] ; then
CHECK_STATE=0
CHECK_TEXT="Mysql DB-Dump-Pruefungen ohne Fehler"
else
CHECK_TEXT="Mysql DB-Dump-Pruefungen weisen Fehler auf: Anzahl Abweichender DB-Dumps: $DB_DUMP_COUNT_DIFF${CHECK_MARKER[$DB_DUMP_COUNT_CHECK]}. Anzahl zu alter Dump-Dateien: $DB_DUMP_AGE_CHECK_NR_OLD_DUMPS${CHECK_MARKER[$DB_DUMP_AGE_CHECK]}. Anzahl zu kleiner DB-Dump-Dateien: $DB_DUMP_SIZE_CHECK_COUNT${CHECK_MARKER[$DB_DUMP_SIZE_CHECK_COUNT]}."
fi
echo "$CHECK_STATE mysql_backup_check - $CHECK_TEXT"
#printf "DB_DUMP_COUNT_CHECK %1d DIFFERENCE %3d\n" "$DB_DUMP_COUNT_CHECK" "$DB_DUMP_COUNT_DIFF"
#printf "DB_DUMP_AGE_CHECK %1d NR_TOO_OLD_DUMPS %3d\n" "$DB_DUMP_AGE_CHECK" "$DB_DUMP_AGE_CHECK_NR_OLD_DUMPS"
#printf "DB_DUMP_SIZE_CHECK %1d NR_TOO_SMALL_DUMPS %3d\n" "$DB_DUMP_SIZE_CHECK" "$DB_DUMP_SIZE_CHECK_COUNT"
}
main