Inhaltsverzeichnis
MariaDB Backup ArchLinux - Backup Skripte
Diese Dokumentation ist nach einem „persönlichen“ Workshop von: mit dem Referenten Oli Sennhauser entstanden. Hier noch einmal meinen Dank für die Informationen. |
HINWEIS - Die nachfolgenden Backup-Skripte setzen eine lauffähige Installation von MariaDB voraus, wie unter nachfolgendem internen Link beschrieben !!!
MariaDB ist ein Open-Source-Datenbank-Server.
MariaDB wird von The MariaDB Foundation entwickelt.
Beschreibung | Externer Link |
---|---|
Homepage | MariaDB |
Dokumentation | MariaDB Dokumentation |
Ab hier werden root
-Rechte zur Ausführung der nachfolgenden Befehle benötigt. Um root
zu werden geben Sie bitte folgenden Befehl ein:
$ su - Password:
Backup:
Skript: mariadb_dump_backup_full.sh
Nachfolgendes Skript ermöglichen die Erstellung einer *.tar.gz-Datei
- pro Tag eine eigene *.tar.gz-Datei
- auf Dateiebene
- mit konfigurierbaren Parametern
- und automatischer Löschung von älteren Sicherungsdateien
- und Erstellung einer fortlaufenden Log-Datei unter
/var/log/
Nachfolgende Parameter sind in der aktuellen Version konfigurierbar: (Nur relevanter Ausschnitt)
... ############################################################################## # >>> Please edit following lines for personal settings and custom usages. ! # ############################################################################## # CUSTOM - Script-Name. SCRIPT_NAME="mariadb_dump_backup_full" # CUSTOM - Backup-Files. DIR_BACKUP="/var/lib/mariadb/data.backup/mariadb_dump_backup_full" FILE_BACKUP="mariadb_dump_backup_full_$(date '+%Y%m%d_%H%M%S').sql" FILE_DELETE="*.tar.gz" BACKUPFILES_DELETE=7 # CUSTOM - mysqldump Parameter. DUMP_HOST='127.0.0.1' DUMP_USER='root' DUMP_PASS='geheim' # CUSTOM - Binary-Logging active. Example: ('Y'(my.cnf|log_bin=bin-log), 'N') DUMP_BIN_LOG_ACTIVE="N" # CUSTOM - Depends on the database engine. Example: ('Y'(MyISAM), 'N'(InnoDB)) DUMP_LOCK_ALL_TABLE="Y" # CUSTOM - Mail-Recipient. MAIL_RECIPIENT="you@example.com" # CUSTOM - Status-Mail [Y|N]. MAIL_STATUS="N" ############################################################################## # >>> Normaly there is no need to change anything below this comment line. ! # ############################################################################## ...
Parametername | Beschreibung |
---|---|
SCRIPT_NAME | Name des Skriptes |
DIR_BACKUP | Verzeichnis in dem die Backup-Dateien erstellt werden sollen |
FILE_BACKUP | Allgemeiner Teil der Bezeichnung für die Backup-Dateien |
FILE_DELETE | Endung zur Löschung von älteren Archivdateien |
BACKUPFILES_DELETE | Anzahl der Backup-Dateien pro Benutzer die gespeichert bleiben sollen |
DUMP_BIN_LOG_ACTIVE | Angabe ob beim Backup-Prozesses ein –master-data=1 –flush-logs berücksichtigt werden soll |
DUMP_LOCK_ALL_TABLE | Angabe ob beim Backup-Prozesses ein –lock-all-tables durchgeführt werden soll |
#!/bin/bash ############################################################################## # Script-Name : mariadb_dump_backup_full.sh # # Description : Script to backup the --all-databases of a MariaDB. # # On successful execution only a LOG file will be written. # # On error while execution, a LOG file and a error message # # will be send by e-mail. # # # # Last update : 01.11.2023 # # Version : 1.00 # # # # Author : Klaus Tachtler, <klaus@tachtler.net> # # DokuWiki : http://www.dokuwiki.tachtler.net # # Homepage : http://www.tachtler.net # # # # +----------------------------------------------------------------------+ # # | This program is free software; you can redistribute it and/or modify | # # | it under the terms of the GNU General Public License as published by | # # | the Free Software Foundation; either version 2 of the License, or | # # | (at your option) any later version. | # # +----------------------------------------------------------------------+ # # # # Copyright (c) 2023 by Klaus Tachtler. # # # ############################################################################## ############################################################################## # H I S T O R Y # ############################################################################## # -------------------------------------------------------------------------- # # Version : x.xx # # Description : <Description> # # -------------------------------------------------------------------------- # # -------------------------------------------------------------------------- # # Version : x.xx # # Description : <Description> # # -------------------------------------------------------------------------- # ############################################################################## ############################################################################## # >>> Please edit following lines for personal settings and custom usages. ! # ############################################################################## # CUSTOM - Script-Name. SCRIPT_NAME="mariadb_dump_backup_full" # CUSTOM - Backup-Files. DIR_BACKUP="/var/lib/mariadb/data.backup/mariadb_dump_backup_full" FILE_BACKUP="mariadb_dump_backup_full_$(date '+%Y%m%d_%H%M%S').sql" FILE_DELETE="*.tar.gz" BACKUPFILES_DELETE=7 # CUSTOM - mysqldump Parameter. DUMP_HOST='127.0.0.1' DUMP_USER='root' DUMP_PASS='geheim' # CUSTOM - Binary-Logging active. Example: ('Y'(my.cnf|log_bin=bin-log), 'N') DUMP_BIN_LOG_ACTIVE="N" # CUSTOM - Depends on the database engine. Example: ('Y'(MyISAM), 'N'(InnoDB)) DUMP_LOCK_ALL_TABLE="Y" # CUSTOM - Mail-Recipient. MAIL_RECIPIENT="you@example.com" # CUSTOM - Status-Mail [Y|N]. MAIL_STATUS="N" ############################################################################## # >>> Normaly there is no need to change anything below this comment line. ! # ############################################################################## # Variables. MARIADB_DUMP_COMMAND=$(command -v mariadb-dump) TAR_COMMAND=$(command -v tar) TOUCH_COMMAND=$(command -v touch) RM_COMMAND=$(command -v rm) PROG_SENDMAIL=$(command -v sendmail) CAT_COMMAND=$(command -v cat) DATE_COMMAND=$(command -v date) MKDIR_COMMAND=$(command -v mkdir) FIND_COMMAND=$(command -v find) SORT_COMMAND=$(command -v sort) HEAD_COMMAND=$(command -v head) CUT_COMMAND=$(command -v cut) FILE_LOCK='/tmp/'$SCRIPT_NAME'.lock' FILE_LOG='/var/log/'$SCRIPT_NAME'.log' FILE_LAST_LOG='/tmp/'$SCRIPT_NAME'.log' FILE_MAIL='/tmp/'$SCRIPT_NAME'.mail' VAR_HOSTNAME=$(uname -n) VAR_SENDER="root@"$VAR_HOSTNAME VAR_EMAILDATE=$($DATE_COMMAND '+%a, %d %b %Y %H:%M:%S (%Z)') # Functions. function log() { echo "$1" echo "$($DATE_COMMAND '+%Y/%m/%d %H:%M:%S') INFO:" "$1" >> "${FILE_LAST_LOG}" } function retval() { rc=$? if [ $rc != "0" ]; then case $rc in *) log "ERROR: Unknown error $rc" ;; esac fi } function movelog() { $CAT_COMMAND "$FILE_LAST_LOG" >> "$FILE_LOG" $RM_COMMAND -f "$FILE_LAST_LOG" $RM_COMMAND -f "$FILE_LOCK" } function sendmail() { case "$1" in 'STATUS') MAIL_SUBJECT='Status execution '$SCRIPT_NAME' script.' ;; *) MAIL_SUBJECT='ERROR while execution '$SCRIPT_NAME' script !!!' ;; esac $CAT_COMMAND <<MAIL > "$FILE_MAIL" Subject: $MAIL_SUBJECT Date: $VAR_EMAILDATE From: $VAR_SENDER To: $MAIL_RECIPIENT MAIL $CAT_COMMAND "$FILE_LAST_LOG" >> "$FILE_MAIL" $PROG_SENDMAIL -f "$VAR_SENDER" -t "$MAIL_RECIPIENT" < "$FILE_MAIL" $RM_COMMAND -f "$FILE_MAIL" } function error () { # Parameters. CODE_ERROR="$1" sendmail ERROR movelog exit "$CODE_ERROR" } function headerblock () { # Parameters. TEXT_INPUT="$1" LINE_COUNT=68 # Help variables. WORD_COUNT=${#TEXT_INPUT} CHAR_AFTER=$((LINE_COUNT - WORD_COUNT - 5)) LINE_SPACE=$((LINE_COUNT - 3)) # Format placeholder. if [ "$CHAR_AFTER" -lt "0" ]; then CHAR_AFTER="0" fi printf -v char '%*s' "$CHAR_AFTER" '' printf -v line '%*s' "$LINE_SPACE" '' log "+${line// /-}+" log "| $TEXT_INPUT${char// /.} |" log "+${line// /-}+" } function logline () { # Parameters. TEXT_INPUT="$1" TRUE_FALSE="$2" LINE_COUNT=68 # Help variables. WORD_COUNT=${#TEXT_INPUT} CHAR_AFTER=$((LINE_COUNT - WORD_COUNT - 9)) # Format placeholder. if [ "$CHAR_AFTER" -lt "0" ]; then CHAR_AFTER="0" fi printf -v char '%*s' "$CHAR_AFTER" '' if [ "$TRUE_FALSE" == "true" ]; then log "$TEXT_INPUT${char// /.}[ OK ]" else log "$TEXT_INPUT${char// /.}[FAILED]" fi } function checkcommand () { # Parameters. CHECK_COMMAND="$1" if [ ! -s "$1" ]; then logline "Check if command '$CHECK_COMMAND' was found " false error 10 else logline "Check if command '$CHECK_COMMAND' was found " true fi } # Main. log "" headerblock "Start backup of --all-databases of database server" log "" log "Run script with following parameter:" log "" log "SCRIPT_NAME...: $SCRIPT_NAME" log "" log "DIR_BACKUP....: $DIR_BACKUP" log "" log "MAIL_RECIPIENT: $MAIL_RECIPIENT" log "MAIL_STATUS...: $MAIL_STATUS" log "" # Check if command (file) NOT exist OR IS empty. checkcommand "$MARIADB_DUMP_COMMAND" checkcommand "$TAR_COMMAND" checkcommand "$TOUCH_COMMAND" checkcommand "$RM_COMMAND" checkcommand "$CAT_COMMAND" checkcommand "$DATE_COMMAND" checkcommand "$MKDIR_COMMAND" checkcommand "$FIND_COMMAND" checkcommand "$SORT_COMMAND" checkcommand "$HEAD_COMMAND" checkcommand "$CUT_COMMAND" checkcommand "$PROG_SENDMAIL" # Check if LOCK file NOT exist. if [ ! -e "$FILE_LOCK" ]; then logline "Check if script is NOT already runnig " true $TOUCH_COMMAND "$FILE_LOCK" else logline "Check if script is NOT already runnig " false log "" log "ERROR: The script was already running, or LOCK file already exists!" log "" error 20 fi # Check if DIR_BACKUP Directory NOT exists. if [ ! -d "$DIR_BACKUP" ]; then logline "Check if DIR_BACKUP exists " false $MKDIR_COMMAND -p "$DIR_BACKUP" logline "DIR_BACKUP was now created " true else logline "Check if DIR_BACKUP exists " true fi # Start backup. log "" headerblock "Run backup $SCRIPT_NAME " log "" # Start backup process via mysqldump. cd "$DIR_BACKUP" || exit if [ $DUMP_LOCK_ALL_TABLE = 'Y' ]; then DUMP_LOCK_ALL_TABLE='--lock-all-tables' else DUMP_LOCK_ALL_TABLE='--single-transaction' fi if [ $DUMP_BIN_LOG_ACTIVE = 'Y' ]; then log "Dump data with bin-log data ..." $MARIADB_DUMP_COMMAND --host=$DUMP_HOST --user=$DUMP_USER --password="$DUMP_PASS" --all-databases --flush-privileges "$DUMP_LOCK_ALL_TABLE" --master-data=1 --flush-logs --triggers --routines --events --hex-blob > "$FILE_BACKUP" else log "Dump data ..." $MARIADB_DUMP_COMMAND --host=$DUMP_HOST --user=$DUMP_USER --password="$DUMP_PASS" --all-databases --flush-privileges "$DUMP_LOCK_ALL_TABLE" --triggers --routines --events --hex-blob > "$FILE_BACKUP" fi log "" log "Packaging to archive ..." $TAR_COMMAND -cvzf "$FILE_BACKUP.tar.gz" "$FILE_BACKUP" --atime-preserve --preserve-permissions log "" log "Delete archive files ..." $FIND_COMMAND . -type f -name "$FILE_DELETE" -printf '%T@\t%p\n' | $SORT_COMMAND -t $'\t' -g | $HEAD_COMMAND -n -"$BACKUPFILES_DELETE" | $CUT_COMMAND -d $'\t' -f 2- | xargs -r "$RM_COMMAND" rc=$? if [ $rc != "0" ]; then logline "Delete old archive files $DIR_BACKUP " false else logline "Delete old archive files $DIR_BACKUP " true fi log "" log "Delete dumpfile ..." $RM_COMMAND "$FILE_BACKUP" # Delete LOCK file. rc=$? if [ $rc != "0" ]; then retval $rc log "" $RM_COMMAND -f "$FILE_LOCK" error 99 else log "" headerblock "End backup $SCRIPT_NAME " log "" fi # Finish syncing. log "Finish" log "" # Status e-mail. if [ "$MAIL_STATUS" = 'Y' ]; then sendmail STATUS fi # Move temporary log to permanent log movelog exit 0
Skript - Log: mariadb_ldump_backup_ful
Nachfolgende Log-Datei entsteht im Verzeichnis
/var/log/
- hier z.B./var/log/mariadb_dump_backup_full.sh.log
+-----------------------------------------------------------------+ | Start backup of --all-databases of database server............. | +-----------------------------------------------------------------+ Run script with following parameter: SCRIPT_NAME...: mariadb_dump_backup_full DIR_BACKUP....: /var/lib/mariadb/data.backup/mariadb_dump_backup_full MAIL_RECIPIENT: you@example.com MAIL_STATUS...: N Check if command '/usr/bin/mariadb-dump' was found ........[ OK ] Check if command '/usr/bin/tar' was found .................[ OK ] Check if command '/usr/bin/touch' was found ...............[ OK ] Check if command '/usr/bin/rm' was found ..................[ OK ] Check if command '/usr/bin/cat' was found .................[ OK ] Check if command '/usr/bin/date' was found ................[ OK ] Check if command '/usr/bin/mkdir' was found ...............[ OK ] Check if command '/usr/bin/find' was found ................[ OK ] Check if command '/usr/bin/sort' was found ................[ OK ] Check if command '/usr/bin/head' was found ................[ OK ] Check if command '/usr/bin/cut' was found .................[ OK ] Check if command '/usr/bin/sendmail' was found.............[ OK ] Check if script is NOT already runnig .....................[ OK ] Check if DIR_BACKUP exists ................................[ OK ] +-----------------------------------------------------------------+ | Run backup mariadb_dump_backup_full ........................... | +-----------------------------------------------------------------+ Dump data ... Packaging to archive ... mariadb_dump_backup_full_20231103_073005.sql Delete archive files ... Delete old archive files /var/lib/mariadb/data.backup/mariadb_dump_backup_full [ OK ] Delete dumpfile ... +-----------------------------------------------------------------+ | End backup mariadb_dump_backup_full ........................... | +-----------------------------------------------------------------+ Finish
Skript: mariadb_dump_backup_schema.sh
Nachfolgendes Skript ermöglichen die Erstellung einer *.tar.gz-Datei
- pro Tag und
schema
eine eigene *.tar.gz-Datei- Nachfolgende
schema
werden dabei nicht gesichert:information_schema
performance_schema
sys
- auf Dateiebene
- mit konfigurierbaren Parametern
- und automatischer Löschung von älteren Sicherungsdateien
- und Erstellung einer fortlaufenden Log-Datei unter
/var/log/
Nachfolgende Parameter sind in der aktuellen Version konfigurierbar: (Nur relevanter Ausschnitt)
############################################################################## # >>> Please edit following lines for personal settings and custom usages. ! # ############################################################################## # CUSTOM - Script-Name. SCRIPT_NAME="mariadb_dump_backup_schema" # CUSTOM - Backup-Files. DIR_BACKUP="/var/lib/mariadb/data.backup/mariadb_dump_backup_schema" FILE_BACKUP="mariadb_dump_backup_schema_$(date '+%Y%m%d_%H%M%S').sql" FILE_DELETE="*.tar.gz" BACKUPFILES_DELETE=7 # CUSTOM - mysqldump Parameter. DUMP_HOST='127.0.0.1' DUMP_USER='root' DUMP_PASS='geheim' # CUSTOM - Binary-Logging active. Example: ('Y'(my.cnf|log_bin=bin-log), 'N') DUMP_BIN_LOG_ACTIVE="N" # CUSTOM - Depends on the database engine. Example: ('Y'(MyISAM), 'N'(InnoDB)) DUMP_LOCK_ALL_TABLE="Y" # CUSTOM - Mail-Recipient. MAIL_RECIPIENT="root@tachtler.net" # CUSTOM - Status-Mail [Y|N]. MAIL_STATUS="N" ############################################################################## # >>> Normaly there is no need to change anything below this comment line. ! # ##############################################################################
Parametername | Beschreibung |
---|---|
SCRIPT_NAME | Name des Skriptes |
DIR_BACKUP | Verzeichnis in dem die Backup-Dateien erstellt werden sollen |
FILE_BACKUP | Allgemeiner Teil der Bezeichnung für die Backup-Dateien |
FILE_DELETE | Endung zur Löschung von älteren Archivdateien |
BACKUPFILES_DELETE | Anzahl der Backup-Dateien pro Benutzer die gespeichert bleiben sollen |
DUMP_BIN_LOG_ACTIVE | Angabe ob beim Backup-Prozesses ein –master-data=1 –flush-logs berücksichtigt werden soll |
DUMP_LOCK_ALL_TABLE | Angabe ob beim Backup-Prozesses ein –lock-all-tables durchgeführt werden soll |
#!/bin/bash ############################################################################## # Script-Name : mariadb_dump_backup_schema.sh # # Description : Script to backup the --all-databases of a MariaDB. # # On successful execution only a LOG file will be written. # # On error while execution, a LOG file and a error message # # will be send by e-mail. # # # # Last update : 01.11.2023 # # Version : 1.00 # # # # Author : Klaus Tachtler, <klaus@tachtler.net> # # DokuWiki : http://www.dokuwiki.tachtler.net # # Homepage : http://www.tachtler.net # # # # +----------------------------------------------------------------------+ # # | This program is free software; you can redistribute it and/or modify | # # | it under the terms of the GNU General Public License as published by | # # | the Free Software Foundation; either version 2 of the License, or | # # | (at your option) any later version. | # # +----------------------------------------------------------------------+ # # # # Copyright (c) 2023 by Klaus Tachtler. # # # ############################################################################## ############################################################################## # H I S T O R Y # ############################################################################## # -------------------------------------------------------------------------- # # Version : x.xx # # Description : <Description> # # -------------------------------------------------------------------------- # # -------------------------------------------------------------------------- # # Version : x.xx # # Description : <Description> # # -------------------------------------------------------------------------- # ############################################################################## ############################################################################## # >>> Please edit following lines for personal settings and custom usages. ! # ############################################################################## # CUSTOM - Script-Name. SCRIPT_NAME="mariadb_dump_backup_schema" # CUSTOM - Backup-Files. DIR_BACKUP="/var/lib/mariadb/data.backup/mariadb_dump_backup_schema" FILE_BACKUP="mariadb_dump_backup_schema_$(date '+%Y%m%d_%H%M%S').sql" FILE_DELETE="*.tar.gz" BACKUPFILES_DELETE=7 # CUSTOM - mysqldump Parameter. DUMP_HOST='127.0.0.1' DUMP_USER='root' DUMP_PASS='geheim' # CUSTOM - Binary-Logging active. Example: ('Y'(my.cnf|log_bin=bin-log), 'N') DUMP_BIN_LOG_ACTIVE="N" # CUSTOM - Depends on the database engine. Example: ('Y'(MyISAM), 'N'(InnoDB)) DUMP_LOCK_ALL_TABLE="Y" # CUSTOM - Mail-Recipient. MAIL_RECIPIENT="root@tachtler.net" # CUSTOM - Status-Mail [Y|N]. MAIL_STATUS="N" ############################################################################## # >>> Normaly there is no need to change anything below this comment line. ! # ############################################################################## # Variables. MARIADB_COMMAND=$(command -v mariadb) MARIADB_DUMP_COMMAND=$(command -v mariadb-dump) TAR_COMMAND=$(command -v tar) TOUCH_COMMAND=$(command -v touch) RM_COMMAND=$(command -v rm) PROG_SENDMAIL=$(command -v sendmail) CAT_COMMAND=$(command -v cat) DATE_COMMAND=$(command -v date) MKDIR_COMMAND=$(command -v mkdir) GREP_COMMAND=$(command -v grep) SED_COMMAND=$(command -v sed) FIND_COMMAND=$(command -v find) SORT_COMMAND=$(command -v sort) HEAD_COMMAND=$(command -v head) CUT_COMMAND=$(command -v cut) FILE_LOCK='/tmp/'$SCRIPT_NAME'.lock' FILE_LOG='/var/log/'$SCRIPT_NAME'.log' FILE_LAST_LOG='/tmp/'$SCRIPT_NAME'.log' FILE_MAIL='/tmp/'$SCRIPT_NAME'.mail' VAR_HOSTNAME=$(uname -n) VAR_SENDER="root@"$VAR_HOSTNAME VAR_EMAILDATE=$($DATE_COMMAND '+%a, %d %b %Y %H:%M:%S (%Z)') # Functions. function log() { echo "$1" echo "$($DATE_COMMAND '+%Y/%m/%d %H:%M:%S') INFO:" "$1" >> "${FILE_LAST_LOG}" } function retval() { rc=$? if [ $rc != "0" ]; then case $rc in *) log "ERROR: Unknown error $rc" ;; esac fi } function movelog() { $CAT_COMMAND "$FILE_LAST_LOG" >> "$FILE_LOG" $RM_COMMAND -f "$FILE_LAST_LOG" $RM_COMMAND -f "$FILE_LOCK" } function sendmail() { case "$1" in 'STATUS') MAIL_SUBJECT='Status execution '$SCRIPT_NAME' script.' ;; *) MAIL_SUBJECT='ERROR while execution '$SCRIPT_NAME' script !!!' ;; esac $CAT_COMMAND <<MAIL > "$FILE_MAIL" Subject: $MAIL_SUBJECT Date: $VAR_EMAILDATE From: $VAR_SENDER To: $MAIL_RECIPIENT MAIL $CAT_COMMAND "$FILE_LAST_LOG" >> "$FILE_MAIL" $PROG_SENDMAIL -f "$VAR_SENDER" -t "$MAIL_RECIPIENT" < "$FILE_MAIL" $RM_COMMAND -f "$FILE_MAIL" } function error () { # Parameters. CODE_ERROR="$1" sendmail ERROR movelog exit "$CODE_ERROR" } function headerblock () { # Parameters. TEXT_INPUT="$1" LINE_COUNT=68 # Help variables. WORD_COUNT=${#TEXT_INPUT} CHAR_AFTER=$((LINE_COUNT - WORD_COUNT - 5)) LINE_SPACE=$((LINE_COUNT - 3)) # Format placeholder. if [ "$CHAR_AFTER" -lt "0" ]; then CHAR_AFTER="0" fi printf -v char '%*s' "$CHAR_AFTER" '' printf -v line '%*s' "$LINE_SPACE" '' log "+${line// /-}+" log "| $TEXT_INPUT${char// /.} |" log "+${line// /-}+" } function logline () { # Parameters. TEXT_INPUT="$1" TRUE_FALSE="$2" LINE_COUNT=68 # Help variables. WORD_COUNT=${#TEXT_INPUT} CHAR_AFTER=$((LINE_COUNT - WORD_COUNT - 9)) # Format placeholder. if [ "$CHAR_AFTER" -lt "0" ]; then CHAR_AFTER="0" fi printf -v char '%*s' "$CHAR_AFTER" '' if [ "$TRUE_FALSE" == "true" ]; then log "$TEXT_INPUT${char// /.}[ OK ]" else log "$TEXT_INPUT${char// /.}[FAILED]" fi } function checkcommand () { # Parameters. CHECK_COMMAND="$1" if [ ! -s "$1" ]; then logline "Check if command '$CHECK_COMMAND' was found " false error 10 else logline "Check if command '$CHECK_COMMAND' was found " true fi } # Main. log "" headerblock "Start backup of --all-databases of database server" log "" log "Run script with following parameter:" log "" log "SCRIPT_NAME...: $SCRIPT_NAME" log "" log "DIR_BACKUP....: $DIR_BACKUP" log "" log "MAIL_RECIPIENT: $MAIL_RECIPIENT" log "MAIL_STATUS...: $MAIL_STATUS" log "" # Check if command (file) NOT exist OR IS empty. checkcommand "$MARIADB_COMMAND" checkcommand "$MARIADB_DUMP_COMMAND" checkcommand "$TAR_COMMAND" checkcommand "$TOUCH_COMMAND" checkcommand "$RM_COMMAND" checkcommand "$CAT_COMMAND" checkcommand "$DATE_COMMAND" checkcommand "$MKDIR_COMMAND" checkcommand "$GREP_COMMAND" checkcommand "$SED_COMMAND" checkcommand "$FIND_COMMAND" checkcommand "$SORT_COMMAND" checkcommand "$HEAD_COMMAND" checkcommand "$CUT_COMMAND" checkcommand "$PROG_SENDMAIL" # Check if LOCK file NOT exist. if [ ! -e "$FILE_LOCK" ]; then logline "Check if script is NOT already runnig " true $TOUCH_COMMAND "$FILE_LOCK" else logline "Check if script is NOT already runnig " false log "" log "ERROR: The script was already running, or LOCK file already exists!" log "" error 20 fi # Check if DIR_BACKUP Directory NOT exists. if [ ! -d "$DIR_BACKUP" ]; then logline "Check if DIR_BACKUP exists " false $MKDIR_COMMAND -p "$DIR_BACKUP" logline "DIR_BACKUP was now created " true else logline "Check if DIR_BACKUP exists " true fi # Start backup. log "" headerblock "Run backup $SCRIPT_NAME " log "" # Start backup process via mysqldump. cd "$DIR_BACKUP" || exit if [ $DUMP_LOCK_ALL_TABLE = 'Y' ]; then DUMP_LOCK_ALL_TABLE='--lock-all-tables' else DUMP_LOCK_ALL_TABLE='--single-transaction' fi DBBACKUP=0 for DBCOUNT in $($MARIADB_COMMAND --user=$DUMP_USER --password="$DUMP_PASS" --execute='show databases \G' | $GREP_COMMAND -i Database: | $GREP_COMMAND -v -e information_schema -e performance_schema -e sys | $SED_COMMAND 's/Database:\ //'); do ((DBBACKUP++)) done for DB in $($MARIADB_COMMAND --user=$DUMP_USER --password="$DUMP_PASS" --execute='show databases \G' | $GREP_COMMAND -i Database: | $GREP_COMMAND -v -e information_schema -e performance_schema -e sys | $SED_COMMAND 's/Database:\ //'); do if [ $DUMP_BIN_LOG_ACTIVE = 'Y' ]; then log "Dump data with bin-log data ..." log "$DB-$FILE_BACKUP" $MARIADB_DUMP_COMMAND --host=$DUMP_HOST --user=$DUMP_USER --password="$DUMP_PASS" --databases "$DB" --flush-privileges $DUMP_LOCK_ALL_TABLE --master-data=1 --triggers --routines --events --hex-blob --quick > "$DB-$FILE_BACKUP" else log "Dump data ..." log "$DB-$FILE_BACKUP" $MARIADB_DUMP_COMMAND --host=$DUMP_HOST --user=$DUMP_USER --password="$DUMP_PASS" --databases "$DB" --flush-privileges $DUMP_LOCK_ALL_TABLE --triggers --routines --events --hex-blob --quick > "$DB-$FILE_BACKUP" fi log "" log "Packaging to archive ..." $TAR_COMMAND -cvzf "$DB-$FILE_BACKUP.tar.gz" "$DB-$FILE_BACKUP" --atime-preserve --preserve-permissions log "" log "Delete archive files ..." $FIND_COMMAND . -type f -name "$FILE_DELETE" -printf '%T@\t%p\n' | $SORT_COMMAND -t $'\t' -g | $HEAD_COMMAND -n -$((BACKUPFILES_DELETE * DBBACKUP)) | $CUT_COMMAND -d $'\t' -f 2- | xargs -r "$RM_COMMAND" rc="$?" if [ $rc != "0" ]; then logline "Delete old archive files $DIR_BACKUP " false else logline "Delete old archive files $DIR_BACKUP " true fi log "" log "Delete dumpfile ..." $RM_COMMAND "$DB-$FILE_BACKUP" done # Delete LOCK file. rc=$? if [ $rc != "0" ]; then retval $rc log "" $RM_COMMAND -f "$FILE_LOCK" error 99 else log "" headerblock "End backup $SCRIPT_NAME " log "" fi # Finish syncing. log "Finish" log "" # Status e-mail. if [ "$MAIL_STATUS" = 'Y' ]; then sendmail STATUS fi # Move temporary log to permanent log movelog exit 0
Skript - Log: mariadb_dump_backup_schema
Nachfolgende Log-Datei entsteht im Verzeichnis
/var/log/
- hier z.B./var/log/mariadb_dump_backup_schema.sh.log
+-----------------------------------------------------------------+ | Start backup of --all-databases of database server............. | +-----------------------------------------------------------------+ Run script with following parameter: SCRIPT_NAME...: mariadb_dump_backup_schema DIR_BACKUP....: /var/lib/mariadb/data.backup/mariadb_dump_backup_schema MAIL_RECIPIENT: you@example.com MAIL_STATUS...: N Check if command '/usr/bin/mariadb' was found .............[ OK ] Check if command '/usr/bin/mariadb-dump' was found ........[ OK ] Check if command '/usr/bin/tar' was found .................[ OK ] Check if command '/usr/bin/touch' was found ...............[ OK ] Check if command '/usr/bin/rm' was found ..................[ OK ] Check if command '/usr/bin/cat' was found .................[ OK ] Check if command '/usr/bin/date' was found ................[ OK ] Check if command '/usr/bin/mkdir' was found ...............[ OK ] Check if command '/usr/bin/grep' was found ................[ OK ] Check if command '/usr/bin/sed' was found .................[ OK ] Check if command '/usr/bin/find' was found ................[ OK ] Check if command '/usr/bin/sort' was found ................[ OK ] Check if command '/usr/bin/head' was found ................[ OK ] Check if command '/usr/bin/cut' was found .................[ OK ] Check if command '/usr/bin/sendmail' was found ............[ OK ] Check if script is NOT already runnig .....................[ OK ] Check if DIR_BACKUP exists ................................[ OK ] +-----------------------------------------------------------------+ | Run backup mariadb_dump_backup_schema ......................... | +-----------------------------------------------------------------+ Dump data ... mysql-mariadb_dump_backup_schema_20231103_074112.sql Packaging to archive ... mysql-mariadb_dump_backup_schema_20231103_074112.sql Delete archive files ... Delete old archive files /var/lib/mariadb/data.backup/mariadb_dump_backup_schema [ OK ] Delete dumpfile ... Dump data ... phpmyadmin-mariadb_dump_backup_schema_20231103_074112.sql Packaging to archive ... phpmyadmin-mariadb_dump_backup_schema_20231103_074112.sql Delete archive files ... Delete old archive files /var/lib/mariadb/data.backup/mariadb_dump_backup_schema [ OK ] Delete dumpfile ... +-----------------------------------------------------------------+ | End backup mariadb_dump_backup_schema ......................... | +-----------------------------------------------------------------+ Finish
Skripte - Logrotate
Damit die LOG-Datei des Skriptes nicht ins unendliche wächst, sollte diese ebenfalls, wie auch die Log-Dateien von hier z.B. MariaDB selbst, rotiert werden.
Um die LOG-Dateien des Skriptes ebenfalls wie die LOG-Dateien von hier z.B. MariaDB selbst zu rotieren ist nachfolgende Ergänzung in der Konfigurationsdatei
/etc/logrotate.d/mariadb_dump_backup_full.sh
/etc/logrotate.d/mariadb_dump_backup_schema.sh
erforderlich:
/etc/logrotate.d/mariadb_dump_backup_full.sh
(Komplette Konfigurationsdatei)
/var/log/mariadb_dump_backup_full.sh.log { weekly rotate 4 compress delaycompress missingok notifempty }
/etc/logrotate.d/mariadb_dump_backup_schema.sh
(Komplette Konfigurationsdatei)
/var/log/mariadb_dump_backup_schema.sh.log { weekly rotate 4 compress delaycompress missingok notifempty }
systemd-Timer-Service
Nachfolgend die systemd-Timer-Service-Datei zur Zeitgesteuerten Ausführung, sind diese wie folgt zu erstellen, sind nachfolgende Konfigurationsdatei
/etc/systemd/system/mariadb_dump_backup_full.sh.service
/etc/systemd/system/mariadb_dump_backup_schema.sh.service
zu erstellen:
/etc/systemd/system/mariadb_dump_backup_full.sh.service
(Komplette Konfigurationsdatei)
[Unit] Description=Run mariadb_dump_backup_full.sh service. [Service] Type=oneshot ExecStart=/usr/local/bin/mariadb_dump_backup_full.sh
/etc/systemd/system/mariadb_dump_backup_schema.sh.service
(Komplette Konfigurationsdatei)
[Unit] Description=Run mariadb_dump_backup_schema.sh service. [Service] Type=oneshot ExecStart=/usr/local/bin/mariadb_dump_backup_schema.sh
systemd-Timer
Nachfolgend die systemd-Timer-Datei zur Zeitgesteuerten Ausführung jeweils ein mal pro Tag um 03:00 Uhr und 03:15 Uhr, sind diese wie folgt zu erstellen, sind nachfolgende Konfigurationsdatei
/etc/systemd/system/mariadb_dump_backup_full.sh.timer
/etc/systemd/system/mariadb_dump_backup_schema.sh.timer
zu erstellen:
/etc/systemd/system/mariadb_dump_backup_full.sh.timer
(Komplette Konfigurationsdatei)
[Unit] Description=Run mariadb_dump_backup_full.sh daily timer. [Timer] OnCalendar=*-*-* 3:00:00 Persistent=true [Install] WantedBy=timers.target
/etc/systemd/system/mariadb_dump_backup_schema.sh.timer
(Komplette Konfigurationsdatei)
[Unit] Description=Run mariadb_dump_backup_schema.sh daily timer. [Timer] OnCalendar=*-*-* 3:15:00 Persistent=true [Install] WantedBy=timers.target
Um den systemd
-Timer-job zu aktivieren, ist nachfolgender Befehl erforderlich:
# systemctl enable mariadb_dump_backup_full.sh.timer Created symlink /etc/systemd/system/timers.target.wants/mariadb_dump_backup_full.sh.timer → /etc/systemd/system/mariadb_dump_backup_full.sh.timer.
# systemctl enable mariadb_dump_backup_schema.sh.timer Created symlink /etc/systemd/system/timers.target.wants/mariadb_dump_backup_schema.sh.timer → /etc/systemd/system/mariadb_dump_backup_schema.sh.timer.
Falls eine Änderung an einer oder auch beiden systemd
-Timer-job-Konfigurationsdateien durchgeführt wurde, können diese mit nachfolgenden Befehlen übernommen werden:
# systemctl daemon-reload
# systemctl reenable mariadb_dump_backup_full.sh.timer Removed "/etc/systemd/system/timers.target.wants/mariadb_dump_backup_full.sh.timer". Created symlink /etc/systemd/system/timers.target.wants/mariadb_dump_backup_full.sh.timer → /etc/systemd/system/mariadb_dump_backup_full.sh.timer.
# systemctl reenable mariadb_dump_backup_schema.sh.timer Removed "/etc/systemd/system/timers.target.wants/mariadb_dump_backup_schema.sh.timer". Created symlink /etc/systemd/system/timers.target.wants/mariadb_dump_backup_schema.sh.timer → /etc/systemd/system/mariadb_dump_backup_schema.sh.timer.
Eine Auflistung aller systemd
-Timer-jobs, kann mit nachfolgendem Befehl erreicht werden:
# systemctl list-timers --all NEXT LEFT LAST PASSED UNIT ACTIVATES Fri 2023-11-03 10:00:00 CET 23min Fri 2023-11-03 09:00:06 CET 36min ago snapper-timeline.timer snapper-timeline.service Fri 2023-11-03 17:50:49 CET 8h Tue 2023-10-31 19:04:15 CET - man-db.timer man-db.service Sat 2023-11-04 00:00:00 CET 14h Fri 2023-11-03 06:43:15 CET 2h 53min ago logrotate.timer logrotate.service Sat 2023-11-04 00:00:00 CET 14h Fri 2023-11-03 06:43:15 CET 2h 53min ago shadow.timer shadow.service Sat 2023-11-04 03:00:00 CET 17h Fri 2023-11-03 07:03:05 CET 2h 33min ago mariadb_dump_backup_full.sh.timer mariadb_dump_backup_full.sh.service Sat 2023-11-04 03:15:00 CET 17h Fri 2023-11-03 06:43:15 CET 2h 53min ago mariadb_dump_backup_schema.sh.timer mariadb_dump_backup_schema.sh.service Sat 2023-11-04 06:53:16 CET 21h Fri 2023-11-03 06:53:16 CET 2h 43min ago snapper-cleanup.timer snapper-cleanup.service Sat 2023-11-04 06:58:15 CET 21h Fri 2023-11-03 06:58:15 CET 2h 38min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service Mon 2023-11-06 00:00:00 CET 2 days Tue 2023-10-31 14:50:05 CET - paccache.timer paccache.service Sat 2023-11-11 04:41:26 CET 1 week 0 days Tue 2023-10-31 19:04:15 CET - archlinux-keyring-wkd-sync.timer archlinux-keyring-wkd-sync.service 10 timers listed.
Eine Auflistung eines bestimmten systemd
-Timer-jobs, kann mit nachfolgendem Befehl durchgeführt werden:
# systemctl list-timers mariadb_dump_backup_full.sh.timer NEXT LEFT LAST PASSED UNIT ACTIVATES Sat 2023-11-04 03:00:00 CET 17h Fri 2023-11-03 07:03:05 CET 2h 33min ago mariadb_dump_backup_full.sh.timer mariadb_dump_backup_full.sh.service 1 timers listed. Pass --all to see loaded but inactive timers, too.
# systemctl list-timers mariadb_dump_backup_schema.sh.timer NEXT LEFT LAST PASSED UNIT ACTIVATES Sat 2023-11-04 03:15:00 CET 17h Fri 2023-11-03 06:43:15 CET 2h 53min ago mariadb_dump_backup_schema.sh.timer mariadb_dump_backup_schema.sh.service 1 timers listed. Pass --all to see loaded but inactive timers, too.
Der aktuelle Status des systemd
-Timer-jobs, kann wie bei jeder anderen systemd
-Unit auch, wie folgt abgefragt werden:
# systemctl status mariadb_dump_backup_full.sh.timer mariadb_dump_backup_schema.sh.timer ● mariadb_dump_backup_full.sh.timer - Run mariadb_dump_backup_full.sh daily timer. Loaded: loaded (/etc/systemd/system/mariadb_dump_backup_full.sh.timer; enabled; preset: disabled) Active: active (waiting) since Fri 2023-11-03 06:43:14 CET; 2h 54min ago Trigger: Sat 2023-11-04 03:00:00 CET; 17h left Triggers: ● mariadb_dump_backup_full.sh.service Nov 03 06:43:14 vml030 systemd[1]: Started Run mariadb_dump_backup_full.sh daily timer.. ● mariadb_dump_backup_schema.sh.timer - Run mariadb_dump_backup_schema.sh daily timer. Loaded: loaded (/etc/systemd/system/mariadb_dump_backup_schema.sh.timer; enabled; preset: disabled) Active: active (waiting) since Fri 2023-11-03 06:43:14 CET; 2h 54min ago Trigger: Sat 2023-11-04 03:15:00 CET; 17h left Triggers: ● mariadb_dump_backup_schema.sh.service Nov 03 06:43:14 vml030 systemd[1]: Started Run mariadb_dump_backup_schema.sh daily timer..
Auch die entsprechenden systemd
-Journal-Einträge des systemd
-Timer-jobs, kann wie bei jeder anderen systemd
-Unit auch, wie folgt abgefragt werden:
# journalctl -u mariadb_dump_backup_full.sh.timer Nov 03 06:43:14 vml030 systemd[1]: Started Run mariadb_dump_backup_full.sh daily timer..
# journalctl -u mariadb_dump_backup_schema.sh.timer Nov 03 06:43:14 vml030 systemd[1]: Started Run mariadb_dump_backup_schema.sh daily timer..
Recovery
Die Erstellung eines Backups (Sicherung) ist eine Sache, jedoch wie können im Fall eines Datenverlusts, die Daten wiederhergestellt werden.
Entpacken
Nachfolgendes Beispiel zeigt, wie zuerst die im Backup enthaltenen Daten in eine Verzeichnis unterhalb von
/tmp
wiederhergestellt werden können.
Dazu kann mit nachfolgendem Befehl ein Verzeichnis mit dem Namen recovery
unterhalb des Verzeichnisses /tmp
angelegt werden:
# mkdir /tmp/recovery
Anschließend kann dann mit nachfolgendem Befehl die komplette Datenbank/Schema Sicherung wiederhergestellt werden:
Als Beispiel sind hier nachfolgende Gegebenheiten angenommen:
- Das Backup befindet sich unter
/var/lib/mariadb/data.backup
# tar -xvzf /var/lib/mariadb/data.backup/mariadb_dump_backup_full/mariadb_dump_backup_full_20231103_073005.sql.tar.gz -C /tmp/recovery --atime-preserve --preserve-permissions mariadb_dump_backup_full_20231103_073005.sql
Nach erfolgreicher Ausführung des oben gezeigten Befehls, kann mit nachfolgendem Befehl überprüft werden, ob alle Daten aus der Backup-Datei erfolgreich extrahiert werden konnten:
# ls -l /tmp/recovery/ total 2720 -rw-r--r-- 1 root root 2785001 Nov 3 07:30 mariadb_dump_backup_full_20231103_073005.sql
Wiederherstellen
Mit nachfolgendem Befehl, kann die so aus dem Backup entpackte Datei zur Wiederherstellung der Datenbank/Tabelle/Schema wie folgt verwendet werden.
Wobei das Skript
mariadb_dump_backup_full_20231103_073005.sql.tar.gz
→ die Backup-Dateimariadb_dump_backup_full_20231103_073005.sql
und das Skript (hier als Beispiel)
phpmyadmin-mariadb_dump_backup_20231103_073005.sql.tar.gz
→ die Backup-Dateiphpmyadmin-mariadb_dump_backup_20231103_073005.sql
hier die gezeigten Backup-Dateien jeweils in sich trägt.
Egal, ob ein Wiederherstellung aus einem full
, oder schema
-Backup-Datei erfolgt, mit dem nachfolgendem Befehl werden folgende Schritte zur Wiederherstellung durchgeführt:
- Anlage der Datenbank/Tabelle/Schema, (falls dies nicht (mehr) vorhanden sein sollte)
- Nutzung der bezeichneten Datenbank/Tabelle/Schema, welche wiederherstellt werden soll (auch mehrere nacheinander, bei einer
full
-Backup-Datei) - Löschen des Inhalts der Datenbank/Tabelle/Schema, (falls ein Inhalt vorhanden sein sollte)
- Sperren der wiederherzustellenden Datenbank/Tabelle/Schema, während des Wiederherstellungsprozesses
- Wiederherstellung der in der Backup-Datei enthaltenen Daten
- Entsperren der wiederherzustellenden Datenbank/Tabelle/Schema, nach dem Wiederherstellungsprozesse
- Bei der Wiederherstellung aus einer
full
-Backup-Datei, fortsetzen des Prozesses mit der nächsten Datenbank/Tabelle/Schema
Nachfolgender Befehl, führt nun die Wiederehestellung tatsächlich aus.
WICHTIG - Es wird die Kenntnis des root
-Passworts der Datenbank benötigt !!!
(full
)
# /usr/bin/mariadb -h 127.0.0.1 -u root -p < /tmp/recovery/mariadb_dump_backup_full_20231103_073005.sql
bzw.
(schema
)
# /usr/bin/mariadb -h 127.0.0.1 -u root -p < /tmp/recovery/phpmyadmin-mariadb_dump_backup_20231103_073005.sql
Anschliessend befindet sich die Datenbank/Tabelle/Schema auf dem Stand der Backup-Datei.