pt-table-checksum使用实践

在工作中接触最多的就是mysql replication,由于现在公司也还在使用mysql 5.1.x版本,在复制方面还是比较多的问题,比如主库宕机或者从库宕机都会导致复制中断,通常我们需要进行人为修复(mysql 5.5版本解决大部分问题),或者很多时候需要把一个从库提升为主库,但对从库和主库的数据一致性不能保证一样,所以就利用 pt-table-checksum 工作来检查主从的一致性,以及通过 pt-table-sync 如何修复这些不一致的数据。当然如果你数据量小,slave只是当做一个备份使用,那么出现数据不一致完全可以重做,或者通过其他方法解决。如果数据量非常大,重做就是非常蛋碎的一件事情了。^_^

工具安装:

yum install -y  perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl-ExtUtils-MakeMaker perl-Digest-MD5

wget http://www.percona.com/downloads/percona-toolkit/2.2.13/tarball/percona-toolkit-2.2.13.tar.gz
tar -zxvpf percona-toolkit-2.2.13.tar.gz
cd percona-toolkit-2.2.13
perl Makefile.PL
make
make install

/*

假如,在执行perl Makefile.PL 报如下错误:

Can't locate ExtUtils/Embed.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .).
BEGIN failed--compilation aborted.

需要安装perl-ExtUtils-Embed:

yum install perl-ExtUtils-Embed -y

*/

使用方法:

pt-table-checksum [OPTIONS] [DSN]

pt-table-checksum:在主(master)上通过执行校验的查询对复制的一致性进行检查,对比主从的校验值,从而产生结果。DSN指向的是主的地址,该工具的退出状态不为零,如果发现有任何差别,或者如果出现任何警告或错误,更多信息请查看官方资料。

下面通过实际的例子来解释该工具如何使用:

主库:

mysql> select *  from yayun.t1;
+----+-------+
| id | name  |
+----+-------+
|  1 | yayun |
|  2 | atlas |
|  3 | mysql |
+----+-------+
3 rows in set (0.00 sec)mysql> 

备库:

mysql> select * from yayun.t1;
+----+----------+
| id | name     |
+----+----------+
|  1 | yayun    |
|  2 | atlas    |
|  3 | mysql    |
|  4 | dengyy   |
|  5 | love sql |
+----+----------+
5 rows in set (0.00 sec)mysql> 

很明显主从数据不一致,那么我们使用工具来检测:

[root@MySQL-01 ~]# pt-table-checksum --nocheck-replication-filters --replicate=yayun.checksums --databases=yayun --tables=t1 h=127.0.0.1,u=root,p=123456,P=3306
Replica MySQL-02 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.
[root@MySQL-01 ~]# 

从错误信息得出,要是不改binlog模式的话,则在执行上面的命令时候要指定:
--no-check-binlog-format,即:

[root@MySQL-01 ~]# pt-table-checksum --nocheck-replication-filters  --no-check-binlog-format --replicate=yayun.checksums --databases=yayun --tables=t1 h=127.0.0.1,u=root,p=123456,P=3306
Cannot connect to P=3306,h=192.168.0.20,p=...,u=root
Diffs cannot be detected because no slaves were found.  Please read the --recursion-method documentation for information.TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
04-13T15:44:23      0      0        3       1       0   0.044 yayun.t1
[root@MySQL-01 ~]# 

Diffs cannot be detected because no slaves were found.  Please read the --recursion-method documentation for information.

这个报错又是为什么呢?很多文章都没有说到,我真搞不清楚那文章怎么写出来的,囧。。。。

上面的提示信息很清楚,因为找不到从,所以执行失败。用参数--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的值。

mysql> show processlist\G
*************************** 1. row ***************************Id: 3User: slaveHost: 192.168.0.20:52352db: NULL
Command: Binlog DumpTime: 4164State: Master has sent all binlog to slave; waiting for binlog to be updatedInfo: NULL
*************************** 2. row ***************************Id: 33User: rootHost: localhostdb: NULL
Command: QueryTime: 0State: NULLInfo: show processlist
2 rows in set (0.00 sec)

还有一种方法是show slave hosts;前提从库配置文件里面已经配置自己的地址和端口:

[root@MySQL-02 ~]# grep 'report' /etc/my.cnf
report_host = 192.168.0.20
report_port = 3306
[root@MySQL-02 ~]# 

mysql> show slave hosts;
+-----------+--------------+------+-----------+
| Server_id | Host         | Port | Master_id |
+-----------+--------------+------+-----------+
|         2 | 192.168.0.20 | 3306 |         1 |
+-----------+--------------+------+-----------+
1 row in set (0.00 sec)mysql> 

所以找不到从服务器时。在从库配置文件添加

report_host=slave_ip

report_port=slave_port

最重要的一点是我们需要在从库上授权,能让主库访问。很多文章没提,却能正常进行,不得不说大牛就是牛B

注意:

1、  根据测试,需要一个即能登录主库,也能登录从库的账号;

2、  只能指定一个host,必须为主库的IP;

3、  运行之前需要从库的同步IO和SQL进程是YES状态。

mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'root'@'192.168.0.10' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)mysql> 

现在我们再来检测数据一致性:

[root@MySQL-01 ~]# pt-table-checksum --nocheck-replication-filters  --no-check-binlog-format --replicate=yayun.checksums --databases=yayun --tables=t1 h=127.0.0.1,u=root,p=123456,P=3306TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
04-13T15:59:31      0      1        3       1       0   0.080 yayun.t1
[root@MySQL-01 ~]# 

TS            :完成检查的时间。
ERRORS        :检查时候发生错误和警告的数量。
DIFFS         :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
--我个人发现当差异数据量较少时,diffs代表差异的数目。但当差异量比较大时,diffs和chunks比较接近。如: 
      TS        ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME   TABLE
07-02T02:03:24      0     39   453915      41       0 124.189 ccda.pending_0
ROWS          :表的行数。
CHUNKS        :被划分到表中的块的数目。
SKIPPED       :由于错误或警告或过大,则跳过块的数目。
TIME          :执行的时间。
TABLE         :被检查的表名。

参数的意思:

--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format      : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only :只显示不同步的信息。
--replicate=   :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。 也可以指定不存在的数据库,校验时会自动创建该数据库,在该库下生成检查表。
--databases=   :指定需要被检查的数据库,多个则用逗号隔开。
--tables=      :指定需要被检查的表,多个用逗号隔开
h=127.0.0.1    :Master的地址
u=root         :用户名
p=123456       :密码
P=3306         :端口

好了,命令以及常用参数都介绍了,一起解释下上面执行的效果:
通过DIFFS 是1 就可以看出主从的表数据不一致。怎么不一致呢? 通过指定--replicate=yayun.checksums 参数,就说明把检查信息都写到了checksums表中。
进入SLAVE相应的库中查看checksums表的信息:

mysql> select * from checksums\G
*************************** 1. row ***************************db: yayuntbl: t1chunk: 1chunk_time: 0.010735chunk_index: NULL
lower_boundary: NULL
upper_boundary: NULLthis_crc: babf1dc0    #slavethis_cnt: 5           #slavemaster_crc: 8727436a    #mastermaster_cnt: 3           #master                 可以发现表t1中从库比主库多2条记录ts: 2014-04-13 16:05:16
1 row in set (0.00 sec)mysql> 

通过上面找到了这些不一致的数据表,如何同步数据呢?即如何修复MySQL主从不一致的数据,让他们保持一致性呢?利用另外一个工具 pt-table-sync。
使用方法:

pt-table-sync [OPTIONS] DSN [DSN]

pt-table-sync: 高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据。他可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。

接着上面的复制情况,主和从的t1表数据不一致,需要修复,
执行:

先master的ip,用户,密码,然后是slave的ip,用户,密码

[root@MySQL-01 ~]# pt-table-sync --replicate=yayun.checksums h=127.0.0.1,u=root,p=123456 h=192.168.0.20,u=root,p=123456 --port 3306 --print
DELETE FROM `yayun`.`t1` WHERE `id`='4' LIMIT 1 /*percona-toolkit src_db:yayun src_tbl:t1 src_dsn:h=127.0.0.1,p=...,u=root dst_db:yayun dst_tbl:t1 dst_dsn:h=192.168.0.20,p=...,u=root lock:1 transaction:1 changing_src:yayun.checksums replicate:yayun.checksums bidirectional:0 pid:2190 user:root host:MySQL-01*/;
DELETE FROM `yayun`.`t1` WHERE `id`='5' LIMIT 1 /*percona-toolkit src_db:yayun src_tbl:t1 src_dsn:h=127.0.0.1,p=...,u=root dst_db:yayun dst_tbl:t1 dst_dsn:h=192.168.0.20,p=...,u=root lock:1 transaction:1 changing_src:yayun.checksums replicate:yayun.checksums bidirectional:0 pid:2190 user:root host:MySQL-01*/;
[root@MySQL-01 ~]# 

参数的意义:

--replicate=  :指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。
--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     :执行命令。

如果文件生成的语句太多,可以将语句输出到一个文件中,如:

pt-table-sync --replicate=yayun.checksums h=127.0.0.1,u=root,p=123456 h=192.168.0.20,u=root,p=123456 --port 3306 --print

>/download/a.sh

命令介绍完了,一起解释下执行的效果:通过(--print)打印出来了修复数据的sql语句,可以手动的去从行执行,让他们数据保持一致性。那能否直接执行?当然可以,通过(--execute)

[root@MySQL-01 ~]# pt-table-sync --replicate=yayun.checksums h=127.0.0.1,u=root,p=123456 h=192.168.0.20,u=root,p=123456 --execute

没发现任何异常,然后检查主从数据的一致性:

[root@MySQL-01 ~]# pt-table-checksum --nocheck-replication-filters  --no-check-binlog-format --replicate=yayun.checksums --databases=yayun --tables=t1 h=127.0.0.1,u=root,p=123456,P=3306TS ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME TABLE
04-13T16:27:28      0      0        3       1       0   0.097 yayun.t1
[root@MySQL-01 ~]# 

主库:

mysql> select * from t1;
+----+-------+
| id | name  |
+----+-------+
|  1 | yayun |
|  2 | atlas |
|  3 | mysql |
+----+-------+
3 rows in set (0.00 sec)mysql> 

备库:

mysql> select * from t1;
+----+-------+
| id | name  |
+----+-------+
|  1 | yayun |
|  2 | atlas |
|  3 | mysql |
+----+-------+
3 rows in set (0.00 sec)mysql> 

OK,数据已经保持一致了。不过建议还是用--print 打印出来的好,这样就可以知道那些数据有问题,可以人为的干预下。不然直接执行了,出现问题之后更不好处理。总之还是在处理之前做好数据的备份工作。

注意:要是表中没有唯一索引或则主键则会报错:

Can't make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10591.

报错了,--print就看不到任何差异,--execute也不会执行,必须得加上主键或者唯一索引,才能检测差异性。

总结:

工具很给力,工作中常常在使用。注意使用该工具需要授权,一般SELECT, PROCESS, SUPER, REPLICATION SLAVE等权限就已经足够了。

作者:Atlas

出处:Atlas的博客 yayun - 博客园

您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

补充:

percona toolkit是怎样校验一主多从的架构呢?

如:我的测试环境主是10.192.203.201,两个从10.192.203.202,10.192.203.107都指向主203.201.

现模拟些许差异:

203.107的t6表和主库的t6表值不一样。

203.107的t3表,203.202的t3表都和主库的t3表值不一样。

203.201:
mysql> select * from t6;
+------+
| id  |
+------+
|   2 |
+------+
1 row in set (0.00 sec)
mysql> select * from t3;
Empty set (0.00 sec)203.202:
mysql> select * from t6;
+------+
| id  |
+------+
|   2 |
+------+mysql> select * from dba.t3;
+------+
| id  |
+------+
|   1 |
|   2 |
+------+
2 rows in set (0.01 sec)203.107:
mysql> select * from dba.t6;
+------+
| id  |
+------+
|  22 |
+------+
1 row in set (0.00 sec)
mysql> select * from dba.t3;
+----+
| id |
+----+
|  4|
+----+
1 row in set (0.00 sec)

校验主从一致性:

[root@PC shell_script]# pt-table-checksum--nocheck-replication-filters --no-check-binlog-format --replicate=abc.checksums --databases=dba  h=127.0.0.1,u=root,p=system@123,P=3307

TS ERRORS  DIFFS     ROWS CHUNKS SKIPPED    TIME TABLE

08-01T16:28:56      0     0        6       1      0   0.120 dba.checksums

08-01T16:28:56      0     0        1       1      0   0.132 dba.t11

08-01T16:28:56      0     0        0       1      0   0.143 dba.t12

08-01T16:28:57      0     1        0       1      0   0.408 dba.t3

08-01T16:28:57      0     1        1       1      0   0.136 dba.t6

08-01T16:28:57      0     0        1       1      0   0.136 dba.t7

08-01T16:28:57      0     0        3       1      0   0.291 dba.t99

08-01T16:28:58      0     0        0       1      0   0.169 dba.t999

08-01T16:28:58      0     0        2       1      0   0.391 dba.testcourse

可以看到检测出了dba.t3和dba.t6的差异。

查看有哪些差异?

只需要指定任意一个从库即可,它会检测出主和所有从库的差异。

[root@PC shell_script]# pt-table-sync--charset=UTF8 --replicate=abc.checksums h=127.0.0.1,u=root,p=system@123h=10.192.203.202,u=root,p=system@123--port 3307 --print

DELETE FROM `dba`.`t3` WHERE `id`='4' LIMIT1 /*percona-toolkit src_db:dba src_tbl:t3src_dsn:A=UTF8,P=3307,h=127.0.0.1,p=...,u=root dst_db:dba dst_tbl:t3dst_dsn:A=UTF8,P=3307,h=10.192.203.107,p=...,u=root lock:1 transaction:1changing_src:abc.checksums replicate:abc.checksums bidirectional:0 pid:9962user:root host:PC*/;
DELETE FROM `dba`.`t6` WHERE `id`='22'LIMIT 1 /*percona-toolkit src_db:dba src_tbl:t6src_dsn:A=UTF8,P=3307,h=127.0.0.1,p=...,u=root dst_db:dba dst_tbl:t6dst_dsn:A=UTF8,P=3307,h=10.192.203.107,p=...,u=root lock:1 transaction:1changing_src:abc.checksums replicate:abc.checksums bidirectional:0 pid:9962user:root host:PC*/;
REPLACE INTO `dba`.`t6`(`id`) VALUES ('2')/*percona-toolkit src_db:dba src_tbl:t6src_dsn:A=UTF8,P=3307,h=127.0.0.1,p=...,u=root dst_db:dba dst_tbl:t6dst_dsn:A=UTF8,P=3307,h=10.192.203.107,p=...,u=root lock:1 transaction:1changing_src:abc.checksums replicate:abc.checksums bidirectional:0 pid:9962user:root host:PC*/;
DELETE FROM `dba`.`t3` WHERE `id`='1' LIMIT1 /*percona-toolkit src_db:dba src_tbl:t3src_dsn:A=UTF8,P=3307,h=127.0.0.1,p=...,u=root dst_db:dba dst_tbl:t3dst_dsn:A=UTF8,P=3307,h=10.192.203.202,p=...,u=root lock:1 transaction:1changing_src:abc.checksums replicate:abc.checksums bidirectional:0 pid:9962user:root host:PC*/;
DELETE FROM `dba`.`t3` WHERE `id`='2' LIMIT1 /*percona-toolkit src_db:dba src_tbl:t3src_dsn:A=UTF8,P=3307,h=127.0.0.1,p=...,u=root dst_db:dba dst_tbl:t3dst_dsn:A=UTF8,P=3307,h=10.192.203.202,p=...,u=root lock:1 transaction:1changing_src:abc.checksums replicate:abc.checksums bidirectional:0 pid:9962user:root host:PC*/;

pt-table-sync --charset=UTF8--replicate=abc.checksums h=127.0.0.1,u=root,p=system@123h=10.192.203.202,u=root,p=system@123 --port 3307 –execute

在203.107上查看,t3,t6表已经和主库保持一致了。

同时还参考:pt-table-checksum — Percona Toolkit Documentation

percona-toolkit检查主从一致性相关推荐

  1. Percona Toolkit工具简介

    系列文章目录 第一章:sql_mode模式 第二章:optimize table.analyze table.alter table.gh-ost 第三章:InnoDB MVCC原理 第四章:sql语 ...

  2. mysql主从数据库验证_数据库主从一致性验证

    数据库数据一致性检验部署文档 1.pt-table-checksum 安装: 各个版本一览地址:http://www.percona.com/downloads/percona-toolkit/ 我们 ...

  3. percona toolkit 简介

    os: centos 7.4 db: mysql 5.7 software: toolkit 3.0.8 percona toolkit 是一款percona公司推出的优秀的开源的mysql分析工具. ...

  4. Percona Toolkit安装

    TIPS 本文基于Percona Toolkit 3.2.0,理论支持所有版本. Percona Toolkit是一款MySQL世界里面非常实用的工具套件,本文来探讨如何安装它. 工具列表 pt-al ...

  5. Want to archive tables? Use Percona Toolkit’s pt-archiver--转载

    原文地址:https://www.percona.com/blog/2013/08/12/want-to-archive-tables-use-pt-archiver/ Percona Toolkit ...

  6. mysql 工具_最全Mysql运维工具Percona Toolkit使用案例

    Percona Toolkit简介 Percona Toolkit简称pt工具,是Percona公司开发用于管理MySQL的工具,DBA熟悉掌握后将极大提高工作效率. Percona toolkit有 ...

  7. mysql开启yum search pt-mysql_Centos使用MySQL工具Percona Toolkit

    Centos使用MySQL工具Percona Toolkit 安装Percona Toolkit 的Repo 得以支持直接用yum 安装二进制包 yum install -y https://www. ...

  8. DB主从一致性架构优化4种方法

    DB主从一致性架构优化4种方法 需求缘起 大部分互联网的业务都是"读多写少"的场景,数据库层面,读性能往往成为瓶颈.如下图:业界通常采用"一主多从,读写分离,冗余多个读库 ...

  9. percona toolkit系列(gh-ost)

    背景 和上篇pt-osc同样功能的工具gh-ost(使用的是binlog复制数据),目前是为了修改表结构 online DDL 写在前面 (该工具并不是percona toolkit中的,只是为了读者 ...

最新文章

  1. Ascend Pytorch算子功能验证
  2. mongodb索引--从55.7秒到毫秒级别
  3. 70佳精美的PSD素材免费下载(上篇)
  4. linux 日志工具 logrotate 简介
  5. mysql多表分析_mysql多表查询实例结果及分析-2017.12.14
  6. 计算机视觉与深度学习 | 激光雷达点云配准与拼接(基于ICP算法):附matlab源代码
  7. java经典100例算法题_10道java经典算法题,每一题都能帮你提升java水平!
  8. 关于SAP成都研究院的一些微信公众号文章
  9. 对象的单数组表示(用单数组实现链表-不一样的链表实现)
  10. mfc使用cef源代码实现_如何获得微信小游戏跳一跳源码以及源代码组合包括哪些...
  11. Memory Management Registers(GDTR, LDTR, IDTR, and TR)
  12. Ubuntu Server 使用 PPA 安装 Java (JDK) 8
  13. ibm服务器单盘从装系统,thinkpad系统重装图文详解
  14. 人用药品注册技术规定国际协调会议(ICH)
  15. 制作PPT的常用网站及一些基本原则
  16. linux磁盘组修复,Linux磁盘坏道的检测及修复
  17. 跑马灯(走马灯)的js实现
  18. 第三章 Guarded Suspension模式 等我准备好哦
  19. 易企秀如何生成图片_易企秀如何制作圆形照片
  20. 用计算机四舍五入偷银行储户的钱,银行家舍入VS四舍五入(下):.NET发现之旅(四)...

热门文章

  1. 在 Excel 中创建强大图表的三个技巧
  2. tensorflow训练过程的日志与监控
  3. 计算机病毒恶搞程序,【图片】我写的恶搞软件【病毒吧】_百度贴吧
  4. WordPress替换前端字体插件
  5. python+selenium——详解介绍Selenium常用API的使用--python语言(完整版)
  6. 三大受欢迎的免费开源CMS建站系统
  7. requests和正则re的使用抓取某小说文本(附带源码)
  8. 机器学习笔记—13(李宏毅版)神经网络压缩与元学习
  9. 有耗介质中,电磁波的波速与频率的关系?--电磁波的色散效应
  10. mysql当前读与快照读