发现pt-table-checksum bug例子
一.起因
由于全公司在组织学习MySQL。正在学到MySQL安装、 复制这一块,我的霸道总裁突然霸气十足的问我 ‘’你如何检测主从不一致呢‘’,我回答说 当然是
,从而引出了下文.
pt-table-checksum
二.描述
MySQL5.7 主从环境
percona-toolkit-2.2.20-1.noarch
创建了一个test_xx的库root@localhost:mysql.sock [(none)]>create database test_xx;
Query OK, 1 row affected (0.01 sec)
创建表
| aa | CREATE TABLE `aa` (
`id` int(11) NOT NULL,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
插入数据"root@localhost:mysql.sock [test_xx]>insert into aa values(1,'a'),(4,'a');
从库删除数据
"root@localhost:mysql.sock [test_xx]>delete from aa;
Query OK, 2 rows affected (0.01 sec)
执行pt语句校队
[root@localhost ~]# pt-table-checksum --no-check-binlog-format --replicate=pt.cheksum --databases=test_xx -h 192.168.230.132 -u aa -predhat -P 3306 --recursion-method='processlist'
我的霸道总裁就喊我了 快来给我看看 。只能放下手里的砖先,开开心心的过去。
三 排错
开始以为是我的参数问题,各种调试。霸道总裁在旁边坐着好紧张QAQ 过了10分钟 还是没搞定。 霸道总裁突然说是不是_(下划线)问题呢。 去除_(下划线)重新创建库 插入表 插入数据 从库删除数据 还是不好使。。。 淡淡的忧伤 今天果然运气不好啊。 突然机智的总裁说 是不是 数据库的名字有长度限制呢。这就给了我一丝希望 就安装霸道总裁的意思 创建库名casdfdsfsf 创建表 插入数据 从库删除数据 结果好用了 好神奇 突然感觉世界都亮了。
我的霸道总裁告诉我 会不会是 因为test或者_的原因呢。经过各种 创建库 创建表 插入数据 从库删数据 等等操作。。
结果发现 机智的霸道总裁的结论的是对的 因为有test开头。 霸道总裁有没有好机智, 是不是快爱上霸道总裁了。
然后通过阅读pt-table-checksum
的代码 发现 代码7617行
if ( $db =~ m/information_schema|performance_schema|lost\+found|percona|percona_schema|test/ ) {
在percona-toolkit-3.0.3 已经修复了
if ( $db =~ m/^(information_schema|performance_schema|lost\+found|percona_schema)$/ ) {
在/usr/bin/pt-table-checksum 中修复
if ( $db =~ m/information_schema|performance_schema|lost\+found|percona|percona_schema/ ) {
[root@localhost ~]# pt-table-checksum --no-check-binlog-format --replicate=pt.cheksum --databases=test_xx -h 192.168.230.132 -u aa -predhat -P 3306 --recursion-method='processlist'
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
09-08T10:48:15 0 1 2 1 0 0.044 test_xx.aa
四总结
知其然也要知其所以然,发现问题 不要方 。要养成阅读代码的习惯。