MySQL主从检验一致性工具pt-table-checksum报错的案例分析
【问题】
有同事反馈我们改造过的MySQL5.7.23版本,使用pt-table-checksum工具比较主从数据库的一致性时报错

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

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

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

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

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

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

【为什么MySQL5.7.23下的code会发生变化】
应该与我们MySQL源码改造时,新增提示信息有关,对应的code值是在编译时动态生成,由于中间新定义了报错信息,后面的error code值都增加1

本身error code的值并不影响功能使用,但正好遇到第三方的pt-table-checksum工具这里代码写死了code值,所以导致了上面的问题。
【改进方案】
1、 为了更好的兼容性,建议大家在自定义提示信息时放在代码最下面,这样不影响其他code值的生成,
2、 当前版本中如果有checksum的需求,可以临时修改vim /usr/bin/pt-table-checksum,增加1593的warning信息过滤


MySQL主从检验一致性工具pt-table-checksum报错的案例分析的更多相关文章
- MySQL执行外部sql脚本文件命令是报错:unknown command
使用source导入外部sql文件: mysql> source F:\php\bookorama.sql; -------------- source F: -------------- ER ...
- Mysql报错注入原理分析(count()、rand()、group by)
Mysql报错注入原理分析(count().rand().group by) 0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截 ...
- MySQL 5.7 Invalid default value for 'CREATE_TIME'报错的解决方法
出处:http://blog.itpub.net/15498/viewspace-2136006/ 由于数据库的升级,今天在执行从MySQL 5.6导出来的SQL文件时报错: mysql> so ...
- 踩坑记:mysql timeStamp默认值0000-00-00 00:00:00 报错
报错现象: 从mysql5.5数据库导出的数据结构放到mysql5.7.10 报错create_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00 ...
- MySQL truncate含有外键约束的条目报错
1.报错信息: Cannot truncate a table referenced in a foreign key constraint 2.出现错误操作: truncate table a1; ...
- 解决Only a type can be imported. com.mysql.jdbc.Connection resolves to a package的报错问题
写jsp加载数据驱动以后老是提示Only a type can be imported. com.mysql.jdbc.Connection resolves to a package的错误,然而改成 ...
- 【MySQL】MySQL同步报错-> received end packet from server, apparent master shutdown: Slave I/O thread: Failed reading log event, reconnecting to retry报错解决和分析
[root@db-ft-db-48 ~]# tail -f /mysqlLog/beside_index_err.log 140102 20:42:26 [Note] Slave: received ...
- MySql 插入10位以上长度的字符报错or截断
当a字段为int类型时: 如果用MyBatis向MySql插入10个字符以上长度的字符串,则会报错. 如果直接在MySql中用sql语句插入10个字符以上长度的字符串,则会变成最大的int类型数值:2 ...
- mysql数据库表字段使用DESC等关键字报错及解决方法
<!-- desc是MySQL数据库的关键字,作为字段名直接使用会报错 --><sql id="Base_Column"> id,mol,ip,port,n ...
随机推荐
- 样本服从正态分布,证明样本容量n乘样本方差与总体方差之比服从卡方分布x^2(n)
样本服从正态分布,证明样本容量n乘样本方差与总体方差之比服从卡方分布x^2(n) 正态分布的n阶中心矩参见: http://www.doc88.com/p-334742692198.html
- JavaScript--Dom间接选择器
一.Dom间接选择器 间接查找的属性 parentNode // 父节点 childNodes // 所有子节点 firstChild // 第一个子节点 lastChild // 最后一个子节点 n ...
- vim文本删除方法 Linux
1,先打开某个文件: vim filename 2,转到文件结尾 在命令模式输入 G 3,转到10行 在命令模式输入 10G 4,删除所有内容:先用G 转到文件尾,然后使用下面命令: :1, .d ...
- axios 参数拼接
// 加载列表 getData () { this.$http .get("platform-framework/stucgbb/selectCHBBInit?type="+thi ...
- ORACLE递归查询(适用于ID,PARENTID结构数据表)
Oracle 树操作(select…start with…connect by…prior) oracle树查询的最重要的就是select…start with…connect by…prior语法了 ...
- 字符串日期转化以及yyyy-MM-dd HH:mm:ss大小写解释
字符串日期转化 字符串转换为Calendar对象: // 日期字符串 private String dateStr; // 将字符串转换后的Calender对象 private Calendar ca ...
- day64_SpringMVC学习笔记_02
1.springmvc对多视图的支持 (1)导入xml格式视图支持的jar包 注意:springmvc本身就支持xml格式,所以不用导入其他支持的jar包了. (2)在springmvc.xml中 ...
- javascript 简单工厂模式
var Bicycle = new Interface("Bicycle",["assemble","wash","ride&qu ...
- 一组数字,从1到n,从中减少了3个数,顺序打乱,放在n-3的数组里,找出丢失数字
曾经看到有这样一个JS题:有一组数字,从1到n,从中减少了3个数,顺序也被打乱,放在一个n-3的数组里请找出丢失的数字,最好能有程序,最好算法比较快假设n=10000 下面我也来贴一个算法. func ...
- ASP.NET Web API queryString访问的一点总结
自从开始使用ASP.NET Web API,各种路由的蛋疼问题一直困扰着我,相信大家也都一样. Web API的路由配置与ASP.MVC类似,在App_Start文件夹下,有一个WebApiConfi ...