diff --git a/conf/restore_database.conf.sample b/conf/restore_database.conf.sample new file mode 100644 index 0000000..66dcdd5 --- /dev/null +++ b/conf/restore_database.conf.sample @@ -0,0 +1,40 @@ +# ---------------------------------------------------- +# - Parameter Settings for Script '.restore_database.sh' +# ---------------------------------------------------- + +# - MySQL / MariaDB / Percona credentials + +# - DATABASE_CREDENTIALS_ARGS +# - +# - Giving password on command line is insecure an sind mysql 5.5 +# - you will get a warning doing so. +# - +# - Reading username/password from file ist also possible, using MySQL/MariaDB +# - commandline parameter '--defaults-file'. +# - +# - Since Version 5.6, that method is considered as insecure. +# - To avoid giving the password on command line, we use an +# - encrypted option file +# - +# - Create (encrypted) option file: +# - $ mysql_config_editor set --login-path=local --socket=/var/run/mysqld/mysqld.sock --user=backup --password +# - $ Password: +# - +# - Use of option file: +# - $ mysql --login-path=local ... +# - +# - Example +# - # MySQL +# - DATABASE_CREDENTIALS_ARGS="--login-path=local" +# - DATABASE_CREDENTIALS_ARGS="--defaults-file=/etc/mysql/debian.cnf" (Debian default) +# - DATABASE_CREDENTIALS_ARGS="--defaults-file=/usr/local/mysql/sys-maint.cnf" +# - +# - # MariaDB 10.4.x +# - DATABASE_CREDENTIALS_ARGS="-u root -S /run/mysqld/mysqld.sock" +# - +# - Note: +# - Script tries to determin database credentials. So it's a good idea, to leave this +# - Parameter empty. Only set it here, if automatic detection failed. +# - +#DATABASE_CREDENTIALS_ARGS="" + diff --git a/restore_database.sh b/restore_database.sh new file mode 100755 index 0000000..fe1e08c --- /dev/null +++ b/restore_database.sh @@ -0,0 +1,1013 @@ +#!/usr/bin/env bash + +CUR_IFS="$IFS" + +script_name="$(basename $(realpath $0))" +working_dir="$(dirname $(realpath $0))" + +conf_file="${working_dir}/conf/${script_name%%.*}.conf" + +log_file="$(mktemp)" + +backup_date=$(date +%Y-%m-%d-%H%M) + +# ============= +# --- Some Variable +# ============= + +# - Give your default values here +# - + +right_tabstop=75 + +DATABASE_SERVER="" +DATABASE_SERVER_NEEDED=true + +DATABASE_NAME="" +DATABASE_NAME_NEEDED=true + +DATABASE_CREDENTIALS_ARGS="" +_DATABASE_CREDENTIALS_ARGS="" +DATABASE_CREDENTIALS_NEEDED=true + +DATABASE_DUMP_FILE="" +DATABASE_DUMP_FILE_NEEDED=true + +BATCH_MODE=false +QUIET_MODE=false +NON_INTERACTIVE_MODE=false + + +# ============= +# --- Some functions +# ============= + +usage() { + + + [[ -n "$1" ]] && error "$1" + + + [[ $terminal ]] && echo -e " +\033[1mUsage:\033[m + + $(basename $0) [OPTION [OPTION .. + + +\033[1mDescription\033[m + + Script restores a database from a database dump file. + + +\033[1mNotice\033[m + + This script was created to restore large databases. The recovery of such databases often takes + a lot of time (often several hours). For a more performant but above all faster recovery, + global variables are changed for the recovery time. This requires extensive rights on the + database server. Please take this into account when specifying the MySQL login information. + + +\033[1mOptions\033[m + + -b + Sets batch mode to true - no interaction will be made. + + -c + A string containing credentials to establish a database connection. This character string + can consist of username and password, but also of login information stored in the file system + or the database itself. + + Example: + + -c "u root -p ''" + -c "--login-path=local" + -c "--defaults-file=/usr/local/mysql/sys-maint.cnf" + -c "-u root -S /run/mysqld/mysqld.sock" + + If this Parameter is omitted, the script tries to detect the right credentials. + + + -d + The name of the database to restore. + + -f + Full qualified Path Name (FQPN) to the Dump file from which the database is to be restored. + + -h + Prints this help. + + + -s + The database server to restore the database to. It is possible to enter an IP address or a host name. + + +\033[1mFiles\033[m + + Configuration file: $conf_file + + +\033[1mExample:\033[m + + Restore database 'cloud_fm' from file '/backup/cl-fm.oopen.de/MariaDB/cloud_fm/cloud_fm-2022-07-04-0006.sql'. + Run in batch mode. + + \033[1m$(basename $0) -b -d cloud_01 -c "-u root -S /run/mysqld/mysqld.sock"\033[m + +" + + clean_up 1 + +} + +clean_up() { + + + if [[ -f "$_backup_crontab_file" ]]; then + + blank_line + #echononl " (Re)Install Crontab from previously saved crontab file '$_backup_crontab_file'.." + echononl " (Re)Install Crontab from previously saved crontab file ..." + + crontab $_backup_crontab_file >> $log_file 2>&1 + + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + error "$(cat $log_file)" + fi + + + fi + + if [[ -n "$CUR_AUTOCOMMIT" ]] ; then + mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SET GLOBAL autocommit='$CUR_AUTOCOMMIT'" > /dev/null 2>&1 + fi + if [[ -n "$CUR_FOREIGN_KEY_CHECKS" ]] ; then + mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SET GLOBAL autocommit='$CUR_FOREIGN_KEY_CHECKS'" > /dev/null 2>&1 + fi + if [[ -n "$CUR_UNIQUE_CHECKS" ]] ; then + mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SET GLOBAL autocommit='$CUR_UNIQUE_CHECKS'" > /dev/null 2>&1 + fi + if [[ -n "$CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT" ]] ; then + mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SET GLOBAL autocommit='$CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT'" > /dev/null 2>&1 + fi + + # Perform program exit housekeeping + rm -f $log_file + blank_line + exit $1 +} + +is_number() { + + return $(test ! -z "${1##*[!0-9]*}" > /dev/null 2>&1); + + # - also possible + # - + #[[ ! -z "${1##*[!0-9]*}" ]] && return 0 || return 1 + #return $([[ ! -z "${1##*[!0-9]*}" ]]) +} + +echononl(){ + if $terminal && ! $QUIET_MODE ; then + echo X\\c > /tmp/shprompt$$ + if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then + echo -e -n "$*\\c" 1>&2 + else + echo -e -n "$*" 1>&2 + fi + rm /tmp/shprompt$$ + fi +} +echo_done() { + if $terminal && ! $QUIET_MODE ; then + echo -e "\033[${right_tabstop}G[ \033[32mdone\033[m ]" + fi +} +echo_ok() { + if $terminal && ! $QUIET_MODE ; then + echo -e "\033[${right_tabstop}G[ \033[32mok\033[m ]" + fi +} +echo_warning() { + if $terminal && ! $QUIET_MODE ; then + echo -e "\033[${right_tabstop}G[ \033[33m\033[1mwarn\033[m ]" + fi +} +echo_failed(){ + if $terminal && ! $QUIET_MODE ; then + echo -e "\033[${right_tabstop}G[ \033[1;31mfailed\033[m ]" + fi +} +echo_skipped() { + if $terminal && ! $QUIET_MODE; then + echo -e "\033[${right_tabstop}G[ \033[37mskipped\033[m ]" + fi +} + +fatal (){ + blank_line + if $terminal ; then + echo -e "\t[ \033[31m\033[1mFatal\033[m ]: \033[37m\033[1m$*\033[m" + echo "" + echo -e "\t\033[31m\033[1m Script will be interrupted..\033[m\033[m" + else + echo "fatal: $*" + echo "Script will be interrupted.." + fi + clean_up 1 +} + +error(){ + blank_line + if $terminal ; then + echo -e "\t[ \033[31m\033[1mFehler\033[m ]: $*" + else + echo "Error: $*" + fi + blank_line +} + +warn (){ + blank_line + if $terminal && ! $QUIET_MODE ; then + echo -e "\t[ \033[33m\033[1mWarning\033[m ]: $*" + else + echo "Warning: $*" + fi + blank_line +} + +info (){ + if $terminal && ! $QUIET_MODE ; then + echo "" + echo -e "\t[ \033[32m\033[1mInfo\033[m ]: $*" + echo "" + fi +} + +time_duration () { + + local __begin=$1 + local __end=$2 + + local __duration + + if [[ "$__begin" ]] && [[ "$__end" ]] ; then + + local __duration + + local __time=`expr $__end - $__begin` + local __t_h=`expr $__time / 60 / 60` + local __t_rest_h=`expr $__time - $__t_h \\* 60 \\* 60` + local __t_m=`expr $__t_rest_h / 60` + local __t_s=`expr $__t_rest_h - $__t_m \\* 60` + + if [[ $__t_h -gt 0 ]]; then + + if [[ $__t_h -lt 10 ]] ; then + __t_h=" $__t_h" + fi + if [[ $__t_m -lt 10 ]] ; then + __t_m=" $__t_m" + fi + if [[ $__t_s -lt 10 ]] ; then + __t_s=" $__t_s" + fi + + echo "$__t_h h : $__t_m min : $__t_s sec" + + elif [[ $__t_m -gt 0 ]]; then + + if [[ $__t_m -lt 10 ]] ; then + __t_m=" $__t_m" + fi + if [[ $__t_s -lt 10 ]] ; then + __t_s=" $__t_s" + fi + + echo "$__t_m min : $__t_s sec" + + else + if [[ $__t_s -lt 10 ]] ; then + echo " $__t_s sec" + else + echo "$__t_s sec" + fi + fi + + else + echo "N/A" + fi + + +} + +echo_duration () { + + local __time_duration=${1} + local __length=${#__time_duration} + + # print duratuion inside inside square brackets "[ duration ]" with blank delimiter, + # so add reduce tabstop by 4 characters + # + __tabstop=`expr ${right_tabstop} - ${__length} - 1 - 4` + echo -en "\033[${__tabstop}G[ \033[33m${__time_duration}\033[m ]" + +} + +detect_mysql_version () { + + _MYSQLD_VERSION="$(mysqld -V 2>/dev/null)" + + if [[ -z "$_MYSQLD_VERSION" ]]; then + fatal "No installed MySQL server or distribution found!" + elif [[ -d "/usr/local/mysql" ]] && [[ "$(basename "$(realpath "/usr/local/mysql")")" =~ percona- ]]; then + MYSQL_CUR_DISTRIBUTION="Percona" + elif [[ "$_MYSQLD_VERSION" =~ MariaDB ]]; then + MYSQL_CUR_DISTRIBUTION="MariaDB" + elif [[ "$_MYSQLD_VERSION" =~ MySQL ]]; then + MYSQL_CUR_DISTRIBUTION="MySQL" + elif [[ -d "/usr/local/mysql" ]] && [[ "$(basename "$(realpath "/usr/local/mysql")")" =~ mysql- ]]; then + MYSQL_CUR_DISTRIBUTION="MySQL" + elif [[ -d "/usr/local/mysql" ]] && [[ "$(basename "$(realpath "/usr/local/mysql")")" =~ mariadb- ]]; then + MYSQL_CUR_DISTRIBUTION="MariaDB" + else + + if $BATCH_MODE ; then + fatal "No MySQL Instalation on this Server found!" + fi + + error "MySQL Instalation found, but cannot determin the distribution!" + + MYSQL_CUR_DISTRIBUTION= + echo "" + echo " Select the MySQL distribution to install." + echo "" + echo " [1] MySQL (the original community edition)" + echo " [2] Percona Server for MySQL" + echo " [3] MariaDB" + echo "" + echononl " Eingabe [1/2/3]: " + + while [ "$MYSQL_CUR_DISTRIBUTION" != "MySQL" -a "$MYSQL_CUR_DISTRIBUTION" != "MariaDB" -a "$MYSQL_CUR_DISTRIBUTION" != "Percona" ];do + read OPTION + case $OPTION in + 1) MYSQL_CUR_DISTRIBUTION="MySQL" + ;; + 2) MYSQL_CUR_DISTRIBUTION="Percona" + ;; + 3) MYSQL_CUR_DISTRIBUTION="MariaDB" + ;; + *) echo "" + echo -e "\tFalsche Eingabe ! [ 1 = MySQL ; 2 = Percona ; 3 = MariaDB ]" + echo "" + echononl " Eingabe:" + ;; + esac + done + fi + + MYSQL_VERSION="$(echo $_MYSQLD_VERSION | grep -o -E "[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+)?" | head -n 1)" + MYSQL_MAJOR_VERSION="$(echo $MYSQL_VERSION | cut -d '.' -f1)" + MYSQL_MINOR_VERSION="$(echo $MYSQL_VERSION | cut -d '.' -f2)" + MYSQL_PATCH_LEVEL="$(echo $MYSQL_VERSION | cut -d '.' -f3)" + MYSQL_MAIN_VERSION="$(echo $MYSQL_VERSION | cut -d '.' -f1,2)" + +} + +# Check if systemd service exists +# +service_exists() { + local n=$1 + if [[ $(systemctl list-units --all -t service --full --no-legend "$n.service" | sed 's/^\s*//g' | cut -f1 -d' ') == $n.service ]]; then + return 0 + else + return 1 + fi +} + +# Check if a given array (parameter 2) contains a given string (parameter 1) +# +containsElement () { + local e + for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done + return 1 +} + +trim() { + local var="$*" + var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters + var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters + echo -n "$var" +} + +blank_line() { + if $terminal ; then + echo "" + fi +} + + + +# ---------- +# - Jobhandling +# ---------- + +# - Run 'clean_up' for signals SIGHUP SIGINT SIGTERM +# - +trap clean_up SIGHUP SIGINT SIGTERM + + + +# ============= +# --- Some +# ============= + +# - Support systemd ? +# - +if [[ "X$(which systemd)" = "X" ]]; then + SYSTEMD_EXISTS=false +else + SYSTEMD_EXISTS=true +fi + +# - Running in a terminal? +# - +if [[ -t 1 ]] ; then + terminal=true + clear +else + terminal=false + QUIET_MODE=true + NON_INTERACTIVE_MODE=true +fi + + +# ---------- +# Read Configurations from $conf_file +# ---------- + +if ! $QUIET_MODE ; then + echo "" +fi +echononl " Loading configuration settings from $(basename ${conf_file}).." +if [[ -f "$conf_file" ]]; then + source "$conf_file" > $log_file 2>&1 + if [[ $? -eq 0 ]]; then + echo_done + else + echo_failed + fatal "$(cat $log_file)" + fi +else + echo_skipped + warn "No Configuration File found. Loading defaults.." +fi + + +# ---------- +# - Read commandline parameter +# ---------- + +echononl " Read Commandline Parameter.." +while getopts bd:f:hs: opt ; do + case $opt in + b) BATCH_MODE=true + NON_INTERACTIVE_MODE=true + ;; + c) DATABASE_CREDENTIALS_ARGS="$OPTARG" + ;; + d) DATABASE_NAME="$OPTARG" + ;; + f) DATABASE_DUMP_FILE="$OPTARG" + ;; + h) usage + ;; + s) DATABASE_SERVER="$OPTARG" + ;; + \?) usage ;; + esac +done +echo_done + +[[ -n "$DATABASE_CREDENTIALS_ARGS" ]] && DATABASE_CREDENTIALS_NEEDED=false +[[ -n "$DATABASE_SERVER" ]] && DATABASE_SERVER_NEEDED=false +[[ -n "$DATABASE_NAME" ]] && DATABASE_NAME_NEEDED=false +[[ -n "$DATABASE_DUMP_FILE" ]] && DATABASE_DUMP_FILE_NEEDED=false + + +if $BATCH_MODE ; then + + if [[ -z "$DATABASE_DUMP_FILE" ]] ; then + fatal "No SQL Dump File given \033[m(Option -f)\033[1m!" + elif [[ ! -f "$DATABASE_DUMP_FILE" ]] ; then + fatal "\033[mSQL Dump File \033[1m${DATABASE_DUMP_FILE}\033[m not found!" + fi + + if [[ -z "$DATABASE_NAME" ]] ; then + fatal "No Database given \033[m(Option -d)\033[1m!" + fi + + if [[ -z "$DATABASE_CREDENTIALS_ARGS" ]] && [[ -z "$DATABASE_SERVER" ]]; then + + # Try to detect local MySQL Installation + # + detect_mysql_version + + MAJOR_VERSION="$MYSQL_MAJOR_VERSION" + MINOR_VERSION="$MYSQL_MINOR_VERSION" + PATCH_LEVEL="$MYSQL_PATCH_LEVEL" + + if [[ "$MYSQL_CUR_DISTRIBUTION" = "MariaDB" ]] && ([[ $MAJOR_VERSION -gt 10 ]] \ + || ( [[ $MAJOR_VERSION -eq 10 ]] && [[ $MINOR_VERSION -gt 3 ]] )) ; then + if [[ -S "/tmp/mysql.sock" ]]; then + DATABASE_CREDENTIALS_ARGS="-u root -S /tmp/mysql.sock" + elif [[ -S "/run/mysqld/mysqld.sock" ]]; then + DATABASE_CREDENTIALS_ARGS="-u root -S /run/mysqld/mysqld.sock" + elif [[ -S "/var/run/mysqld/mysqld.sock" ]]; then + DATABASE_CREDENTIALS_ARGS="-u root -S /var/run/mysqld/mysqld.sock" + else + fatal "Parameter 'DATABASE_CREDENTIALS_ARGS' cannot be determined automated. + + Use configuration file "$conf_file" or commandline Parameter or set + thr mysql credentials." + fi + else + if $(mysql --login-path=local -e ";" > /dev/null 2>&1) ; then + DATABASE_CREDENTIALS_ARGS="--login-path=local" + elif [[ -f "/usr/local/mysql/sys-maint.cnf" ]] ; then + DATABASE_CREDENTIALS_ARGS="--defaults-file=/usr/local/mysql/sys-maint.cnf" + elif [[ -f "/etc/mysql/debian.cnf" ]] ; then + DATABASE_CREDENTIALS_ARGS="--defaults-file=/etc/mysql/debian.cnf" + else + fatal "Parameter 'DATABASE_CREDENTIALS_ARGS' cannot be determined automated. + + Use configuration file "$conf_file" to set + parameter manually." + fi + fi + + elif [[ -z "$DATABASE_CREDENTIALS_ARGS" ]] && [[ -n "$DATABASE_SERVER" ]]; then + fatal "Cannot detect database credentials on remote machines. You have to set Parameter '-c'" + fi + +else + + if $DATABASE_SERVER ; then + echo "" + echo -e "\033[32m--\033[m" + echo "" + echo "Insert Database Server which should be created.." + echo "" + echo "" + echo -e " \033[33mType to accept the default (localhost).\033[m" + echo "" + echononl "Database Server [localhost]: " + read DATABASE_SERVER + if [[ "X$DATABASE_SERVER" = "X" ]] \ + || [[ "$DATABASE_SERVER" = 'localhost' ]] \ + || [[ "$DATABASE_SERVER" =~ ^127\. ]]; then + DATABASE_SERVER="" + fi + fi + + if $DATABASE_NAME_NEEDED ; then + echo "" + echo -e "\033[32m--\033[m" + echo "" + echo "Insert Database name which should be created.." + echo "" + echo "" + echononl "Database name: " + read DATABASE_NAME + while [ "X$DATABASE_NAME" = "X" ] ; do + echo -e "\n\t\033[33m\033[1mEingabe erforderlich.\033[m\n" + echononl "Database name: " + read DATABASE_NAME + done + fi + + if $DATABASE_CREDENTIALS_NEEDED ; then + + # Try to detect local MySQL Installation + # + detect_mysql_version + + MAJOR_VERSION="$MYSQL_MAJOR_VERSION" + MINOR_VERSION="$MYSQL_MINOR_VERSION" + PATCH_LEVEL="$MYSQL_PATCH_LEVEL" + + if [[ "$MYSQL_CUR_DISTRIBUTION" = "MariaDB" ]] && ([[ $MAJOR_VERSION -gt 10 ]] \ + || ( [[ $MAJOR_VERSION -eq 10 ]] && [[ $MINOR_VERSION -gt 3 ]] )) ; then + if [[ -S "/tmp/mysql.sock" ]]; then + _DATABASE_CREDENTIALS_ARGS="-u root -S /tmp/mysql.sock" + elif [[ -S "/run/mysqld/mysqld.sock" ]]; then + _DATABASE_CREDENTIALS_ARGS="-u root -S /run/mysqld/mysqld.sock" + elif [[ -S "/var/run/mysqld/mysqld.sock" ]]; then + _DATABASE_CREDENTIALS_ARGS="-u root -S /var/run/mysqld/mysqld.sock" + fi + else + if $(mysql --login-path=local -e ";" > /dev/null 2>&1) ; then + _DATABASE_CREDENTIALS_ARGS="--login-path=local" + elif [[ -f "/usr/local/mysql/sys-maint.cnf" ]] ; then + _DATABASE_CREDENTIALS_ARGS="--defaults-file=/usr/local/mysql/sys-maint.cnf" + elif [[ -f "/etc/mysql/debian.cnf" ]] ; then + _DATABASE_CREDENTIALS_ARGS="--defaults-file=/etc/mysql/debian.cnf" + fi + fi + + echo "" + echo -e "\033[32m--\033[m" + echo "" + echo "Insert Database Credentials.." + echo "" + + echo -e "A string containing credentials to establish a database connection. This character string + can consist of username and password, but also of login information stored in the file system + or the database itself. + + Example: + + \033[33m-u root -p''\033[m + \033[33m--login-path=local\033[m + \033[33m--defaults-file=/usr/local/mysql/sys-maint.cnf\033[m + \033[33m-u root -S /run/mysqld/mysqld.sock\033[m" + echo "" + + if [[ -n "$_DATABASE_CREDENTIALS_ARGS" ]] ; then + + echo -e " Type to accept the default (${_DATABASE_CREDENTIALS_ARGS})." + echo "" + + echononl "Database Credentials [\033[1m$_DATABASE_CREDENTIALS_ARGS\033[m]: " + read DATABASE_CREDENTIALS_ARGS + if [[ "X${DATABASE_CREDENTIALS_ARGS}" = "X" ]]; then + DATABASE_CREDENTIALS_ARGS="${_DATABASE_CREDENTIALS_ARGS}" + fi + + else + + echononl "Database Credentials: " + read DATABASE_CREDENTIALS_ARGS + while [ "X$DATABASE_CREDENTIALS_ARGS" = "X" ] ; do + echo -e "\n\t\033[33m\033[1mEingabe erforderlich.\033[m\n" + echononl "Database Credentials: " + read DATABASE_CREDENTIALS_ARGS + done + + fi # if [[ -n "$_DATABASE_CREDENTIALS_ARGS" ]] + + fi # if $DATABASE_CREDENTIALS_NEEDED ; then + + if $DATABASE_DUMP_FILE_NEEDED ; then + + echo "" + echo -e "\033[32m--\033[m" + echo "" + echo "Give full qualified path name (FQPN) of MySQL Dump file." + echo "" + echo "" + while [ "X$DATABASE_DUMP_FILE" = "X" ] ; do + + echononl "FQPN to MySQL Dump File: " + read DATABASE_DUMP_FILE + + if [[ "X$DATABASE_DUMP_FILE" = "X" ]] ; then + echo -e "\n\t\033[33m\033[1mEingabe erforderlich.\033[m\n" + continue + fi + + if [[ ! -f "$DATABASE_DUMP_FILE" ]] ; then + echo -e "\n\t\033[33m\033[1mMySQL Dump File '${DATABASE_DUMP_FILE}' not found!.\033[m\n" + DATABASE_DUMP_FILE="" + fi + done + : + fi + +fi # if $BATCH_MODE ; then + +if ! $QUIET_MODE ; then + echo "" + echo "" + echo -e "\033[32m\033[1m====================\033[m" + echo "Create MySQL Database settings" + echo -e "\033[32m\033[1m====================\033[m" + echo "" + echo " MySQL Distribution...........: $MYSQL_CUR_DISTRIBUTION" + if [[ "$MYSQL_CUR_DISTRIBUTION" = "MariaDB" ]] ; then + echo " MariaDB Version..............: ${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_LEVEL}" + else + echo " MySQL Version................: ${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_LEVEL}" + fi + echo "" + if [[ -n "$DATABASE_SERVER" ]] ; then + echo " Database server..............: $DATABASE_SERVER" + else + echo " Database server..............: localhost" + fi + echo " Database name................: $DATABASE_NAME" + echo "" + echo " MySQL Credentials............: $DATABASE_CREDENTIALS_ARGS" + echo "" + echo " Database Dump File...........: $DATABASE_DUMP_FILE" + echo "" + echo "" + echo "" +fi + +if ! $NON_INTERACTIVE_MODE ; then + echo -e -n "\033[1mContinue restoring database with above settings? [y/n]:\033[m " + read OK + while [[ "X${OK}X" = "XX" ]] ; do + echo "" + echo -e -n "\033[1mContinue with above settings? [y/n]:\033[m " + read OK + done + + if [[ "${OK,,}" != 'yes' ]] && [[ "${OK,,}" != 'y' ]]; then + fatal "Abort by user request." + fi +fi + + + +# ----- +# - Doing some checks +# ----- + +if ! $QUIET_MODE ; then + echo "" + echo "" + echo -e "\033[37m\033[1mDoing some checks..\033[m" + echo "" +fi + + +echononl " Checkif Database Dump File exists .." +if [[ ! -f "$DATABASE_DUMP_FILE" ]]; then + fatal "Database Dump File '$DATABASE_DUMP_FILE' not found!" +fi + + +echononl " Check connection to Database Server.." +if [[ -n "$DATABASE_SERVER" ]] ; then + if ! $(mysql -h $DATABASE_SERVER $DATABASE_CREDENTIALS_ARGS -e ";" > /dev/null 2>&1) ; then + fatal "Cannot connect to Database Server '$DATABASE_SERVER'!" + fi +else + if ! $(mysql $DATABASE_CREDENTIALS_ARGS -e ";" > /dev/null 2>&1) ; then + fatal "Cannot connect to Database Server!" + fi +fi +echo_done + +echononl " Check connection to Database '$DATABASE_NAME'.." +if [[ -n "$DATABASE_SERVER" ]] ; then + if ! $(mysql -h $DATABASE_SERVER $DATABASE_CREDENTIALS_ARGS $DATABASE_NAME -e ";" > /dev/null 2>&1) ; then + fatal "Cannot connect to Database '$DATABASE_NAME'!" + fi +else + if ! $(mysql $DATABASE_CREDENTIALS_ARGS $DATABASE_NAME -e ";" > /dev/null 2>&1) ; then + fatal "Cannot connect to Database '$DATABASE_NAME'!" + fi +fi +echo_done + + +# ----- +# - Doing some pre-script tasks +# ----- + +if ! $QUIET_MODE ; then + echo "" + echo "" + echo -e "\033[37m\033[1mDoing some pre-script tasks..\033[m" + echo "" +fi + + +# - Deaktiviere Cronjobs +# - +_backup_crontab_file=/tmp/crontab_root.${backup_date} +echononl " Backup Crontab to '$_backup_crontab_file'" +crontab -l > $_backup_crontab_file 2> $log_file +if [[ $? -eq 0 ]]; then + echo_ok +else + echo_failed + fatal "$(cat $log_file)" +fi + +echononl " Remove crontab for root.." +crontab -r > $log_file 2>&1 +if [[ $? -eq 0 ]]; then + echo_ok +else + echo_failed + fatal "$(cat $log_file)" +fi + +# - Stop Apache Webserver +# - +blank_line +echononl " Stop Apache Webserver.." +if service_exists apache2 ; then + systemctl stop apache2 + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + fatal "$(cat $log_file)" + fi +else + echo_skipped +fi + +blank_line +# - GET current (global) Autocommit value +# - +echononl " GET current (global) value \033[1mautocommit\033[m" +CUR_AUTOCOMMIT="$(mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SHOW GLOBAL VARIABLES LIKE 'autocommit'" | awk '{print$2}')" >> $log_file 2>&1 +if [[ $? -eq 0 ]];then + echo_ok +else + echo_failed + error "$(cat $log_file)" +fi + +# - GET current (global) value for 'foreign_key_checks' +# - +echononl " GET current (global) value \033[1mforeign_key_checks\033[m" +CUR_FOREIGN_KEY_CHECKS="$(mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SHOW GLOBAL VARIABLES LIKE 'foreign_key_checks'" | awk '{print$2}')" >> $log_file 2>&1 +if [[ $? -eq 0 ]];then + echo_ok +else + echo_failed + error "$(cat $log_file)" +fi + +# - GET current (global) value for 'unique_checks' +# - +echononl " GET current (global) value \033[1munique_checks\033[m" +CUR_UNIQUE_CHECKS="$(mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SHOW GLOBAL VARIABLES LIKE 'unique_checks'" | awk '{print$2}')" >> $log_file 2>&1 +if [[ $? -eq 0 ]];then + echo_ok +else + echo_failed + error "$(cat $log_file)" +fi + +# - GET current (global) value for 'innodb_flush_log_at_trx_commit' +# - +echononl " GET current (global) value \033[1minnodb_flush_log_at_trx_commit\033[m" +CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT="$(mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log_at_trx_commit'" | awk '{print$2}')" >> $log_file 2>&1 +if [[ $? -eq 0 ]];then + echo_ok +else + echo_failed + error "$(cat $log_file)" +fi + +blank_line + +echononl " Set Autocommit to OFF" +mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SET GLOBAL autocommit='OFF'" >> $log_file 2>&1 +if [[ $? -eq 0 ]];then + echo_ok +else + echo_failed + error "$(cat $log_file)" +fi + +echononl " Set foreign_key_checks to OFF" +mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SET GLOBAL foreign_key_checks='OFF'" >> $log_file 2>&1 +if [[ $? -eq 0 ]];then + echo_ok +else + echo_failed + error "$(cat $log_file)" +fi + +echononl " Set unique_checks to OFF" +mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SET GLOBAL unique_checks='OFF'" >> $log_file 2>&1 +if [[ $? -eq 0 ]];then + echo_ok +else + echo_failed + error "$(cat $log_file)" +fi + +echononl " Set innodb_flush_log_at_trx_commit to 2" +mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SET GLOBAL innodb_flush_log_at_trx_commit=2" >> $log_file 2>&1 +if [[ $? -eq 0 ]];then + echo_ok +else + echo_failed + error "$(cat $log_file)" +fi + + + + +if ! $QUIET_MODE ; then + echo "" + echo "" + echo -e "\033[1mProcessing restoring database \033[32m$DATABASE_NAME\033[m" + echo "" +fi + +echononl " Restore Database '${DATABASE_NAME}'.." +b_timestamp=$(date +"%s") +if [[ -n "$DATABASE_SERVER" ]] ; then + mysql -h $DATABASE_SERVER $DATABASE_CREDENTIALS_ARGS $DATABASE_NAME < $DATABASE_DUMP_FILE > $log_file 2>&1 +else + mysql $DATABASE_CREDENTIALS_ARGS $DATABASE_NAME < $DATABASE_DUMP_FILE > $log_file 2>&1 +fi +retval=$? +e_timestamp=$(date +"%s") +echo_duration "$(time_duration $b_timestamp $e_timestamp)" +if [[ $retval -eq 0 ]]; then + echo_ok +else + echo_failed + fatal "$(cat $log_file)" +fi + + + + + +# ----- +# - Doing some post-script tasks +# ----- + +if ! $QUIET_MODE ; then + echo "" + echo "" + echo -e "\033[37m\033[1mDoing some post-script tasks..\033[m" + echo "" +fi + +echononl " Set Autocommit to $CUR_AUTOCOMMIT" +mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SET GLOBAL autocommit='$CUR_AUTOCOMMIT'" >> $log_file 2>&1 +if [[ $? -eq 0 ]];then + echo_ok + CUR_AUTOCOMMIT="" +else + echo_failed + error "$(cat $log_file)" +fi + +echononl " Set foreign_key_checks to $CUR_FOREIGN_KEY_CHECKS" +mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SET GLOBAL foreign_key_checks='$CUR_FOREIGN_KEY_CHECKS'" >> $log_file 2>&1 +if [[ $? -eq 0 ]];then + echo_ok + CUR_FOREIGN_KEY_CHECKS="" +else + echo_failed + error "$(cat $log_file)" +fi + +echononl " Set unique_checks to $CUR_UNIQUE_CHECKS" +mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SET GLOBAL unique_checks='$CUR_UNIQUE_CHECKS'" >> $log_file 2>&1 +if [[ $? -eq 0 ]];then + echo_ok + CUR_UNIQUE_CHECKS="" +else + echo_failed + error "$(cat $log_file)" +fi + +echononl " Set innodb_flush_log_at_trx_commit to $CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT" +mysql $DATABASE_CREDENTIALS_ARGS -N -s -e "SET GLOBAL innodb_flush_log_at_trx_commit=$CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT" >> $log_file 2>&1 +if [[ $? -eq 0 ]];then + echo_ok + CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT="" +else + echo_failed + error "$(cat $log_file)" +fi + +blank_line + +# - Start Apache Webserver +# - +blank_line +echononl " Start Apache Webserver.." +if service_exists apache2 ; then + systemctl start apache2 > $log_file 2>&1 + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + error "$(cat $log_file)" + fi +else + echo_skipped +fi + + +clean_up 0