Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:mariadb_archlinux_-_backup_skripte

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:
      1. information_schema
      2. performance_schema
      3. 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:

  1. 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-Datei
    • mariadb_dump_backup_full_20231103_073005.sql

und das Skript (hier als Beispiel)

  • phpmyadmin-mariadb_dump_backup_20231103_073005.sql.tar.gz → die Backup-Datei
    • phpmyadmin-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:

  1. Anlage der Datenbank/Tabelle/Schema, (falls dies nicht (mehr) vorhanden sein sollte)
  2. Nutzung der bezeichneten Datenbank/Tabelle/Schema, welche wiederherstellt werden soll (auch mehrere nacheinander, bei einer full-Backup-Datei)
  3. Löschen des Inhalts der Datenbank/Tabelle/Schema, (falls ein Inhalt vorhanden sein sollte)
  4. Sperren der wiederherzustellenden Datenbank/Tabelle/Schema, während des Wiederherstellungsprozesses
  5. Wiederherstellung der in der Backup-Datei enthaltenen Daten
  6. Entsperren der wiederherzustellenden Datenbank/Tabelle/Schema, nach dem Wiederherstellungsprozesse
  7. 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.

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
tachtler/mariadb_archlinux_-_backup_skripte.txt · Zuletzt geändert: 2023/11/03 10:00 von klaus