458 lines
12 KiB
Bash
Executable File
458 lines
12 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
script_name="$(basename $(realpath $0))"
|
|
script_dir="$(dirname $(realpath $0))"
|
|
|
|
conf_dir="${script_dir}/conf"
|
|
|
|
tmp_err_msg=$(mktemp)
|
|
log_dir=/root/sync_from_old_server_logs
|
|
mkdir -p ${log_dir}
|
|
|
|
|
|
# - Sync MySQL databases
|
|
# -
|
|
# - Note:
|
|
# - Set to "ALL" if all databases from old server should be synced
|
|
# - Leave empty if no databases should be synced.
|
|
# -
|
|
# - Example:
|
|
# - To sync database 'shop19' aot source host to database 'shop19_dev'
|
|
# - at destination host:
|
|
# - sync_mysql_databases="
|
|
# - ...
|
|
# - shop19:shop19_dev
|
|
# - ...
|
|
# - "
|
|
# -
|
|
sync_mysql_databases=""
|
|
|
|
# - mysql_source_credential_args
|
|
# - mysql_target_credential_args
|
|
# -
|
|
# - Example
|
|
# - mysql_credential_args="-u root -S /run/mysqld/mysqld.sock"
|
|
# - mysql_credential_args="--defaults-file=/usr/local/mysql/sys-maint.cnf"
|
|
# - mysql_credential_args="--login-path=local"
|
|
# - mysql_credential_args="-u <db_name> -p'<db_passwd>'"
|
|
# -
|
|
mysql_source_credential_args="-u root -pbuz111 -S /run/mysqld/mysqld-5.7.sock"
|
|
mysql_target_credential_args="-u root -S /run/mysqld/mysqld.sock"
|
|
|
|
mysqldump_exe="/usr/local/mysql/bin/mysqldump"
|
|
|
|
mysql_source_exe="/usr/local/mysql/bin/mysql"
|
|
mysql_target_exe="/usr/bin/mysql"
|
|
|
|
mysql_source_version="$(${mysql_source_exe} -V | awk '{print$5}')"
|
|
mysql_target_version="$(${mysql_target_exe} -V | awk '{print$5}')"
|
|
|
|
# Remove leading / trailling point sign ','
|
|
#
|
|
mysql_source_version="${mysql_source_version%\,}"
|
|
mysql_target_version="${mysql_target_version%\,}"
|
|
|
|
|
|
# - mysqldump parameters/options
|
|
# -
|
|
mysql_max_allowed_packet="1024M"
|
|
|
|
# -------------
|
|
# --- Some functions
|
|
# -------------
|
|
echononl(){
|
|
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$$
|
|
}
|
|
|
|
fatal(){
|
|
echo ""
|
|
if [[ -z "$*" ]] ; then
|
|
echo -e "\t\033[31m\033[1mScript will be interrupted\033[m\033[m"
|
|
else
|
|
|
|
echo -e "\t[ \033[31m\033[1mFatal Error\033[m ]: $*"
|
|
echo ""
|
|
echo -e "\t\033[31m\033[1mScript will be interrupted\033[m\033[m"
|
|
fi
|
|
echo ""
|
|
exit 1
|
|
}
|
|
|
|
error(){
|
|
echo ""
|
|
echo -e "\t[ \033[31m\033[1mFehler\033[m ]: $*"
|
|
echo ""
|
|
}
|
|
|
|
warn (){
|
|
echo ""
|
|
echo -e "\t[ \033[33m\033[1mWarning\033[m ]: $*"
|
|
echo ""
|
|
}
|
|
|
|
info (){
|
|
echo ""
|
|
echo -e "\t[ \033[32m\033[1mInfo\033[m ]: $*"
|
|
echo ""
|
|
}
|
|
|
|
echo_done() {
|
|
echo -e "\033[80G[ \033[32mdone\033[m ]"
|
|
}
|
|
echo_ok() {
|
|
echo -e "\033[80G[ \033[32mok\033[m ]"
|
|
}
|
|
echo_ok() {
|
|
echo -e "\033[80G[ \033[32mok\033[m ]"
|
|
}
|
|
echo_warning() {
|
|
echo -e "\033[80G[ \033[33m\033[1mwarn\033[m ]"
|
|
}
|
|
echo_failed(){
|
|
echo -e "\033[80G[ \033[1;31mfailed\033[m ]"
|
|
}
|
|
echo_skipped() {
|
|
echo -e "\033[80G[ \033[33m\033[1mskipped\033[m ]"
|
|
}
|
|
|
|
trim() {
|
|
local var="$*"
|
|
var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters
|
|
var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters
|
|
echo -n "$var"
|
|
}
|
|
|
|
service_exists() {
|
|
local n=$1
|
|
if [[ $(systemctl list-units --all -t service --full --no-legend "$n.service" | cut -f1 -d' ') == $n.service ]]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
|
|
# ----------
|
|
|
|
|
|
# - Is this a systemd system?
|
|
# -
|
|
if [[ "X$(which systemd)" = "X" ]]; then
|
|
systemd_exists=false
|
|
else
|
|
systemd_exists=true
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# ==========
|
|
# - Begin Main Script
|
|
# ==========
|
|
|
|
# ----------
|
|
# - Headline
|
|
# ----------
|
|
|
|
clear
|
|
|
|
if $terminal ; then
|
|
echo ""
|
|
echo -e "\033[1m----------\033[m"
|
|
echo -e "\033[32m\033[1mRunning script \033[m\033[1m$script_name\033[32m .. \033[m"
|
|
echo -e "\033[1m----------\033[m"
|
|
fi
|
|
|
|
|
|
echo ""
|
|
echo -e " \033[32mParameter Summary:\033[m"
|
|
echo ""
|
|
|
|
|
|
echo -e " MySQL source version..................: ${mysql_source_version}"
|
|
echo -e " MySQL target version..................: ${mysql_target_version}"
|
|
echo ""
|
|
echo -e " MySQL client binary source version....: ${mysql_source_exe}"
|
|
echo -e " MySQL client binary target version....: ${mysql_target_exe}"
|
|
echo ""
|
|
echo -e " MySQL credentials source versions.....: ${mysql_source_credential_args}"
|
|
echo -e " MySQL credentials target versions.....: ${mysql_target_credential_args}"
|
|
echo ""
|
|
|
|
_error=false
|
|
if [[ ! -x "${mysql_source_exe}" ]] ; then
|
|
error "No mysql binary \033[1m${mysql_source_exe}\033[m found (VAR mysql_source_exe)."
|
|
_error=true
|
|
fi
|
|
|
|
if [[ ! -x "${mysql_target_exe}" ]] ; then
|
|
error "No mysql binary \033[1m${mysql_target_exe}\033[m found (VAR mysql_target_exe)."
|
|
_error=true
|
|
fi
|
|
if $_error ; then
|
|
fatal Wrong or Missing Parameter..
|
|
fi
|
|
|
|
|
|
|
|
echo ""
|
|
echononl " \033[33mContinue with this parameters? [\033[1myes/no\033[m]: "
|
|
read OK
|
|
while [[ "${OK,,}" != "yes" ]] && [[ "${OK,,}" != "no" ]] ; do
|
|
echononl " \033[33mWrong entry!\033[m [\033[1myes/no\033[m]: "
|
|
read OK
|
|
done
|
|
[[ "${OK,,}" = "yes" ]] || fatal "Canceled by user input."
|
|
|
|
if $terminal ; then
|
|
echo ""
|
|
echo ""
|
|
echo -e " \033[32m-----\033[m"
|
|
echo -e " \033[1mSyncing MySQL Databases from Version '${mysql_source_version}' to Version '${mysql_target_version} ..\033[m"
|
|
echo -e " \033[32m-----\033[m"
|
|
fi
|
|
echo ""
|
|
|
|
_got_mysql_databases=false
|
|
sync_mysql_databases="${sync_mysql_databases##*( )}"
|
|
sync_mysql_databases="${sync_mysql_databases%%*( )}"
|
|
|
|
if [[ -z "$sync_mysql_databases" ]]; then
|
|
warn "No MySQL databases for syncing configured."
|
|
elif [[ "$(trim "${sync_mysql_databases}")" = "ALL" ]]; then
|
|
echononl " Get MySQL databases from source Installation.."
|
|
_mysql_databases_remote="$(${mysql_source_exe} ${mysql_source_credential_args} -N -s -e "show databases" 2> /dev/null)"
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
_got_mysql_databases=true
|
|
else
|
|
echo_failed
|
|
fi
|
|
else
|
|
_mysql_databases_remote="$sync_mysql_databases"
|
|
_got_mysql_databases=true
|
|
fi
|
|
|
|
if $_got_mysql_databases ; then
|
|
log_file=${log_dir}/sync_mysql.log
|
|
> $log_file
|
|
mysqldump_flags="--protocol=SOCKET --max-allowed-packet=${mysql_max_allowed_packet} --skip-opt --add-drop-table --add-locks --create-options --quick --set-charset --disable-keys --lock-tables --routines"
|
|
|
|
|
|
# - GET current (global) Autocommit value
|
|
# -
|
|
echononl " GET current (global) Autocommit value"
|
|
CUR_AUTOCOMMIT="$(${mysql_target_exe} ${mysql_target_credential_args} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'autocommit'" | awk '{print$2}')" >> $log_file 2> $tmp_err_msg
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
else
|
|
echo_failed
|
|
error "$(cat $tmp_err_msg)"
|
|
fi
|
|
|
|
|
|
# - GET current (global) value for 'unique_checks'
|
|
# -
|
|
echononl " GET current (global) 'unique_checks' value"
|
|
CUR_UNIQUE_CHECKS="$(${mysql_target_exe} ${mysql_target_credential_args} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'unique_checks'" | awk '{print$2}')" >> $log_file 2> $tmp_err_msg
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
else
|
|
echo_failed
|
|
error "$(cat $tmp_err_msg)"
|
|
fi
|
|
|
|
|
|
# - GET current (global) value for 'foreign_key_checks'
|
|
# -
|
|
echononl " GET current (global) 'foreign_key_checks' value"
|
|
CUR_FOREIGN_KEY_CHECKS="$(${mysql_target_exe} ${mysql_target_credential_args} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'foreign_key_checks'" | awk '{print$2}')" >> $log_file 2> $tmp_err_msg
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
else
|
|
echo_failed
|
|
error "$(cat $tmp_err_msg)"
|
|
fi
|
|
|
|
|
|
# - GET current (global) value for 'innodb_flush_log_at_trx_commit'
|
|
# -
|
|
echononl " GET current (global) 'innodb_flush_log_at_trx_commit' value"
|
|
CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT="$(${mysql_target_exe} ${mysql_target_credential_args} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log_at_trx_commit'" | awk '{print$2}')" >> $log_file 2> $tmp_err_msg
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
else
|
|
echo_failed
|
|
error "$(cat $tmp_err_msg)"
|
|
fi
|
|
echo ""
|
|
|
|
|
|
# - Set Autocommit OFF
|
|
# -
|
|
echononl " Set Autocommit to OFF"
|
|
${mysql_target_exe} ${mysql_target_credential_args} -N -s -e "SET GLOBAL AUTOCOMMIT='OFF'" \
|
|
>> $log_file 2> $tmp_err_msg
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
else
|
|
echo_failed
|
|
error "$(cat $tmp_err_msg)"
|
|
fi
|
|
|
|
# - Set UNIQUE_CHECKS OFF
|
|
# -
|
|
echononl " Set 'unique_checks' to OFF"
|
|
${mysql_target_exe} ${mysql_target_credential_args} -N -s -e "SET GLOBAL unique_checks='OFF'" >> $log_file 2> $tmp_err_msg
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
else
|
|
echo_failed
|
|
error "$(cat $tmp_err_msg)"
|
|
fi
|
|
|
|
|
|
# - Set FOREIGN_KEY_CHECKS OFF
|
|
# -
|
|
echononl " Set 'foreign_key_checks' to OFF"
|
|
${mysql_target_exe} ${mysql_target_credential_args} -N -s -e "SET GLOBAL foreign_key_checks='OFF'" >> $log_file 2> $tmp_err_msg
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
else
|
|
echo_failed
|
|
error "$(cat $tmp_err_msg)"
|
|
fi
|
|
|
|
|
|
# - Set innodb_flush_log_at_trx_commit OFF
|
|
# -
|
|
echononl " Set 'innodb_flush_log_at_trx_commit' to 2"
|
|
${mysql_target_exe} ${mysql_target_credential_args} -N -s -e "SET GLOBAL innodb_flush_log_at_trx_commit=2" >> $log_file 2> $tmp_err_msg
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
else
|
|
echo_failed
|
|
error "$(cat $tmp_err_msg)"
|
|
fi
|
|
|
|
echo ""
|
|
|
|
|
|
for _val in $_mysql_databases_remote ; do
|
|
|
|
IFS=':' read -a _val_arr <<< "${_val}"
|
|
_src_db="${_val_arr[0]}"
|
|
if [[ -n "${_val_arr[1]}" ]] ; then
|
|
_dst_db="${_val_arr[1]}"
|
|
echononl " Sync Database '$_src_db' --> '$_dst_db'.. "
|
|
else
|
|
echononl " Sync Database '$_src_db'.. "
|
|
_dst_db="$_src_db"
|
|
fi
|
|
|
|
if [[ "${_src_db}" = "information_schema" ]]; then
|
|
echo_skipped
|
|
continue
|
|
fi
|
|
if [[ "${_src_db}" = "performance_schema" ]]; then
|
|
echo_skipped
|
|
continue
|
|
fi
|
|
if [[ "${_src_db}" = "mysql" ]]; then
|
|
echo_skipped
|
|
continue
|
|
fi
|
|
if [[ "${_src_db}" = "sys" ]]; then
|
|
echo_skipped
|
|
continue
|
|
fi
|
|
if [[ "${_src_db}" = "test" ]] || [[ "${_src_db}" = "mysqltest" ]] ; then
|
|
echo_skipped
|
|
continue
|
|
fi
|
|
${mysqldump_exe} ${mysql_source_credential_args} $_src_db 2> /dev/null \
|
|
| ${mysql_target_exe} ${mysql_target_credential_args} ${_dst_db} >> $log_file 2> $tmp_err_msg
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
else
|
|
echo_failed
|
|
error "$(cat $tmp_err_msg)"
|
|
|
|
echo -e "
|
|
|
|
\033[33mcommand was:\033[m
|
|
\033[1m${mysqldump_exe} ${mysql_source_credential_args} $_src_db 2> /dev/null \\
|
|
| ${mysql_target_exe} ${mysql_target_credential_args} ${_dst_db}\033[m
|
|
|
|
"
|
|
|
|
echononl "\n continue anyway [yes/no]: "
|
|
read OK
|
|
OK=${OK,,}
|
|
while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do
|
|
echononl "Wrong entry! - repeat [yes/nno]: "
|
|
read OK
|
|
done
|
|
[[ $OK = "yes" ]] || fatal "Abbruch durch User"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
# - Reset (global) Autocommit value
|
|
# -
|
|
echo ""
|
|
echononl " Reset (global) Autocommit value to '$CUR_AUTOCOMMIT'"
|
|
${mysql_target_exe} ${mysql_target_credential_args} -N -s -e "SET GLOBAL AUTOCOMMIT='${CUR_AUTOCOMMIT}'" \
|
|
>> $log_file 2> $tmp_err_msg
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
else
|
|
echo_failed
|
|
error "$(cat $tmp_err_msg)"
|
|
fi
|
|
|
|
# - Reset (global) value for 'unique_checks'
|
|
# -
|
|
echononl " Reset (global) 'unique_checks' value to '$CUR_UNIQUE_CHECKS'"
|
|
${mysql_target_exe} ${mysql_target_credential_args} -N -s -e "SET GLOBAL unique_checks='$CUR_UNIQUE_CHECKS'" >> $log_file 2> $tmp_err_msg
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
else
|
|
echo_failed
|
|
error "$(cat $tmp_err_msg)"
|
|
fi
|
|
|
|
# - Reset (global) value for 'foreign_key_checks'
|
|
# -
|
|
echononl " Reset (global) 'foreign_key_checks' value to '$CUR_FOREIGN_KEY_CHECKS'"
|
|
${mysql_target_exe} ${mysql_target_credential_args} -N -s -e "SET GLOBAL foreign_key_checks='$CUR_FOREIGN_KEY_CHECKS'" >> $log_file 2> $tmp_err_msg
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
else
|
|
echo_failed
|
|
error "$(cat $tmp_err_msg)"
|
|
fi
|
|
|
|
# - Reset (global) value for 'innodb_flush_log_at_trx_commit'
|
|
# -
|
|
echononl " Reset (global) 'innodb_flush_log_at_trx_commit' value to '$CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT'"
|
|
${mysql_target_exe} ${mysql_target_credential_args} -N -s -e "SET GLOBAL innodb_flush_log_at_trx_commit=$CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT" >> $log_file 2> $tmp_err_msg
|
|
if [[ $? -eq 0 ]];then
|
|
echo_ok
|
|
else
|
|
echo_failed
|
|
error "$(cat $tmp_err_msg)"
|
|
fi
|
|
|
|
fi
|
|
|
|
rm $tmp_err_msg
|
|
echo ""
|
|
exit 0
|