56 lines
1.6 KiB
Bash
Executable File
56 lines
1.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
if [[ $EUID -ne 0 || $# -ne 2 ]]; then
|
|
echo "usage: sudo $0 <donor-ip> <clone-secret-file>" >&2
|
|
exit 2
|
|
fi
|
|
|
|
donor_host=$1
|
|
secret_file=$(realpath "$2")
|
|
|
|
if [[ ! $donor_host =~ ^192\.168\.110\.[0-9]{1,3}$ ]]; then
|
|
echo "invalid donor IP: $donor_host" >&2
|
|
exit 2
|
|
fi
|
|
|
|
if [[ ! -f $secret_file || ! -s $secret_file ]]; then
|
|
echo "clone secret file is missing or empty: $secret_file" >&2
|
|
exit 2
|
|
fi
|
|
|
|
clone_secret=$(tr -d '\r\n' < "$secret_file")
|
|
if [[ ! $clone_secret =~ ^[0-9a-fA-F]{32}$ ]]; then
|
|
echo "clone secret must contain exactly 32 hexadecimal characters" >&2
|
|
unset clone_secret
|
|
exit 2
|
|
fi
|
|
|
|
restore_read_only() {
|
|
mysql --protocol=socket -uroot --force \
|
|
-e "SET GLOBAL read_only=ON; SET GLOBAL super_read_only=ON" \
|
|
>/dev/null 2>&1 || true
|
|
}
|
|
|
|
if ! mysql --protocol=socket -uroot -Nse \
|
|
"SELECT PLUGIN_STATUS FROM information_schema.PLUGINS WHERE PLUGIN_NAME='clone'" \
|
|
| grep -qx ACTIVE; then
|
|
trap restore_read_only EXIT
|
|
mysql --protocol=socket -uroot <<'SQL'
|
|
SET SESSION sql_log_bin=0;
|
|
SET GLOBAL super_read_only=OFF;
|
|
SET GLOBAL read_only=OFF;
|
|
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
|
|
SET GLOBAL read_only=ON;
|
|
SET GLOBAL super_read_only=ON;
|
|
SQL
|
|
trap - EXIT
|
|
fi
|
|
|
|
mysql --protocol=socket -uroot -e \
|
|
"SET GLOBAL clone_valid_donor_list='${donor_host}:3306'; CLONE INSTANCE FROM 'clone_110'@'${donor_host}':3306 IDENTIFIED BY '${clone_secret}'"
|
|
unset clone_secret
|
|
|
|
mysql --protocol=socket -uroot -e \
|
|
"SELECT STATE,SOURCE,ERROR_NO,ERROR_MESSAGE FROM performance_schema.clone_status; SELECT @@server_id,@@read_only,@@super_read_only,@@gtid_mode"
|