diff --git a/bin/restore-website-from-backup.sh b/bin/restore-website-from-backup.sh index df88537..15909db 100755 --- a/bin/restore-website-from-backup.sh +++ b/bin/restore-website-from-backup.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash +CUR_IFS="$IFS" + script_name="$(basename $(realpath $0))" working_dir="$(dirname $(realpath $0))" @@ -93,6 +95,19 @@ clean_up() { fi + if [[ -n "$CUR_AUTOCOMMIT" ]] ; then + mysql $MYSQL_CREDENTIAL_ARGS -N -s -e "SET GLOBAL autocommit='$CUR_AUTOCOMMIT'" > /dev/null 2>&1 + fi + if [[ -n "$CUR_FOREIGN_KEY_CHECKS" ]] ; then + mysql $MYSQL_CREDENTIAL_ARGS -N -s -e "SET GLOBAL autocommit='$CUR_FOREIGN_KEY_CHECKS'" > /dev/null 2>&1 + fi + if [[ -n "$CUR_UNIQUE_CHECKS" ]] ; then + mysql $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 @@ -205,17 +220,30 @@ time_duration () { local __t_s=`expr $__t_rest_h - $__t_m \\* 60` if [[ $__t_h -gt 0 ]]; then + if [[ $__t_h -lt 10 ]] ; then - echo " $__t_h h : $__t_m min : $__t_s sec" - else - echo "$__t_h h : $__t_m min : $__t_s sec" + __t_h=" $__t_h" fi - elif [[ $__t_m -gt 0 ]]; then if [[ $__t_m -lt 10 ]] ; then - echo " $__t_m min : $__t_s sec" - else - echo "$__t_m min : $__t_s sec" + __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" @@ -243,6 +271,62 @@ echo_duration () { } +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 + 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 a given array (parameter 2) contains a given string (parameter 1) ## - containsElement () { @@ -319,7 +403,7 @@ IS_NEXTCLOUD=false DEFAULT_BACKUP_BASE_DIR="/backup" DEFAULT_DATABASE_TYPE="mysql" -DEFAULT_MYSQL_CREDENTIALS="--defaults-file=/usr/local/mysql/sys-maint.cnf" +DEFAULT_MYSQL_CREDENTIAL_ARGS="--defaults-file=/usr/local/mysql/sys-maint.cnf" # Note: # HTTP_USER/HTTP_GROUP from this backup machine! @@ -366,7 +450,45 @@ while getopts bd:hs:t:w: opt ; do done [[ -z "$DATABASE_TYPE" ]] && DATABASE_TYPE="$DEFAULT_DATABASE_TYPE" -[[ -z "$MYSQL_CREDENTIALS" ]] && MYSQL_CREDENTIALS="$DEFAULT_MYSQL_CREDENTIALS" +#[[ -z "$MYSQL_CREDENTIAL_ARGS" ]] && MYSQL_CREDENTIAL_ARGS="$DEFAULT_MYSQL_CREDENTIAL_ARGS" + +if [[ -z "$MYSQL_CREDENTIAL_ARGS" ]] ; then + + 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 + MYSQL_CREDENTIAL_ARGS="-u root -S /tmp/mysql.sock" + elif [[ -S "/run/mysqld/mysqld.sock" ]]; then + MYSQL_CREDENTIAL_ARGS="-u root -S /run/mysqld/mysqld.sock" + elif [[ -S "/var/run/mysqld/mysqld.sock" ]]; then + MYSQL_CREDENTIAL_ARGS="-u root -S /var/run/mysqld/mysqld.sock" + else + fatal "Parameter 'MYSQL_CREDENTIAL_ARGS' cannot be determined automated. + + Use configuration file "$conf_file" to set + parameter manually." + fi + else + if $(mysql --login-path=local -e ";" > /dev/null 2>&1) ; then + MYSQL_CREDENTIAL_ARGS="--login-path=local" + elif [[ -f "/usr/local/mysql/sys-maint.cnf" ]] ; then + MYSQL_CREDENTIAL_ARGS="--defaults-file=/usr/local/mysql/sys-maint.cnf" + elif [[ -f "/etc/mysql/debian.cnf" ]] ; then + MYSQL_CREDENTIAL_ARGS="--defaults-file=/etc/mysql/debian.cnf" + else + fatal "Parameter 'MYSQL_CREDENTIAL_ARGS' cannot be determined automated. + + Use configuration file "$conf_file" to set + parameter manually." + fi + fi +fi [[ -z "$BACKUP_BASE_DIR" ]] && BACKUP_BASE_DIR="$DEFAULT_BACKUP_BASE_DIR" if [[ ! -d "$BACKUP_BASE_DIR" ]] ; then @@ -482,6 +604,7 @@ if $terminal && ! $BATCH_MODE ; then # - Sort array # - IFS=$'\n' server_arr=($(sort <<<"${unsorted_server_arr[*]}")) + IFS="$CUR_IFS" SERVER= _OK=false @@ -525,6 +648,7 @@ if $terminal && ! $BATCH_MODE ; then # - Sort array # - IFS=$'\n' version_arr=($(sort <<<"${unsorted_version_arr[*]}")) + IFS="$CUR_IFS" RESTORE_DIR="" @@ -623,6 +747,7 @@ if $terminal && ! $BATCH_MODE ; then # - Sort array # - IFS=$'\n' website_arr=($(sort <<<"${unsorted_website_arr[*]}")) + IFS="$CUR_IFS" WEBSITE= _OK=false @@ -698,6 +823,7 @@ else fi + # ============= # --- Some final checks # ============= @@ -753,7 +879,7 @@ if $terminal ; then echo "" fi if [[ "$DATABASE_TYPE" = "mysql" ]] ; then - echo -e " Mysql Credentials..........................: $MYSQL_CREDENTIALS" + echo -e " Mysql Credentials..........................: $MYSQL_CREDENTIAL_ARGS" fi echo "" @@ -840,6 +966,89 @@ else echo_skipped fi +blank_line +# - GET current (global) Autocommit value +# - +echononl " GET current (global) value \033[1mautocommit\033[m" +CUR_AUTOCOMMIT="$(mysql $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 + # ----- # - Main Part of Script @@ -870,6 +1079,47 @@ else echo_skipped fi +blank_line + +echononl " Set Autocommit to OFF" +mysql $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 + + +blank_line + echononl " Restore Database '${DATABASE_NAME}'.." b_timestamp=$(date +"%s") mysql $MYSQL_CREDENTIAL_ARGS $DATABASE_NAME < $SQL_FILE > $log_file 2>&1 @@ -883,6 +1133,8 @@ else fatal "$(cat $log_file)" fi +blank_line + echononl " Sync Webspace - site '${WEBSITE}'.." # Begin timestamp @@ -970,6 +1222,48 @@ if $terminal ; then echo "" fi +echononl " Set Autocommit to $CUR_AUTOCOMMIT" +mysql $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 $MYSQL_CREDENTIAL_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 + echononl " Restart PHP engine.." if [[ "$PHP_ENGINE" = "FPM" ]] && [[ -n "$PHP_VERSION" ]]; then if $SYSTEMD_EXISTS ; then @@ -1058,5 +1352,4 @@ fi blank_line - -clean_up 1 +clean_up 0