k8s-manifests/ops/110-native-mysql/clone-replica.sh

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"