percona-toolkit中 pt-table-checksum的使用
为了减少对数据库的干预,pt-table-checksum还会自动侦测并连接到从库,当然如果失败,可以指定--recursion-method选项来告诉从库在哪里。它的易用性还体现在,复制若有延迟,在从库 checksum 会暂停直到赶上主库的计算时间点(也通过选项--设定一个可容忍的延迟最大值,超过这个值也认为不一致)。
注意:第一次运行的时候需要加上--create-replicate-table参数,生成checksums表!!如果不加这个参数,那么就需要在对应库下手工添加这张表了,表结构SQL如下:
常用参数解释:
--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only :只显示不同步的信息。
--replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
--databases= :指定需要被检查的数据库,多个则用逗号隔开。
--tables= :指定需要被检查的表,多个用逗号隔开
h= :Master的地址
u= :用户名
p=:密码
P= :端口
分别在主库和从库授权:
在主库执行授权(一定要对主库 *ip* 授权,授权的用户名和密码可以自行定义,不过要保证这个权限能同时登陆主库和从库)
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON *.* TO 'root'@'192.168.1.101' identified by '123456';
mysql> flush privileges;
在从库上执行授权
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'root'@'192.168.1.101' IDENTIFIED BY '123456';
mysql> flush privileges;
但是后续也有报错,因为主库没有创建表的权限。所以我后面又给主库所有的权限。
这是模板命令:
[root@master-server ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --create-replicate-table --databases=huanqiu --tables=haha h=192.168.1.101,u=root,p=123456,P=3306
这是我的命令,其实是差不多的。
pt-table-checksum h='10.10.10.110',u='checksums',p='111111',P=3306,S=/tmp/mysql_3306.sock -d xuning --nocheck-binlog-format --recursion-method=hosts --nocheck-replication-filters --replicate=xuning.checksums
命令要注意,关于数据库的是没有-的,每个参数都以‘,’结尾。
报错处理:
----------
Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information.
----------
show slave hsots;
mysql> show slave hosts ;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+-----------+------+------+-----------+--------------------------------------+
| 2 | | 3308 | 1 | d087ea99-5cda-11e8-aaad-000c2940422b |
+-----------+------+------+-----------+--------------------------------------+
1 row in set (0.02 sec)
发现是空的,因为我是一个机器上测试的两个实例做的主从。所以没有识别到。
添加参数 --recursion-method=hosts解决。
----------
Replica mysql-test-01 has binlog_format ROW which could cause pt-table-checksum to break replication. Please read "Replicas using row-based replication" in the LIMITATIONS section of the tool's documentation. If you understand the risks, specify --no-check-binlog-format to disable this check.
----------
因为主从开启了binlog-format开启了row复制。
添加--nocheck-binlog-format解决。
----------
[root@mysql-test-01 local]# pt-table-checksum h='10.10.10.110',u='checksums',p='111111',P=3306,S=/tmp/mysql_3306.sock --nocheck-binlog-format --recursion-method=hosts --nocheck-replication-filters
Checking if all tables can be checksummed ...
Starting checksum ...
DBD::mysql::db do failed: Access denied for user 'checksums'@'10.10.10.110' to database 'percona' [for Statement "CREATE DATABASE IF NOT EXISTS `percona` /* pt-table-checksum */"] at /usr/bin/pt-table-checksum line 11876.
05-29T11:29:17 --replicate database percona does not exist and it cannot be created automatically. You need to create the database.
----------
主库要有创建表的权限。
所以后来给主库添加了创建的权限。
展示的结果:
[root@mysql-test-01 local]# pt-table-checksum h='10.10.10.110',u='checksums',p='111111',P=3306,S=/tmp/mysql_3306.sock -d test --nocheck-binlog-format --recursion-method=hosts --nocheck-replication-filters --create-replicate-table
Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
05-29T11:49:48 0 0 1 0 1 0 0.129 test.csz
Checksumming test.sbtest1: 95% 00:01 remain
05-29T11:50:56 0 0 1159821 0 16 0 68.104 test.sbtest1
05-29T11:51:14 0 0 1000000 0 10 0 18.023 test.sbtest2
05-29T11:51:29 0 0 1000000 0 9 0 15.018 test.sbtest3
05-29T11:51:44 0 0 1000000 0 9 0 14.770 test.sbtest4
05-29T11:51:58 0 0 1000000 0 9 0 14.505 test.sbtest5
[root@mysql-test-01 local]#
解释:
TS :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
ROWS :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名。
参考链接:https://www.cnblogs.com/kevingrace/p/6261091.html
pt-table-sync
同步:
第一个账号是主,第二个账号是从 建议 使用--print打印并不执行。直接执行会出问题
pt-table-sync --replicate=xuning.t0529 h='10.10.10.110',u='jiaxuning',p='111111',S=/tmp/mysql_3306.sock h='10.10.10.110',u='jiaxuning',p='111111',S=/tmp/mysql_3308.sock --replicate=xuning.checksums --print
pt-table-sync --replicate=xuning.t0529 h='10.10.10.110',u='jiaxuning',p='111111',P=3306 h='10.10.10.110',u='jiaxuning',p='111111',P=3308 --print