Programm: automysqlbackup prüfung

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Programm: automysqlbackup prüfung

Beitrag von heisenberg » 06.01.2017 18:04:54

Hi,

ich bin gerade dabei ein Script zu schreiben, dass mir die Backups von automysqlbackup prüft.

Gründe
  • Die Dumpdateien können durchaus auch mal kaputt sein.
  • 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).
  • Persönlich will ich nicht dass automysqlbackup mir mails schickt, ich bevorzuge das lieber über das Hauptmonitoring zu machen
Im Moment prüft es
  • Ob automysqlbackup überhaupt läuft
  • Dass die Dumps nicht zu alt sind
  • Dass Dumps vorhanden sind(von allen zu sichernden DBs jeweils der neueste)
  • Gemäss der Laufzeit, ob entsprechende Dumps da sind(Wenn dann das Script über 1 Monat bereits läuft, dann muss auch ein monatlicher Dump da sein)
  • Den Dump an sich(Dateigrösse > 0, Header+Footer wie von einem MySQL-Dump erwartet)
Was es nicht tun soll
  • Berichten das MySQL nicht läuft
  • Die Konsistenz der DB selbst prüfen
  • Mail schicken
Was es tun soll
  • Eine Ausgabe erzeugen mit Status OK/Fehler + Meldung
Das bisherige Script ist hier: https://github.com/megabert/check-mk-pl ... ckup_check

Das drumherum ist im Moment noch nicht so Endbenutzerfreundlich. Im Moment wird lediglich eine Status-Zeile ausgegeben oder nichts, wenn mysql nicht läuft. Zusätzlich noch ein Dump der Statusinformationen.

Für Anmerkungen jeglicher Art bin ich dankbar.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
novalix
Beiträge: 1908
Registriert: 05.10.2005 12:32:57
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: elberfeld

Re: Programm: automysqlbackup prüfung

Beitrag von novalix » 07.01.2017 01:46:01

Sieht interessant aus. Allerdings erscheint mir der corner case recht begrenzt zu sein, den das Programm abdeckt.
heisenberg hat geschrieben: Die Dumpdateien können durchaus auch mal kaputt sein.
Man kann automysqlbackup (oder auch mysqldump) auch in eine Datei loggen lassen. Möglicherweise wäre es einfacher und/oder aussagekräftiger diese Logdatei zu parsen.
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.
Das Wem, Wieviel, Wann, Wozu und Wie zu bestimmen ist aber nicht jedermannns Sache und ist nicht leicht.
Darum ist das Richtige selten, lobenswert und schön.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Programm: automysqlbackup prüfung

Beitrag von heisenberg » 01.01.2023 15:08:01

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: ↑ zum Beitrag ↑
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
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Antworten