mysql主从检验_MySQL主从检验一致性工具pt-table-checksum报错的案例分析

问题】

有同事反馈我们改造过的MySQL5.7.23版本,使用pt-table-checksum工具比较主从数据库的一致性时报错

100ef0e8aac0c50397d06502e119b5a3.png

Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. REPLACE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.

这个问题隐藏的比较深,经过反复测试,终于定位到原因了。

【pt-table-checksum工具的关键处理流程】

1、 pt-table-checksum工具有一部分处理逻辑,对于binlog_format为ROW模式的复制,会在master和slave上设置binlog_format=STATEMENT,确保从库也会执行 checksum SQL

803b13ff2707be99a1fc47127c5e8c9e.png

2、接下来执行REPLACE INTO的语句

c8d3501227913501c6f36f313272d623.png

3、前面同事反馈的报错就发生在运行REPLACE INTO语句时

对于Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. REPLACE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.的报错,其实是warning信息

当执行set session binlog_format='statement'后运行REPLACE INTO,在MySQL5.6,5.7的版本中都会报warning

90048cc4b7b3b571e60c7f449c34a680.png

关键的差异在于warning的code编号发生了变化,在MySQL5.6及原生MySQL5.7下是1592,在我们改造过的MySQL5.7.23下是1593

6f752ebf9d61c560af437cd286bc731b.png

4、从源码中看到pt-table-checksum对1592的code做了忽略,当出现1592的warnings时会继续下面的处理,而当编号变为1593时,pt-table-checksum工具在这里就直接报Error了

a2343f51d1da6a20713b7449c7e3c111.png

将pt-table-checksum代码中的1592修改为1593,再次运行,恢复正常

3b41cc8c9af634239e0be292bd1fcb73.png

【为什么MySQL5.7.23下的code会发生变化】

应该与我们MySQL源码改造时,新增提示信息有关,对应的code值是在编译时动态生成,由于中间新定义了报错信息,后面的error code值都增加1

0d8bd3bc4603e2203540c2bf7ea2a750.png

本身error code的值并不影响功能使用,但正好遇到第三方的pt-table-checksum工具这里代码写死了code值,所以导致了上面的问题。

【改进方案】

1、 为了更好的兼容性,建议大家在自定义提示信息时放在代码最下面,这样不影响其他code值的生成,

2、 当前版本中如果有checksum的需求,可以临时修改vim /usr/bin/pt-table-checksum,增加1593的warning信息过滤

fdd6b3fa54b68bdcd940c88d89db2edf.png

f0492dfed2b74cbedb6f57b356c63bb7.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值