作者:吴业亮
博客:http://blog.csdn.net/wylfengyujiancheng
1、简介:
pt-table-checksum是percona-toolkit系列工具中的一个, 可以用来检测主、 从数据库中数据的一致性。其原理是在主库上运行, 对同步的表进行checksum, 记录下来
在MySql主从复制架构的应用中,长时间运行的DB出现各种异常之后,可能会有主备不一致的情况产生,影响正常的业务。
pt-table-checksum用于校验主从数据的一致性,而pt-table-sync用于同步MySQL表之间的数据,它可以同步单个表,也可以同步整个库,但是不同步表结构、索引、或任何其他模式对象。
pt-table-sync: 高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据。他可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。
注意事项:
1、根据测试,需要一个即能登录主库,也能登录从库的账号;
2、只能指定一个host,必须为主库的IP;
3、在检查时会向表加S锁;
4、如果master和slave的binlog日志不是STATEMENT格式,要用--no-check-binlog-format选项
5、运行之前需要从库的同步IO和SQL进程是YES状态。
6、表要有主键索引或唯一键索引
2、安装
1)、下载路径:
https://www.percona.com/downloads/percona-toolkit/LATEST/
2)、将包下载到本地,本地安装
# yum localinstall percona-toolkit-3.0.13-1.el7.x86_64.rpm -y
3、执行检查
# pt-table-checksum --nocheck-replication-filters --replicate=sbtest.checksums --databases=sbtest u=root,p=Changeme_123,P=3306 --no-check-binlog-format
Checking if all tables can be checksummed ...
Starting checksum ...
*******************************************************************
Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
possibly with SSL_ca_file|SSL_ca_path for verification.
If you really don't want to verify the certificate and keep the
connection open to Man-In-The-Middle attacks please set
SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
*******************************************************************
at /usr/bin/pt-table-checksum line 332.
*******************************************************************
Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
possibly with SSL_ca_file|SSL_ca_path for verification.
If you really don't want to verify the certificate and keep the
connection open to Man-In-The-Middle attacks please set
SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
*******************************************************************
at /usr/bin/pt-table-checksum line 332.
# A software update is available:
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
07-31T18:19:25 0 3 233190 0 6 0 1.393 sbtest.sbtest1
07-31T18:19:26 0 1 232483 0 1 0 1.239 sbtest.sbtest10
07-31T18:19:27 0 1 233046 0 1 0 1.295 sbtest.sbtest2
07-31T18:19:28 0 1 233628 0 1 0 1.341 sbtest.sbtest3
07-31T18:19:30 0 1 233678 0 1 0 1.237 sbtest.sbtest4
07-31T18:19:31 0 1 233558 0 1 0 1.318 sbtest.sbtest5
07-31T18:19:32 0 1 233574 0 1 0 1.331 sbtest.sbtest6
07-31T18:19:34 0 1 232862 0 1 0 1.293 sbtest.sbtest7
07-31T18:19:35 0 1 232671 0 1 0 1.302 sbtest.sbtest8
07-31T18:19:36 0 1 233767 0 1 0 1.303 sbtest.sbtest9
命令参数说明
--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only :只显示不同步的信息。
--replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
--databases= :指定需要被检查的数据库,多个则用逗号隔开。
--tables= :指定需要被检查的表,多个用逗号隔开
h=192.168.1.128 :Master的地址
u=root :用户名
p=123456 :密码
P=3306 :端口
结果参数说明:
TS :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
ROWS :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名
检查不同步的信息都会存到表中,查看表信息
mysql> select * from sbtest.checksums ;
+--------+----------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
| db | tbl | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc | master_cnt | ts |
+--------+----------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
| sbtest | sbtest1 | 1 | 0.01258 | PRIMARY | 1 | 1963 | 1f305f0a | 1000 | 1f305f0a | 1000 | 2019-07-31 18:28:43 |
| sbtest | sbtest1 | 2 | 0.113481 | PRIMARY | 1965 | 80373 | 54a40311 | 39745 | 54a40311 | 39745 | 2019-07-31 18:28:43 |
| sbtest | sbtest1 | 3 | 0.346247 | PRIMARY | 80375 | 7935194 | cf113aba | 164726 | cf113aba | 164726 | 2019-07-31 18:28:43 |
| sbtest | sbtest1 | 4 | 0.06081 | PRIMARY | 7935197 | 9999979 | 1c7c9ca5 | 27719 | 1c7c9ca5 | 27719 | 2019-07-31 18:28:43 |
| sbtest | sbtest1 | 5 | 0.009748 | PRIMARY | NULL | 1 | 0 | 0 | 0 | 0 | 2019-07-31 18:28:43 |
| sbtest | sbtest1 | 6 | 0.008853 | PRIMARY | 9999979 | NULL | 0 | 0 | 0 | 0 | 2019-07-31 18:28:43 |
| sbtest | sbtest10 | 1 | 0.513638 | NULL | NULL | NULL | 325835b2 | 232483 | 325835b2 | 232483 | 2019-07-31 18:28:45 |
| sbtest | sbtest2 | 1 | 0.554448 | NULL | NULL | NULL | 36ca5d7d | 233046 | 36ca5d7d | 233046 | 2019-07-31 18:28:46 |
| sbtest | sbtest3 | 1 | 0.516257 | NULL | NULL | NULL | 516720f9 | 233628 | 516720f9 | 233628 | 2019-07-31 18:28:47 |
| sbtest | sbtest4 | 1 | 0.521816 | NULL | NULL | NULL | a1dd3bfc | 233678 | a1dd3bfc | 233678 | 2019-07-31 18:28:49 |
| sbtest | sbtest5 | 1 | 0.518534 | NULL | NULL | NULL | 59373086 | 233558 | 59373086 | 233558 | 2019-07-31 18:28:50 |
| sbtest | sbtest6 | 1 | 0.53181 | NULL | NULL | NULL | d285e61d | 233574 | d285e61d | 233574 | 2019-07-31 18:28:52 |
| sbtest | sbtest7 | 1 | 0.532816 | NULL | NULL | NULL | f9c66dfb | 232862 | f9c66dfb | 232862 | 2019-07-31 18:28:53 |
| sbtest | sbtest8 | 1 | 0.523428 | NULL | NULL | NULL | a8fdf9c5 | 232671 | a8fdf9c5 | 232671 | 2019-07-31 18:28:54 |
| sbtest | sbtest9 | 1 | 0.504875 | NULL | NULL | NULL | 3a2777eb | 233767 | 3a2777eb | 233767 | 2019-07-31 18:28:56 |
+--------+----------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
15 rows in set (0.00 sec)
mysql>
注意:
# pt-table-checksum --nocheck-replication-filters --replicate=sbtest.checksums --databases=sbtest u=root,p=Changeme_123,P=3306 --no-check-binlog-format
Replica slave has binlog_format MIXED 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 为MIXED格式,会破坏同步,可以使用–no-check-binlog-format选项来关闭检查
将不同步的信息打印出来
# pt-table-sync --replicate=sbtest.checksums h=node1,u=root,p=Changeme_123,P=3306 h=node2,u=root,p=Changeme_123,P=3306 --print
4、执行同步
# pt-table-sync --replicate=sbtest.checksums h=node1,u=root,p=Changeme_123,P=3306 h=node2,u=root,p=Changeme_123,P=3306 --execute
参数说明:
--replicate= :指定通过pt-table-checksum得到的表.
--databases= : 指定执行同步的数据库,多个用逗号隔开。
--tables= :指定执行同步的表,多个用逗号隔开。
--sync-to-master :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。
h=127.0.0.1 :服务器地址,命令里有2个ip,第一次出现的是Master的地址,第2次是Slave的地址。
u=root :帐号。
p=123456 :密码。
--print :打印,但不执行命令。
--execute :执行命令。
5、再次检查主库和从库都一致的
# pt-table-checksum --nocheck-replication-filters --replicate=sbtest.checksums --databases=sbtest u=root,p=Changeme_123,P=3306 --no-check-binlog-format
Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
07-31T18:28:44 0 0 233190 0 6 0 1.441 sbtest.sbtest1
07-31T18:28:45 0 0 232483 0 1 0 1.313 sbtest.sbtest10
07-31T18:28:47 0 0 233046 0 1 0 1.371 sbtest.sbtest2
07-31T18:28:48 0 0 233628 0 1 0 1.332 sbtest.sbtest3
07-31T18:28:49 0 0 233678 0 1 0 1.367 sbtest.sbtest4
07-31T18:28:51 0 0 233558 0 1 0 1.562 sbtest.sbtest5
07-31T18:28:52 0 0 233574 0 1 0 1.315 sbtest.sbtest6
07-31T18:28:54 0 0 232862 0 1 0 1.360 sbtest.sbtest7
07-31T18:28:55 0 0 232671 0 1 0 1.314 sbtest.sbtest8
07-31T18:28:56 0 0 233767 0 1 0 1.330 sbtest.sbtest9
参考:
https://www.cnblogs.com/xuanzhi201111/p/4180638.html
转载:https://blog.csdn.net/wylfengyujiancheng/article/details/97946129
查看评论