检查主从数据一致性,咱们使用pt-table-checksum ,pt-table-checksum是percona-tools一个工具,用来校验主从库数据是否是一致。html
做为一个MySQL DBA 这个包里percona-tools的工具,建议你们都学习一下。java
# wget https://www.percona.com/downloads/percona-toolkit/3.0.6/binary/redhat/7/x86_64/percona-toolkit-3.0.6-1.el7.x86_64.rpm # yum localinstall percona-toolkit-3.0.6-1.el7.x86_64.rpm
--replicate=db1.checksum
: 表示把结果存放到db1.checksum表中,默认是在percona.checksum表中。
--recursion-method="processlist"
: 表示以什么方式发现从库。咱们这里使用 processlist方式。这种方式要求主库和从库端口必须相同。若是不相同,只能使用DSN方式。node
--databases=dbname
:表示校验指定库,不验证其余库。若是是全部库,能够不加这个参数就能够。若是要验证多个库,能够用逗号分隔,例如--databases=db1,db2,db3
--tables=tbname
: 表示检验指定的表。
--nocheck-binlog-format
:不让命令检测binlog 格式,使用这个命令的时候,使用的帐号和密码 也必须能够从主库登陆从库才能够。不然就报没法链接从库的错误。Cannot connect to P=3306,h=dev-hd-node3,p=...,u=root
--replicate-check-only
:表示只显示不一致的信息。一致信息就不显示了。只要有显示表示出现了不一致。mysql
TS:完成检查的时间。
ERRORS:检查时候发生错误和警告的数量。
DIFFS:0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不一样的信息。
ROWS:被检查表的行数
CHUNKS:被划分到表中的块的数目。
SKIPPED:因为错误或警告或过大,则跳过块的数目。
TIME:执行的时间。
TABLE:被检查的表名。sql
# pt-table-checksum --nocheck-binlog-format --replicate=db1.checksum -h localhost -P3306 -u root -p unixfbi --databases=db1 --recursion-method="processlist" Checking if all tables can be checksummed ... Starting checksum ... Cannot connect to P=3306,h=dev-hd-node3,p=...,u=root 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 01-26T16:08:00 0 0 44 1 0 0.005 db1.tb1 01-26T16:08:00 0 0 13 1 0 0.004 db1.tb2
使用 --ignore-databases
参数,例如忽略mysql库的检测。运维
# pt-table-checksum --nocheck-binlog-format -h localhost -P3306 -u root -p unixfbi --ignore-databases=mysql --recursion-method="processlist" Checking if all tables can be checksummed ... Starting checksum ... TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 01-26T16:26:16 0 1 30 1 0 0.013 db1.checksum 01-26T16:26:16 0 0 44 1 0 0.013 db1.tb1 01-26T16:26:16 0 0 13 1 0 0.012 db1.tb2 01-26T16:26:16 0 0 1 1 0 0.012 db2.tb3 01-26T16:26:16 0 0 1 1 0 0.012 db2.tb4 01-26T16:26:16 0 0 6 1 0 0.013 sys.sys_config 01-26T16:26:16 0 0 2 1 0 0.013 wbx3306.t1 01-26T16:26:16 0 0 0 1 0 0.013 wbx3306.tp_1
# pt-table-checksum --nocheck-binlog-format -h localhost -P3306 -u root -p unixfbi --ignore-databases=mysql --recursion-method="processlist" --replicate-check-only Checking if all tables can be checksummed ... Starting checksum ... Differences on dev-hd-node3 TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY db1.checksum 1 0 1
--databases=dbname
--tables=tbname
须要用到这两个参数工具
# pt-table-checksum --nocheck-binlog-format -h localhost -P3306 -u root -p unixfbi --databases=db1 --tables=checksum --recursion-method="processlist" --replicate-check-only Checking if all tables can be checksummed ... Starting checksum ... Differences on dev-hd-node3 TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY db1.checksum 1 0 1
工做中一个表里可能有几百万甚至几千万条数据,若是对这样的表进行一致性检测的话,花费的时间会很长。因此咱们能够对表进行分段检测,例如检测前1000行数据,或者5000行到10000行之间的数据。
其实咱们这里是使用的 --where
参数;学习
# pt-table-checksum --nocheck-binlog-format -h localhost -P3306 -u root -p unixfbi --databases=db1 --tables=checksum --recursion-method="processlist" --replicate-check-only --where="id < 20"
https://www.percona.com/software/database-tools/percona-toolkit
https://www.percona.com/doc/percona-toolkit/LATEST/index.html
http://blog.itpub.net/12679300/viewspace-1454837/spa
本文出自 “运维特工” 博客,转载请务必保留原文连接 和 http://www.unixfbi.com.net