percona-toolkit工具检查mysql复制一致性及修复不一致性

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

percona-toolkit工具检查MySQL复制一致性及修复

 

 

一、pt-table-checksum检查主从库数据的一致性

  pt-table-checksum在MASTER上校验指定库、表,将结果存在一个库表里,复制进程将检验sql传递到slave上再执行一次。通过比较M/S的检验值确定数据是否一致。利用主从复制做检验,不需要在检验期间对主从数据库同时锁表,可以控制校验的数据和速度,不影响到正常服务。

安装:

1、安装依赖包
yum  install  perl perl-devel perl-DBI perl-DBD-MySQL perl-TermReadKey perl-IO-Socket-SSL 
perl-Time-HiRes -y

2、#percona-toolkit包
wget 
3、编译安装
 tar xzvf percona-toolkit-2.2.4.tar.gz ; 
 cd percona-toolkit-2.2.4 ;  
 perl Makefile.pl && make && make install

使用方法:

pt-table-checksum [OPTIONS] [DSN]

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

 

1、不指定任何参数,会直接对本地的所有数据库的表进行检查:

pt-table-checksum –S /tmp/mysqld.sock u=root,p=123456

实验环境: 

wKioL1aYTXHgZhlFAAASFlqX2hE478.png




2、在Master上初始化实验数据

1
2
3
4
5
6
create  database  mvbox;
use mvbox;
create  table  test(id  int  primary  key , name  varchar (20));
insert  into  test  values (1, 'a' ),(2, 'b' ),(3, 'c' ),(4, 'd' );
 
因为主从环境已经搭建,这些数据会自动同步到Slave上。

 

3、在Slave从库添加一个数据,模拟主从数据不一致的场景。

注意,这里模拟的是slave数据比master数据多

1
2
3
insert  into  test  values (5, 'e' );
 
insert  into  test  values (6, 'f' );


在Master主库执行pt-table-checksum命令,因为主从环境,这个数据会复制到Slave

也就是说Slave的percona.checksums表,存放的是主库数据的校验码。

所以在Slave对数据执行同样的校验,然后比对checksums表中的数据,就可以验证主从是否一致。


4、注意:

1
2
3
4
5
a、  根据测试,需要一个即能登录主库,也能登录从库,而且还能同步数据库的账号;
b、  只能指定一个host,必须为主库的IP;
c、  在检查时会向表加S锁;
d、  运行之前需要从库的同步IO和SQL进程是YES状态。
5、所以执行pt-table-checksum命令的帐号,至少需要有全库的只读权限和percona库的读写权限。
1
GRANT  SELECT , PROCESS, SUPER, REPLICATION SLAVE  ON  *.*  TO  ‘per’@'192.168.2.%’ IDENTIFIED  BY  ‘p4ssword’;


6,查询主从库的数据

#主库:
mysql> use mvbox
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
+----+------+
4 rows in set (0.00 sec)

#从库:
mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
|  5 | e    |
|  6 | f    |
+----+------+
6 rows in set (0.00 sec)
7、执行检测(MASTER上):

wKioL1aYVyKQjqShAAA8jQV29HY492.png 


参数说明:

1
2
3
4
5
6
7
8
TS            :完成检查的时间。
ERRORS             :检查时候发生错误和警告的数量。
DIFFS              :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
ROWS               :表的行数。
CHUNKS             :被划分到表中的块的数目。
SKIPPED            :由于错误或警告或过大,则跳过块的数目。
TIME              :执行的时间。
TABLE              :被检查的表名。

   

参数意义:


1
2
3
4
5
6
7
8
9
10
11
-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可以看出主从的表数据不一致。

通过查看从库上的test.checksums表可以看到主从库的检验信息。

mysql>  use percona;
mysql> select * from checksums\G;
*************************** 1. row ***************************
            db: mvbox
           tbl: test
         chunk: 1
    chunk_time: 0.001801
   chunk_index: NULL
lower_boundary: NULL
upper_boundary: NULL
      this_crc: b76fca95             #从的校验值
      this_cnt: 6                  #从的行数
      master_crc: f2890e1c             #主的校验值
      master_cnt: 4                 #主的行数
      ts: 2016-01-15 10:03:31
1 row in set (0.00 sec)

通过上面的 this_crc <>, master_crc 更能清楚的看出他们的不一致了,通过chunk知道是这个张表的哪个块上的记录出现不一致。

要是主的binlog模式是Row 则会报错:

1
2
3
Replica db2 has binlog_format ROW 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模式的话,则在执行上面的命令时候要指定:--no-check-binlog-format,即:

 

wKiom1aYV7zzqXYgAABENjSpSjU162.png

数据不一致的SLAVE和表都找出来了,下面就用pt-table-sync来修补数据。

二、pt-table-sync修复从库不一致的数据

使用方法:

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

 

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

 

继续上面的复制环境,主和从的test表数据不一致,需要修复


#先MASTER的IP,再SLAVE的IP,以下是master执行结果

wKioL1aYWI3TY-3mAACF8SKfhPI680.png


#下面是在slave执行的结果

wKioL1aYW2qQODUsAACF3SCk2N0700.png

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


参数的意义:

1
2
3
4
5
6
7
8
9
10
--replicate=  :指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。
--databases=  : 指定执行同步的数据库,多个用逗号隔开。
--tables=    :指定执行同步的表,多个用逗号隔开。
--sync-to-master :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。
h=127.0.0.1     :服务器地址,命令里有2个ip,第一次出现的是M的地址,第2次是Slave的地址。
u=root        :帐号。
p=123456       :密码。
--print        :打印,但不执行命令。
--execute      :执行命令。
更多的参数请见官网,上面指出来的是常用的,对该场景够用的参数。


开始修复数据:

先看下slave数据

wKiom1aYXXWRfPI8AAAdiubttVw665.png

执行修复命令,此时在slave进行执行的操作

wKioL1aYXdKwBIBbAAAbPajT1Fw214.png

再次查看slave数据

wKiom1aYXeKQKkAvAAA93mChx2o747.png

此时,表明数据已经同步完成


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

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

 

补充:

由于正式环境都是主从没有延迟,一致性正常、所以模拟了以上做法,反过来 原理相同、

要是主库有的数据,而从库没有,那这个数据怎么处理?会主动添加SLAVE少了数据, 修复SLAVE缺失数据的SQL语句。

 

如果在shell窗口不想显示输入密码则可以添加:--ask-pass 参数,如:

[root@mysql-slave ~]#  pt-table-sync --print --ask-pass --sync-to-master h=192.168.2.23,u=root,P=3306 --databases mvbox --tables test
Enter password for 192.168.2.23:

如果使用--ask-pass,报错:

1
Cannot read response; is Term::ReadKey installed? Can't locate Term/ReadKey.pm in @INC

安装Term/ReadKey.pm模块:

[root@mysql-slave ~]# perl -MCPAN -e "shell"cpan[1]> install Term::ReadKey

 

 

总结:

  该工具执行检查表动作,检查连接的帐号需要有很高的权限,在一般权限上需要加SELECT, PROCESS, SUPER, REPLICATION SLAVE等权限。pt-table-checksm 配合pt-table-sync使用,在执行pt-table-sync数据同步之前,一定要执行pt-table-checksm命令检查。



      本文转自crazy_charles 51CTO博客,原文链接:http://blog.51cto.com/douya/1735233,如需转载请自行联系原作者






相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
926 4
|
1月前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
73 11
|
3月前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
199 1
MySQL主从复制原理和使用
|
2月前
|
缓存 NoSQL 关系型数据库
mysql和缓存一致性问题
本文介绍了五种常见的MySQL与Redis数据同步方法:1. 双写一致性,2. 延迟双删策略,3. 订阅发布模式(使用消息队列),4. 基于事件的缓存更新,5. 缓存预热。每种方法的实现步骤、优缺点均有详细说明。
148 3
|
3月前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
135 0
Mysql中搭建主从复制原理和配置
|
4月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
610 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
3月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
125 3
|
4月前
|
SQL 缓存 关系型数据库
MySQL高级篇——性能分析工具
MySQL的慢查询日志,用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long-query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为 10,意思是运行10秒以上(不含10秒)的语句,认为是超出了我们的最大忍耐时间值。它的主要作用是,帮助我们发现那些执行时间特别长的 SOL 查询,并且有针对性地进行优化,从而提高系统的整体效率。当我们的数据库服务器发生阻塞、运行变慢的时候,检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助。
MySQL高级篇——性能分析工具
|
4月前
|
安全 关系型数据库 MySQL
Navicat工具设置MySQL权限的操作指南
通过上述步骤,您可以使用Navicat有效地为MySQL数据库设置和管理用户权限,确保数据库的安全性和高效管理。这个过程简化了数据库权限管理,使其既直观又易于操作。
553 4
|
4月前
|
SQL 监控 关系型数据库
MySQL数据库中如何检查一条SQL语句是否被回滚
检查MySQL中的SQL语句是否被回滚需要综合使用日志分析、事务状态监控和事务控制语句。理解和应用这些工具和命令,可以有效地管理和验证数据库事务的执行情况,确保数据的一致性和系统的稳定性。此外,熟悉事务的ACID属性和正确设置事务隔离级别对于预防数据问题和解决事务冲突同样重要。
131 2