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

工具安装:

1.软件下载:

[root@MySQL-01 ~]# wget http://www.percona.com/downloads/percona-toolkit/LATEST/RPM/percona-toolkit-2.2.7-1.noarch.rpm

2.安装该工具依赖的软件包:

[root@MySQL-01 ~]# yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes -y

3.软件安装:

[root@MySQL-01 ~]# rpm -ivh percona-toolkit-2.2.7-1.noarch.rpm
Preparing...                ########################################### [100%]1:percona-toolkit        ########################################### [100%]
[root@MySQL-02 ~]# 

使用方法:

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、  在检查时会向表加S锁;

4、  运行之前需要从库的同步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会显示不同的信息。
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 --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     :执行命令。

命令介绍完了,一起解释下执行的效果:通过(--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.

总结:

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

参考资料:

http://www.percona.com/doc/percona-toolkit/2.2/pt-table-checksum.html

转载于:https://www.cnblogs.com/gomysql/p/3662264.html

pt-table-checksum使用实践相关推荐

  1. mysql pt table sync_pt-table-sync 使用介绍

    pt-table-sync:对两个库不一致的数据进行同步,他能够自动发现两个实例间不一致的数据,然后进行sync操作,pt-table-sync无法同步表结构,和索引等对象,只能同步数据 一.表没有主 ...

  2. 一起进阶学习JAVA:MySQL海量数据存储与优化

    一起进阶学习JAVA:MySQL海量数据存储与优化 第一部分 分库分表实战及中间件 1.1 背景介绍 1.1.1 背景描述 刚开始我们的系统只用了 单机数据库 随着用户的不断增多,考虑到系统的高可用和 ...

  3. 关于不同的MySQL复制解决方案概述

    我在解决方案团队工作多年,发现数据库复制总是被误解,甚至有些人根本完全不理解,所以本文将来回顾一下MySQL环境中的复制概念,并且澄清一些大家对于复制的误解. 什么是复制? 复制:保证信息被复制并有目 ...

  4. MySQL 运维和第三方工具

    Yearning Yearning简介 Yearning 开源的MySQL SQL语句审核平台,提供数据库字典查询,查询审计,SQL审核等多种功能. Yearning 1.x 版本需Inception ...

  5. 四万字!掌握Flink Table一篇就够了

    学习工具与软件版本:开发软件IDEA.Flink1.10.2.Kafka2.0.0.Scala2.11 本章建议有一定Flink基础的伙伴学习 Apache Flink介绍.架构.原理以及实现:点击这 ...

  6. 对比MySQL表数据内容方式汇总

    一. mysql自带的checksum命令: 可在不同服务器通过checksum值对比两张表是否一致, 加上EXTENDED参数表示逐行扫描, 结果更为可靠; 执行过程会给表加上System lock ...

  7. MySQL之一致性检测及数据同步

    前言 当MySQL数据库架构使用主从时,由于事务创建和提交的顺序并不一致.例如我们先创建A事务,在创建B事务,但我们在提交的时候可能先提交B事务,在提交A事务.此时我们从服务在重放二进制日志时,会先执 ...

  8. 【转载】【FS】FATFS文件系统介绍(未完待续........2018.4.1)

    一.这是个什么玩意 它是一个文件系统,那文件系统是个什么玩意,直接从字面意思理解,它就是个管理文件的系统,所以叫文件系统,直白吧,也可以说是文件存储协议.但是继续追问的话会问,怎么来管理文件呢?好,基 ...

  9. 西电微机系统课程设计步进电机开环控制系统

    ** 微机系统与应用课程设计 课题二 步进电机开环控制系统设计** 一.程设计目的 掌握微机系统总线与各芯片管脚连接方法,提高接口扩展硬件电路的连接能力. 加深对 A/D 和并行接口芯片的工作方式和编 ...

  10. 【原创】【FS】FATFS文件系统介绍(未完待续........2018.4.1)

    一.这是个什么玩意 它是一个文件系统,那文件系统是个什么玩意,直接从字面意思理解,它就是个管理文件的系统,所以叫文件系统,直白吧,也可以说是文件存储协议.但是继续追问的话会问,怎么来管理文件呢?好,基 ...

最新文章

  1. Android 控件 之 Menu 菜单
  2. python3 字符串 和 列表(list)互相转换
  3. 绕过CDN查找真实IP 方法简介
  4. Apache Ignite(五):Ignite的集群部署
  5. 信息学奥赛C++语言: 趣味整数3(回文数)
  6. Vue使用html2canvas将Dom转化为图片
  7. clickhouse 同步mysql_ClickHouse 常用管理命令
  8. 开闭鸿蒙都只为风味情浓,[红楼梦引子]开辟鸿蒙, 谁为情种? 都只为风月情浓。 趁着...
  9. EL表达式JSTL标签库小结
  10. perfect forward secrecy
  11. POI2011 同谋者 Conspiracy
  12. 中文简体与繁体的转换
  13. 升级iOS13后悔怎么办?手把手教你iOS系统降级,只要简单几步就可以!
  14. Hacked Exam 14pts 2021Google codejam round1A
  15. 无须注册的云盘平台anonfile
  16. 利用VBA筛选重复数据
  17. linux ls和ll命令学习小结
  18. 【论文】学术论文写作总结
  19. 开发人员真实编写的骚注释,你学废了么?
  20. 易语言认识易语言数据类型

热门文章

  1. Ettercap-中间人欺骗
  2. nginx 优化(突破十万并发)
  3. 手工杀毒之“三十六计”
  4. python密码传参有特殊字符如何解决_Python为什么我在RSA加密中有特殊字符
  5. ajax同步和异步的区别_纯电动汽车搭载的交流异步电机与永磁同步电机有何区别?...
  6. android xml黑体字_为 Android 换上任意喜欢的字体,你可以试试这个 Magisk 模块
  7. Spring Cloud整合Nacos实现动态配置
  8. fastdfs删除过期文件_Spring Boot 系列:使用 Spring Boot 集成 FastDFS
  9. torch.round()
  10. oracle数据库11g完全卸载,oracle 11g完全卸载