使用方法:
pt-table-checksum [OPTIONS] [DSN]
pt-table-checksum:在主<M>上通过执行校验的查询对复制的一致性进行检查,对比主从的校验值,从而产生结果。DSN指向的是主的地址,该工具的退出状态不为零,如果发现有任何差别,或者如果出现任何警告或错误,更多信息请见官网。
不指定任何参数,会直接对本地的所有数据库的表进行检查。
如果报错:
Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information.
因为找不到从,所以执行失败。用参数--recursion-method 可以指定模式解决,关于--recursion-method参数的设置有:
关于--recursion-method参数的设置有:
METHOD USES
=========== =============================================
processlist SHOW PROCESSLIST
hosts SHOW SLAVE HOSTS
cluster SHOW STATUS LIKE 'wsrep\_incoming\_addresses'
dsn=DSN DSNs from a table
none Do not find slaves
默认是通过show processlist 找到host的值或show slave hosts 找到host的值。
还有一种方法是show slave hosts;前提从库配置文件里面已经配置自己的地址和端口:
# grep 'report' /etc/my.cnf
report_host = 192.168.56.56
report_port = 3306
最重要的一点是我们需要在从库上授权,能让主库访问。
注意:
1、 根据测试,需要一个即能登录主库,也能登录从库的账号;
2、 只能指定一个host,必须为主库的IP;
3、 在检查时会向表加S锁;
4、 运行之前需要从库的同步IO和SQL进程是YES状态。
# pt-table-checksum --replicate=lgj.checksums --nocheck-replication-filters --no-check-binlog-format --databases=lgj --tables=tb01 h=127.0.0.1,u=repl,p=oracle,P=3306
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
03-02T17:32:34 0 1 1 1 0 1.158 lgj.tb01
通过DIFFS 是1 就可以看出主从的表数据不一致。怎么不一致呢? 通过指定--replicate=lgj.checksums 参数,就说明把检查信息都写到了checksums表中。
进入SLAVE相应的库中查看checksums表的信息
TS :完成检查的时间。
ERRORS :不一致的chunk数量。当指定 --no-replicate-check 即检查完但不立即输出结果时,会一直为0;当指定 --replicate-check-only 即不检查只从checksums表中计算crc32,且只显示不一致的信息(毕竟输出的大部分应该是一致的,容易造成干扰)。
DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
ROWS :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名。
参数的意思:
--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only :只显示不同步的信息。
--replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
--databases= :指定需要被检查的数据库,多个则用逗号隔开。
--tables= :指定需要被检查的表,多个用逗号隔开
--ignore-databases :排除某些库。
--ignore-tables :排除某些表。
--where :可以使用限定条件。
h=127.0.0.1 :Master的地址
u=repl :用户名
p=oracle :密码
P=3306 :端口