mysql主从配置干什么_mysql主从配置之slave_exec_mode=IDEMPOTENT详解

本文详细介绍了MySQL主从配置中slave_exec_mode=IDEMPOTENT参数的作用,该参数使得在备机上遇到主键、唯一键冲突或更新、删除找不到记录时,仍能保持复制的冥等性,避免断开复制。通过实验,展示了在insert、update和delete场景下,备机如何处理冲突以保持一致性。需要注意的是,表必须有主键且该模式不适用于DDL操作和字段长度不一致的情况。
摘要由CSDN通过智能技术生成

slave_exec_mode=IDEMPOTENT是一个什么意思呢,在参考网站主从配置时有一些人要求slave_exec_mode=IDEMPOTENT哦,下面我们一起来看看关于它的详解吧。

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这样的粗暴跳过错误方法可能破坏主备一致性。但官方文档的描述很简洁,我一直好奇slave_exec_mode=IDEMPOTENT是如何在复制出错时保持一致性的--譬如主键冲突时是简单跳过还是覆写,今天在Percona 5.7下做了个实验(binlog是row格式),实验过程就省略了,直接总结如下:

1.insert场景

此时insert into语句在备机的效果就跟replace into一样,但却并不是把insert into转换成replace into来执行,分两种情况:

a.MySQL配置成autocommit,直接一条insert into ...

如这样的insert

insert into test set c1='a',c2='b';

此时insert into语句在备机执行时假如遇到主键冲突就先转化为delete再insert

delete from test where c1='old_value' and c2='old_value';

insert into test set c1='a',c2='b';

假如遇到非主键的唯一键冲突就转换为update

update test set set c1='a',c2='b' where c1='old_value' and c2='old_value';

b.当显示开始事务时(begin...insert into...commit;)

如这样的sql

begin;

......

insert into test set c1='a',c2='b';

......

commit;

此时begin...commit里的insert into语句在备机执行时假如遇到主键冲突、唯一键冲突都是先转化为delete再insert

begin;

......

delete from test where c1='old_value' and c2='old_value';

insert into test set c1='a',c2='b';

......

commit;

2.update场景

当备机不存在要更新的记录,这条update不执行

3.delete场景

同update场景一样,备机啥也不干

注意:使用冥等模式时表要有主键

冥等模式并不是万能的,除了不能对DDL操作冥等,对字段长度不同导致的错误也不是冥等(譬如主机一个字段是char(20)而备机是char(10)),还有一个限制就是表有主键才会对insert的冥等设置有效:因为insert的冥等行为是通过主键来判断备机是否有重复值从而产生覆写操作,如果表没有主键,则备机即使设了冥等也可能会比主机多重复数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值