通过pt-table-checksum和pt-table-sync解决mysql主从及主主架构数据不一致问题

作者:吴业亮

博客: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

发布了235 篇原创文章 · 获赞 120 · 访问量 81万+

猜你喜欢

转载自blog.csdn.net/wylfengyujiancheng/article/details/97946129