Write by lyc at 2018-11-22
pt-table-checksum使用实践

pt-table-checksum

  • 用于检测MySQL主、从库的数据是否一致。
  • 最重要的一点就是:要在主库上授权,能让主库ip访问。这一点不能忘记!(实验证明从库上可以不授权,但最好还是从库也授权)
    注意:
    • 根据测试,需要一个即能登录主库,也能登录从库的账号;
    • 只能指定一个host,必须为主库的IP;
    • 在检查时会向表加S锁;
    • 运行之前需要从库的同步IO和SQL进程是YES状态。

1.添加授权用户

1
2
3
4
# master
mysql > create user 'checksum'@'192.168.%.%';
mysql > GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, PROCESS, SUPER, LOCK TABLES, REPLICATION SLAVE ON *.* TO 'checksum'@'192.168.%.%' IDENTIFIED BY 'nzKmnfea9vap5lOksawETDbR';
mysql > flush privileges;

2.执行 pt-table-checksum

1
2
3
4
5
6
7
8
9
10
11
12
# 语法:
$ pt-table-checksum [OPTIONS] [DSN]
## [DSN] 主库的信息h=,P=,u=,p=

# 例:
$ pt-table-checksum --recursion-method="processlist" \
--nocheck-replication-filters \
--no-check-binlog-format \
--replicate=test.checksums20190228 \
--create-replicate-table \
--databases=test \
h=192.168.99.207,P=3306,u=checksum,p=nzKmnfea9vap5lOksawETDbR >> /root/checksum/run.log

[OPTIONS] 常用参数解释:

  • --nocheck-replication-filters 不检查复制过滤器,建议启用。后面可以用–databases来指定需要检查的数据库。
  • --no-check-binlog-format 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
  • --replicate= 把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
  • --create-replicate-table 第一次检查会创建表
  • --replicate-check-only 只显示不同步的信息。
  • --databases= 指定需要被检查的数据库,多个则用逗号隔开。不写检查所有库
  • --tables= 指定需要被检查的表,多个用逗号隔开,不加即检查整个库的所有表
  • h=192.168.99.207 连主库

[DSN] 常用参数解释:

  • h= Master的地址
  • u= 用户名
  • p= 密码
  • P= 端口

3.检查结果分析

从结果可以看出不一致的表,及不一致的行数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ pt-table-checksum --recursion-method="processlist" \
--nocheck-replication-filters \
--no-check-binlog-format \
--replicate=test.checksums_test_20201217 \
--create-replicate-table \
--databases=test \
h=10.19.xxx.xxx,P=3306,u=checksum,p=nzKmnfea9vap5lOksawETDbR > /root/checksums_test_20201217.log
Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
11-22T15:16:19 0 0 100000 0 4 0 0.789 test.sbtest1
11-22T15:16:19 0 0 100000 0 1 0 0.643 test.sbtest2
11-22T15:16:20 0 0 100000 0 1 0 0.647 test.sbtest3
11-22T15:16:20 0 1 1 4 1 0 0.029 test.tb1
11-22T15:16:20 0 0 10 0 1 0 0.026 test.test

解释:

  • TS 完成检查的时间。
  • ERRORS 检查时候发生错误和警告的数量。
  • DIFFS 0表示一致,1表示不一致。当指定–no-replicate-check时,会一直为0,当指定–replicate-check-only会显示不同的信息。
  • ROWS 表的行数。
  • DIFF_ROWS 不一致的行数
  • CHUNKS 被划分到表中的块的数目。
  • SKIPPED 由于错误或警告或过大,则跳过块的数目。
  • TIME 执行的时间。
  • TABLE 被检查的表名。