加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL的slave_exec_mode参数说明及用途

发布时间:2023-10-23 15:55:55 所属栏目:MySql教程 来源:
导读:slave_exec_mode=IDEMPOTENT在MySQL复制环境中是个很有用的参数:只要在备机运行set global slave_exec_mode=IDEMPOTENT,备机的sql thread就运行在冥等模式下,可以让备机在insert主键、唯一键冲突,update、delete值未
slave_exec_mode=IDEMPOTENT在MySQL复制环境中是个很有用的参数:只要在备机运行set global slave_exec_mode=IDEMPOTENT,备机的sql thread就运行在冥等模式下,可以让备机在insert主键、唯一键冲突,update、delete值未找到错误发生时不断开复制而保持冥等性(当即生效,连slave的sql线程都不用重启哟);而类似sql_slave_skip_counter=N和slave-skip-errors = N这样的粗暴跳过错误方法可能破坏主备一致性。
 
注意:使用冥等模式时表要有主键
 
冥等模式并不是万能的,除了不能对DDL操作冥等,对字段长度不同导致的错误也不是冥等(譬如主机一个字段是char(20)而备机是char(10)),还有一个限制就是表有主键才会对insert的冥等设置有效:因为insert的冥等行为是通过主键来判断备机是否有重复值从而产生覆写操作,如果表没有主键,则备机即使设了冥等也可能会比主机多重复数据。
 
针对slave_exec_mode参数,它可以跳过1062和1032的错误,并且不影响同一个事务中正常的数据执行。如果是多个SQL组成的事务,则可以跳过有问题的event。
 
另外在GTID模式下的复制,sql_slave_skip_counter是不支持的,该模式下的复制可以自行测试。
 
主从复制中常会遇到的问题就是1062主键重复
 
主从复制中1032错误一般是指要更改的数据不存在
 
遇到错误1032或者1062的处理方式:
 
所以处理该错误的方法有:
 
1:skip_slavesql_slave_skip_counter
 
stop slave;                                                                                                                                     Query OK, 0 rows affected (0.00 sec)
 
set global sql_slave_skip_counter=[1-4];
 
Query OK, 0 rows affected (0.00 sec)
 
start slave;
 
Query OK, 0 rows affected (0.00 sec)
 
2:在配置文件里指定slave-skip-errors=1062(需要重启)
 
这2种方法都能让复制恢复正常,但是会让主从数据不一致(谨慎使用),如果一个事务中多个语句,其他的语句也会丢失。
 
并且第2种方法还需要重启数据库,此时slave_exec_mode参数就派上用场了。在从库上设置该参数:
 
slave_exec_mode参数可用来自动处理同步复制错误:
 
# slave上执行
 
set global slave_exec_mode='IDEMPOTENT';  幂等模式 (默认是STRICT严格模式)
 
stop slave;
 
start slave;
 
slave_exec_mode和slave_skip_errors的作用是一样的,但是slave_skip_errors不支持动态修改,必须重启mysql才能生效,因此建议使用slave_exec_mode。
 
针对slave_exec_mode参数,它可以跳过1062和1032的错误,并且不影响同一个事务中正常的数据执行。如果是多个SQL组成的事务,则可以跳过有问题的event。
 
insert into x values(1),(4),(5); #其中从库有id=4这条记录
 
BEGIN;
 
INSERT INTO x SELECT 4;
 
DELETE FROM x WHERE id = 2; #从库没有这条记录
 
INSERT INTO x SELECT 5;
 
COMMIT;
 
#!/bin/bash
 
# Description: 自动跳过主从复制的错误(错误代码1023、1062) ,这个脚本在slave上执行
 
#  
 
user='root'
 
pass='root'
 
port='3306'
 
IP='172.16.10.12'
 
MYSQLCLI='/usr/local/mysql/bin/mysql'
 
STATUS=$($MYSQLCLI -u$user -p$pass -h $IP -e 'show slave status\G'|sed -n '13p'|awk -F ":" '{print $2}')
 
if [[ $STATUS != 'YES' ]];then
 
    $MYSQLCLI -u$user -p$pass -h $IP -e "SET GLOBAL slave_exec_mode='IDEMPOTENT';"
 
    $MYSQLCLI -u$user -p$pass -h $IP -e "stop slave';"
 
    $MYSQLCLI -u$user -p$pass -h $IP -e "start slave';"
 
    echo -e "地址: $IP\n端口: 3306\n服务: MySQL主从复制发生错误,系统已自动跳过错误,请后续跟进处理。\n发生时间: `date +"%F %T"`" \
 
    | mail -s '主从复制错误警告'  xxxxxx@xxx.com
 
fi
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章