主从数据一致检查及修复工具:pt-table-checksum和pt-table-sync

首先,这两个命令都是由percona-toolkit提供,可以安装此软件包:

1.percona-toolkit的安装:

(1).安装相关依赖包:

主要有perl,per-DBD-MySQL

(2).安装percona-toolkit

  1. [root@client102 ~]# rpm -ivh percona-toolkit-2.2.6-1.noarch.rpm   
  2. 注:此时安装完成后,上面两个命令就已经有了  

2.在master上做授权操作:(IP为主库IP地址)

  1. mysql> grant select ,process,super,replication slave on *.* to ‘checksums’@’192.168.1.102’ identified by ‘checksums’;  
  2. mysql> flush privileges;  
  3.   注:select:查看所有库的表;process:执行show processlist ;super:设置binlog_format=‘statement’  
  4.          replication slave:show slavehosts  

3.数据库主从结构:

主:192.168.1.102(binlog_format=row)

从:192.168.1.103(binlog_format=row)

(1).主从执行数据一致检查:

  1. [root@client102 ~]# pt-table-checksum h=’192.168.1.102′,u=’checksums’,p=’checksums’,P=3306 -d kz –nocheck-replication-filters –no-check-binlog-format –replicate=kz.checksums  
  2.             TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE  
  3. 03-09T02:34:46      0      0        2       1       0   0.270 kz.b  
  4.   
  5. 注: –nocheck-replication-filters:不检查复制过滤器(即参数文件里设置的repliacte-do-waild-table等规则)  
  6.        —no-check-binlog-format :不检查复制的binlog格式(这个参数在,binlog_format=row时,一定要加,不然报错)  
  7.        –replicate=kz.checksums:把checksum的信息写入指定库,指定表,建议直接写到被检查的库里  
  8.        –create-replicate-table:这个参数在第一次运行时添加,用于建立checksums表(但是我测试没加,表能正常建立)  
  9.        –ignore-tables=mysql.user:对某个表忽略检查  
  10.   
  11. 执行结果显示参数意义:  
  12.  TS            :完成检查的时间。  
  13. ERRORS     :检查时候发生错误和警告的数量。  
  14. DIFFS        :0表示一致,1表示不一致。当指定–no-replicate-check时,会一直为0,当指定–replicate-check-only会显示不同的信息。  
  15. ROWS       :表的行数。  
  16. CHUNKS    :被划分到表中的块的数目。  
  17. SKIPPED    :由于错误或警告或过大,则跳过块的数目。  
  18. TIME         :执行的时间。  
  19. TABLE       :被检查的表名。  

(2).下面我们制造数据不一致的情况:
我们这里直接复制出查询结果:(我发现,当你数据不一致的情况,复制还是正常的)

  1. 主库数据结果:  
  2. mysql> select * from b;  
  3. +—+——+  
  4. | a | b    |  
  5. +—+——+  
  6. | 1 |    1 |  
  7. | 3 |    3 |  
  8. | 5 |    5 |  
  9. | 6 |    6 |  
  10. | 7 |    7 |  
  11. +—+——+  
  12. 从库数据结果:  
  13. mysql> select * from b;  
  14. +—+——+  
  15. | a | b    |  
  16. +—+——+  
  17. | 1 |    1 |  
  18. | 2 |    2 |  
  19. | 3 |    3 |  
  20. | 4 |    4 |  
  21. | 5 |    5 |  
  22. | 6 |    6 |  
  23. | 7 |    7 |  
  24. +—+——+  
  25. 注:此时数据不一致了吧,但你发现其复制还是正常的  

(3)再次检查数据不一致的情况:

  1. [root@client102 ~]# pt-table-checksum h=’192.168.1.102′,u=’checksums’,p=’checksums’,P=3306 -d kz –nocheck-replication-filters –no-check-binlog-format –replicate=kz.checksums  
  2.             TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE  
  3. 03-09T02:51:05      0      1        5       1       0   0.041 kz.b  
  4. 注:此时 diffs 显示为1:表示主从数据不一致了  

(4).这是我们需要知道哪些数据不一致了,可以使用如下命令实现(不一致数据太多建议输入到一个文件里)

  1. [root@client102 ~]# pt-table-sync –replicate=kz.checksums h=’192.168.1.102′,u=’checksums’,p=’checksums’ h=’192.168.1.103′,u=’checksums’,p=’checksums’  –print  

(5).我们知道数据不一致,那么就要执行修复操作,如下:

  1. [root@client102 ~]# pt-table-sync –replicate=kz.checksums h=’192.168.1.102′,u=’checksums’,p=’checksums’ h=’192.168.1.103′,u=’checksums’,p=’checksums’  –execute  
  2. 注:此时我们再来看看主从的数据情况(可以使用pt-table-checksum检查,这里为了直观,直接查看数据)  
  3.        以上命令检查有个重要事项:就是这张表上必须有主键或唯一索引  
  4.        监听端口不一致时,说检查比较麻烦,没有测试,等以后用到了再测试  
  5.        我们经常设置从机具有只读属性(read-only=1),但是这个属性对具有super权限的用户是无效的,其可正常写入  
  6. 从数据:[这里我们直接看从上的数据,是不是和主上数据一致就行,发现一致了吧,神奇的东西]  
  7. mysql> select * from b;  
  8. +—+——+  
  9. | a | b    |  
  10. +—+——+  
  11. | 1 |    1 |  
  12. | 3 |    3 |  
  13. | 5 |    5 |  
  14. | 6 |    6 |  
  15. | 7 |    7 |  
  16. +—+——+  

Author: Michael

关注数据分析,挖掘数据金矿。

Leave a Reply

Your email address will not be published. Required fields are marked *