这段脚本用于自动跳过 MySQL 主从复制过程中的错误,特别是 1023 和 1062 错误(通常是由重复键或主键冲突引起的)。该脚本在从库(slave)上运行,并且包含了日志记录功能,便于追踪操作过程。
#!/bin/bash
user='maxrou'
pass='maxrou'
port='3066'
IP='mysql1'
MYSQLCLI='/usr/local/mysql/bin/mysql'
log_file="/var/log/mysql_slave_skip.log"
log_message() {
local message=$1
echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" >> $log_file
}
current_pos=$($MYSQLCLI --defaults-extra-file=/usr/local/sbin/zabbix/my.password -P$port -e 'SHOW SLAVE STATUS\G' | grep 'Relay_Log_Pos' | awk '{print $2}')
log_message "当前 Relay_Log_Pos: $current_pos"
if [ -f /tmp/relay_log_pos.txt ]; then
last_pos=$(cat /tmp/relay_log_pos.txt)
else
last_pos=0
fi
log_message "上次 Relay_Log_Pos: $last_pos"
if ! [[ "$current_pos" =~ ^[0-9]+$ ]]; then
log_message "错误: current_pos 不是有效的整数: $current_pos"
exit 1
fi
if ! [[ "$last_pos" =~ ^[0-9]+$ ]]; then
log_message "错误: last_pos 不是有效的整数: $last_pos"
exit 1
fi
if [ "$current_pos" -eq "$last_pos" ]; then
log_message "Relay_Log_Pos 没有变化,跳过复制错误"
$MYSQLCLI --defaults-extra-file=/usr/local/sbin/zabbix/my.password -P$port -e "STOP SLAVE;"
$MYSQLCLI --defaults-extra-file=/usr/local/sbin/zabbix/my.password -P$port -e "SET GLOBAL slave_exec_mode='IDEMPOTENT';"
$MYSQLCLI --defaults-extra-file=/usr/local/sbin/zabbix/my.password -P$port -e "SET GLOBAL sql_slave_skip_counter=10;"
$MYSQLCLI --defaults-extra-file=/usr/local/sbin/zabbix/my.password -P$port -e "START SLAVE;"
log_message "跳过 10 个事件,继续复制。"
fi
echo $current_pos > /tmp/relay_log_pos.txt
log_message "更新 Relay_Log_Pos 为当前的 $current_pos"
每 5 分钟执行一次脚本。
# 脚本存放在 /usr/local/bin
crontab -e
*/5 * * * * /usr/local/bin/manage_repl.sh
观察日志

