一.简介:
该软件是由由领先的MySQL咨询公司Percona发布的
Percona的很多软件我只能说是强!!!改公司开发的部分工具软件甚至已经超越oracle 自身所开发的工具软件
因此不用怀疑这个公司开发的软件会不会带来什么风险
pt-table-checksum,pt-table-sync
是percona-toolkit工 具集的工具之一用来检查与修复主从不一致数据之用。它通过在主库执行基于statement模式的sql语句来生成主库数据块的总和校验,把相同的sql语句传递到从库,并在从库上计 算相同数据块的总和校验,最后,比较主从库上相同数据块的总和校验值,由此判断主从数据是否一致。这种校验是分表进行的,在每个表内部又 是分块进行的,而且pt工具本身提供了非常多的限流选项,因此对线上服务的冲击较小
二.环境
主 192.168.186.138 [root@mysql2 ~] mysql2.com
从192.168.186.140 [root@dbserver1 ] dbserver1.com
三.安装
(1).安装相关依赖包:
[root@mysql2 opt]# yum -y install perl-DBI perl-DBD-MySQL perl-TermReadKey
(2).安装percona-toolkit
可以rpm 方式也可以源代码编译
我这里用源代码编译
[root@mysql2 opt]# tar -xf percona-toolkit-2.2.2.tar.gz [root@mysql2 percona-toolkit-2.2.2]# perl Makefile.PL [root@mysql2 percona-toolkit-2.2.2]# make && make install
四:授权
主机mysql 上授权
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'opt'@'192.168.186.138' IDENTIFIED BY '123'; Query OK, 0 rows affected (0.03 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
五.检测
[root@mysql2 local]# pt-table-checksum h='192.168.186.138',u='opt',p='123',P=3306 -d lisi --nocheck-replication-filters --no-check-binlog-format --replicate=test.wocao Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information. TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 07-20T18:41:58 0 0 655360 10 0 4.498 lisi.book Checksumming lisi.haowutest: 52% 00:27 remain Checksumming lisi.haowutest: 92% 00:04 remain 07-20T18:43:05 0 0 7676940 70 0 66.694 lisi.haowutest 07-20T18:43:05 0 0 2 1 0 0.118 lisi.j 07-20T18:43:05 0 0 2 1 0 0.099 lisi.l 07-20T18:43:05 0 0 0 1 0 0.145 lisi.lisi 07-20T18:43:05 0 0 3 1 0 0.134 lisi.o 07-20T18:43:05 0 0 0 1 0 0.057 lisi.wanger 07-20T18:43:06 0 0 7 1 0 0.166 lisi.wanger1 07-20T18:43:06 0 0 0 1 0 0.144 lisi.ww
在这里还引申出了一个知识点
我本来想在从上删除lisi.haowutest表的一部分数据 然后跳过错误 再做一次检查 既然发现slave_skip_errors =1045 没有用 这是怎么回事呢
原来myql 表授权信息变了
[root@dbserver1 data]# cat master.info 发现授权给slave的连接密码已经和mysql.user表里面的不一致了
所以我建议mysql库还是不要同步的好 省的发生乱起八糟 不可思议的问题。关于授权在线上曾经发生过很多奇葩的问题在此不做讨论了
实验继续
现在haowu.test表数据时不一致的情况下检测 DIFFS为0表示一致为1表示不一致
[root@mysql2 data]# pt-table-checksum h='192.168.186.138',u='opt',p='123',P=3306 -d lisi --nocheck-replication-filters --no-check-binlog-format --replicate=test.wocao TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 07-20T21:04:44 0 0 655360 10 0 7.600 lisi.book Checksumming lisi.haowutest: 74% 00:10 remain 07-20T21:05:28 0 1 7676940 58 0 43.484 lisi.haowutest 07-20T21:05:28 0 0 2 1 0 0.069 lisi.j 07-20T21:05:28 0 0 2 1 0 0.061 lisi.l 07-20T21:05:28 0 0 0 1 0 0.083 lisi.lisi 07-20T21:05:28 0 0 3 1 0 0.063 lisi.o 07-20T21:05:28 0 0 0 1 0 0.074 lisi.wanger 07-20T21:05:28 0 0 7 1 0 0.064 lisi.wanger1 07-20T21:05:28 0 0 0 1 0 0.063 lisi.ww
可以看出lisi.haowutest 有记录数不一致 上去看看是不是这样
[root@mysql2 data]# mysql -phaowu123 mysql> select count(*) from lisi.haowutest; +----------+ | count(*) | +----------+ | 7676940 | +----------+ 1 row in set (10.35 sec) [root@dbserver1 data]# mysql -phaowu123 mysql> select count(1) from lisi.haowutest; +----------+ | count(1) | +----------+ | 7676632 | +----------+ 1 row in set (7.22 sec)
果然不一致
六.修复
[root@mysql2 data]# pt-table-sync --print --sync-to-master h=192.168.186.140,D=lisi,t=haowutest -uopt -p123
查看下
解释:
pt-table-sync --print --sync-to-master h=1.1.1.1,D=test,t=test1 -uxxx -p123(其中这个xxx用户密码要机能登录到master也能登录到slave,需要的权限select,super,replication client,process)
修复从库1.1.1.1上test库的test表上的数据
如果把--print换成--execute则是直接执行 建议先用--print保存下看看再--execute 这样看到sql执行比较放心
可以打开gengral log很容易看到master和slave上执行的操作,分别去一段段的数据做对比校验 ,有不同的立刻用replace into在master去执行
[root@mysql2 data]# pt-table-sync --execute --sync-to-master h=192.168.186.140,D=lisi,t=haowutest -uopt -p123
这就是修复了
话虽如此但是要是不行的话 还是在两边都授个全部权限吧
mysql> grant all on *.* to we@'%' identified by '123'; Query OK, 0 rows affected (0.03 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> \q Bye [root@mysql2 data]# pt-table-sync --execute --sync-to-master h=192.168.186.138,h=192.168.186.140,D=lisi,t=haowutest -uwe -p123 OK 至此结束 [root@dbserver1 data]# mysql -phaowu123 mysql> select count(*) from lisi.haowutest; +----------+ | count(*) | +----------+ | 7676940 | +----------+ 1 row in set (7.25 sec) [root@mysql2 data]# mysql -phaowu123 mysql> select count(*) from lisi.haowutest; +----------+ | count(*) | +----------+ | 7676940 | +----------+ 1 row in set (7.25 sec)
修复完成
七.命令参数详解
不指定参数,表示对本地的所有数据库的表进行检查。[root@mysql2 Desktop]#pt-table-checksum u=root,p=haowu123
参数说明:
TS :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :0表示一致,1表示不一致。
ROWS :行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名。
参数意义:
--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。就是说如果是row模式必须加上这玩意
--replicate-check-only :只显示不同步的信息。
--replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
--databases= :指定需要被检查的数据库,多个则用逗号隔开。
--tables= :指定需要被检查的表,多个用逗号隔开
更多的参数请见官网
如有疑问建议请提出,谢谢!!