pt-table-checksum校验主从库数据库数据

pt-table-checksum校验与pt-table-sync,前者主要用于数据的校验,验证主从是否一致,后者主要用来修复数据,两者一般情况结合起来用可以修复数据不一致的问题。

一、pt-table-checksum 安装

下载工具包 的最新地址如下:

https://www.percona.com/downloads/percona-toolkit/LATEST/
安装pt-table-checksum 和pt-table-sync命令。需要先安装percona-toolkit 工具集

1.1percona-toolkit 工具集安装方式介绍:
percona-toolkit 工具安装有3种方式:
第一种是下载二进制包,直接解压包,就可以使用。
第二种是下载源码包,进行编译安装
第三种是rpm包安装
不管是二进制安装还是源码包编译安装,还是rpm包安装,安装前要下载相关的依赖软件包

yum ×××tall perl perl-devel perl-CPAN perl-DBD-MySQL perl-Time-HiRes  perl-DBI  perl-Digest-MD5 -y

1.2下载源码包编译安装:

yum ×××tall perl perl-devel perl-CPAN perl-DBD-MySQL perl-Time-HiRes  perl-DBI  perl-Digest-MD5 -y
tar xf percona-toolkit-3.0.13.tar.gz
[[email protected] ~]# cd percona-toolkit-3.0.13
[[email protected] percona-toolkit-3.0.13]# perl Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for percona-toolkit

make && make ×××tall

1.3下载二进制包直接解压安装:

yum ×××tall perl perl-devel perl-CPAN perl-DBD-MySQL perl-Time-HiRes  perl-DBI  perl-Digest-MD5 -y
tar xf percona-toolkit-3.0.11_x86_64.tar.gz  -C /usr/local/
mv  percona-toolkit-3.0.11_x86_64  /usr/local/percona-toolkit
[[email protected] local]# cat /etc/profile.d/percona-toolkit.sh
export PATH=$PATH:/usr/local/percona-toolkit/bin
[[email protected] local]# cat /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql7/bin

二、快速搭建基于Gtid的主从复制

master 192.168.0.39
slave 192.168.0.11

2.1、master上操作:

mysql -uroot -p‘jiawu256789‘ -e "ggrant replication slave on *.* to [email protected]‘192.168.0.11‘ identified by ‘JuwoSdk21TbUser‘; flush privileges;"
mysqldump -uroot -p‘jiawu256789‘ -B -A -F  --master-data=2 --single-transaction --set-gtid-purged=OFF   --events|gzip >/opt/juwo_$(date +%F).sql.gz
scp -rp -P10239  /opt/juwo_$(date +%F).sql.gz  [email protected]:/root

2.2、slave上操作:

gzip -d  /root/juwo_$(date +%F).sql.gz
mysql -uroot -p‘jiawu256789‘ -e "source /root/juwo_$(date +%F).sql;"
mysql -uroot -p‘jiawu256789‘  -e "CHANGE MASTER TO MASTER_HOST=‘192.168.0.39‘,MASTER_PORT=3306,MASTER_USER=‘rept‘,MASTER_PASSWORD=‘JuwoSdk21TbUser‘,MASTER_AUTO_POSITION = 1;start slave;show slave status\G"

三、创建所需要的链接库的权限

创建pt-table-checksum 和pt-table-sync所需要的操作mysql的账户以及修复数据时,所需要的权限

登陆slave和master(两边都要执行如下SQL)
master(192.168.0.18)
slave(192.168.0.22)


grant  update,×××ert,select,create,drop,delete,index,execute,super,process,replication slave on *.* to [email protected]‘192.168.0.%‘ identified by ‘ptchecksums‘; flush privileges;

四、模拟演示

4.1创建演示数据环境

master库上新建测试库和测试表,SQL指令如下:

create database test01;
use test01;
CREATE TABLE `frame01` ( `id` int(11) NOT NULL AUTO_INCREMENT,`parent_id` int(11) DEFAULT NULL,`dsn` varchar(255) NOT NULL,PRIMARY KEY (`id`));
×××ert into `frame01`  values(1,1,‘192.168.0.22,u=pt22,p=ptchecksums,P=3307‘);
×××ert into `frame01`  values(2,2,‘192.168.0.33,u=pt33,p=ptchecksums,P=3308‘);

slave查看数据已经同步过来了

mysql> select * from frame01;
+----+-----------+------------------------------------------+
| id | parent_id | dsn                                      |
+----+-----------+------------------------------------------+
|  1 |         1 | 192.168.0.22,u=pt22,p=ptchecksums,P=3307 |
|  2 |         2 | 192.168.0.33,u=pt33,p=ptchecksums,P=3308 |
+----+-----------+------------------------------------------+
2 rows in set (0.00 sec)

slave库修改frame01表数,模拟数据不一致

 update frame01 set dsn=‘192.168.0.55,u=umaaa,p=ptchsyeudew,P=3310‘ where id=1;
 update frame01 set dsn=‘192.168.0.66,u=umbbb,p=ptchsyeudew,P=3311‘ where id=2;
mysql> select * from frame01;
+----+-----------+-------------------------------------------+
| id | parent_id | dsn                                       |
+----+-----------+-------------------------------------------+
|  1 |         1 | 192.168.0.55,u=umaaa,p=ptchsyeudew,P=3310 |
|  2 |         2 | 192.168.0.66,u=umbbb,p=ptchsyeudew,P=3311 |
+----+-----------+-------------------------------------------+

4.2 pt-table-checksum 演示

在新版本的pt-table-ckecksum不用自己添加checksums表,在pt-table-checksum 表时,会在master库上默认生成percona库和表checksums


[[email protected] ~]# pt-table-checksum  h=192.168.0.39,u=ptsum,p=‘ptchecksums‘,P=3306  --tables=test01.frame01  --no-check-binlog-format --nocheck-replication-filters --recursion-method="processlist" 

Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
06-15T10:37:41      0      1        2          0       1       0   0.314 test01.frame01

默认会在master库上生成库percona和表checksums

mysql> select * from percona.checksums;
+--------+---------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
| db     | tbl     | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc | master_cnt | ts                  |
+--------+---------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
| test01 | frame01 |     1 |   0.001818 | NULL        | NULL           | NULL           | 2eedbb7c |        2 | 2eedbb7c   |          2 | 2019-06-15 11:08:00 |
+--------+---------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
1 row in set (0.00 sec)
[[email protected] ~]# pt-table-checksum  h=192.168.0.39,u=ptsum,p=‘ptchecksums‘,P=3306  --databases=test01  --nocheck-replication-filters  --replicate=test01.checksums  --no-check-binlog-format  --recursion-method="processlist"
Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
06-15T10:40:18      0      1        2          0       1       0   0.317 test01.frame01

4.3、pt-table-checksum 指令参数说明

--nocheck-replication-filters      表示不检查复制过滤器;
--replicate=test01.checksums  把检查结果写到mysql中test01库中的checksums表;
--databases=test01                 检查的库为test01, 此处可以写多个库,采用逗号进行分割;
--no-check-binlog-format        不检查binlog日志格式, pt-table-checksum在运行的时候是基于statement复制格式的,如果binlog日志格式为row的话会报错,通过上面--no-check-binlog-format来去除binlog日志检查,以防报错;
--recursion-method="proccesslist" 这时工具会从show processlist中在主库中自动寻找从库,当然不加此参数,默认也是采用的这种方式,还有另外一种方式那就是dns,这个后面会介绍演示。

会把checksums表写入到master 192.168.0.39 的test01库中。登录主库查看

mysql> select * from test01.checksums;
+--------+---------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
| db     | tbl     | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc | master_cnt | ts                  |
+--------+---------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
| test01 | frame01 |     1 |   0.001907 | NULL        | NULL           | NULL           | 2eedbb7c |        2 | 2eedbb7c   |          2 | 2019-06-15 11:28:02 |
+--------+---------+-------+------------+-------------+----------------+----------------+----------+----------+------------+------------+---------------------+
1 row in set (0.00 sec)

4.4、检测输出结果参数说明

TS :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。

验证演示如下:

[[email protected] ~]# pt-table-checksum  h=192.168.0.39,u=ptsum,p=‘ptchecksums‘,P=3306  --databases=test01  --no-check-binlog-format --nocheck-replication-filters --no-replicate-check --recursion-method="processlist"
Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
06-15T11:08:00      0      0        2          0       1       0   0.012 test01.frame01

原本master 上 test01库和slave上test01库上的数据是不一致的,但是 pt-table-checksum 检测时,加上参数-no-replicate-check后,DIFFS 会始终是0

当指定--replicate-check-only会显示不同的信息:

[[email protected] ~]# pt-table-checksum  h=192.168.0.39,u=ptsum,p=‘ptchecksums‘,P=3306  --databases=test01  --no-check-binlog-format --nocheck-replication-filters --replicate-check-only --recursion-method="processlist"
Checking if all tables can be checksummed ...
Starting checksum ...
Differences on kusou-es11
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
test01.frame01 1 0 1   

ROWS :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME :执行的时间。
TABLE :被检查的表名

4.5、采用dsn方式校验数据:

pt-table-checksum +dsn方式指令参数说明如下:

--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format      : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only :只显示不同步的信息。
--replicate=   :把checksums的信息写入到指定表中,建议直接写到被检查的数据库当中。
--databases=   :指定需要被检查的数据库,多个则用逗号隔开。
--tables=      :指定需要被检查的表,多个用逗号隔开
h=192.168.0.39    :Master的内网地址
u=ptsum                 :用户名
p=ptchecksums       :密码
P=3306                     :端口
dsn=D                       :表示用dsn方式进行检查,D为database
t=dsns                       :表示用这张表

配置dsn方式校验数据:

登陆192.168.0.39 的·master库创建链接slave库的路由表


mysql> use percona;
mysql>CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT,`parent_id` int(11) DEFAULT NULL,`dsn` varchar(255) NOT NULL,PRIMARY KEY (`id`));
mysql>######×××ert into dsns values(1,1,‘h=slave的IP,u=username,p=password,P=3306‘);
mysql>×××ert into dsns values(1,1,‘h=192.168.0.11,u=ptsum,p=ptchecksums,P=3306‘);
[[email protected] ~]#  pt-table-checksum  --nocheck-replication-filters --replicate=percona.checksums --databases=test01 --tables=frame01 --no-check-binlog-format h=192.168.0.39,u=ptsum,p=ptchecksums,P=3306 --recursion-method dsn=D=percona,t=dsns,h=192.168.0.11,u=ptsum,p=ptchecksums,P=3306
Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
06-15T11:45:39      0      1        2          0       1       0   0.317 test01.frame01

DIFFS =1 也是可以看到;master 和slave的test01库中frame01表的数据是不一致的

指令参数简单说明:
第一段的ip,账户,密码和端口,指的是连接主库的账户信息。
h=192.168.0.39,u=ptsum,p=ptchecksums,P=3306
--recursion-method dsn= 采用dsn的链接方式进行校验数据
D=percona,t=dsns, 从 percona库中读取 dsns表中的链接从库的账户信息
第二段的ip,账户,密码和端口,指的是连接从库的账户信息。
h=192.168.0.11,u=ptsum,p=ptchecksums,P=3306

提示:此条pt-table-checksum指令是从 从库192.168.0.11上的percona.dsns表读取链接从库的账户信息,和主库192.168.0.39中的test01.frame01表的数据进行比对的。

如果此时登录192.168.0.11从库,删掉slave库percona.dsns表中的数据,然后再进行pt-table-checksum比对的话,会提示连接不上从库,导致检查失败

mysql> select * from dsns;
+----+-----------+---------------------------------------------+
| id | parent_id | dsn                                         |
+----+-----------+---------------------------------------------+
|  1 |         1 | h=192.168.0.11,u=ptsum,p=ptchecksums,P=3306 |
+----+-----------+---------------------------------------------+
1 row in set (0.00 sec)
mysql> delete from dsns where id=1;
Query OK, 1 row affected (0.00 sec)
mysql> select * from dsns;

 [[email protected] ~]#  pt-table-checksum  --nocheck-replication-filters --replicate=percona.checksums --databases=test01 --tables=frame01 --no-check-binlog-format h=192.168.0.39,u=ptsum,p=ptchecksums,P=3306 --recursion-method dsn=D=percona,t=dsns,h=192.168.0.11,u=ptsum,p=ptchecksums,P=3306
Checking if all tables can be checksummed ...
Starting checksum ...
Diffs cannot be detected because no slaves were found.  Please read the --recursion-method documentation for information.
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
06-15T12:23:40      0      0        2          0       1       0   0.009 test01.frame01

报错提示:Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information.

DIFFS =0 ,然而实际上,master和slave库的test01.frame01表的数据是不一致的,检测比对失败。


[[email protected] ~]#  pt-table-checksum  --nocheck-replication-filters --replicate=percona.checksums --databases=test01 --tables=frame01 --no-check-binlog-format h=192.168.0.39,u=ptsum,p=ptchecksums,P=3306 --recursion-method dsn=D=percona,t=dsns
Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
06-15T12:53:54      0      1        2          0       1       0   0.316 test01.frame01

DIFFS =1 说明master和slave数据存在不一致,检测成功
执行如上的命令,是可以检测成功的,原因是:上述的命令是直接从主库192.168.0.39的percona.dsns表中读取的链接slave库的账户信息的

五、此次演示过程中出现的报错

slave库上操作下面的指令:

报错1:
[[email protected] local]#  /usr/local/percona-toolkit/bin/pt-table-checksum  h=192.168.0.39,u=ptsum,p=‘ptchecksums‘,P=3306 --databases=mysql  --no-check-binlog-format --nocheck-replication-filters
Can‘t locate Digest/MD5.pm in @INC (@INC conta×××: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/percona-toolkit/bin/pt-table-checksum line 789.
BEGIN failed--compilation aborted at /usr/local/percona-toolkit/bin/pt-table-checksum line 789.

解决办法:

原因是:缺少perl-Digest-MD5包, 安装perl-Digest-MD5即可解决。
[[email protected] ~]#  yum -y ×××tall perl-Digest-MD5

pt-table-checksum的数据校验工具到此简单介绍完成。有疑问的,欢迎留言一起交流学习。

原文地址:https://blog.51cto.com/wujianwei/2409523

时间: 2024-10-12 03:53:38

pt-table-checksum校验主从库数据库数据的相关文章

pt-table-sync修复主从库不一致数据

一.实例演示1 模拟主从库数据不一致环境: 192.168.0.39 master库: mysql> select * from test01.frame01;; +----+-----------+------------------------------------------+ | id | parent_id | dsn | +----+-----------+------------------------------------------+ | 1 | 1 | 192.168.0

mysql(五)------针对主从同步的情况两个库进行数据校对及恢复

两台MySQL,发生了种种种种,导致了两个表的数据不一致,但是同步还在正常进行,后来意识到这种问题(可能之前skip啊,或者一开始搭建的时候就是不一致的状态),该如何修复呢?如果数据量小的情况可以考虑从新导数据,如果数据量很大的话,那就太要命了于是可以用percona-toolkit这个工具修复并并检查这种情况的再主备同步的时候在进行如下操作:在主库上安装pt-table-checksum安装: 1.安装软件包: # yum install perl perl-devel perl-Time-H

使用percona-toolkit校验主从数据的一致性

主从数据校验使用percona-toolkit工具集的以下两个工具(主库上使用): pt-table-checksum  #检查主从数据是否一致, pt-table-sync #把主库数据同步到从库 适用场景如下: 1). 数据迁移前后,进行数据一致性检查 2). 当主从复制出现问题,待修复完成后,对主从数据进行一致性检查 3). 在从库上执行了误操作 4). 定期校验 原理: pt-table-checksum在主库上利用SBR格式对一段数据做hashcode函数运算,然后复制到从库上去检查,

MySQL主从库为什么会出现同一条数据的某个字段不一致?

问题描述: 开发环境的MySQL用了两台节点,主从同步结构.忽然有开发同学反映说在主库insert一条数据,发现在从库没有同步,查不到这条数据.于是开始排查. 原因排查: 1.查看主从同步状态 在主库执行: show master status\G 在从库执行: show slave status\G; 发现从库同步的bin log的Position跟主库查询到的不一致,以为是同步延迟了.然后手动在主库创建了一个测试database,发现从库立即同步了,主从同步的点也是一致的. 2.排查插入字段

关于SQL SERVER数据页checksum校验算法整理

SQL SERVER数据页checksum校验算法 在SQL SERVER2005以上版本中,数据页默认开启checksum,标识为m_flagBits & 0x200 == True,其值m_tornBits位于页头0x3C,4字节.其算法概述如下: 读8KB 进BUF 将BUF头部 CHECKSUM的4字节值清0 uint32 checksum = 0 //初始checksumfor i in range(0,15): //每扇区的初始checksum overall = 0; for ii

pt-table-checksum校验与pt-table-sync修复数据【转】

1:下载工具包 登录网站下载相应的工具包 https://www.percona.com/downloads/percona-toolkit/LATEST/ 2:安装 (1)yum安装: sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm yum list | grep percona-toolkit 结果集显示以下证明安装成

pt-table-checksum、pt-table-sync核对主从库一致性

一.下载并安装工具http://www.percona.com/downloads/percona-toolkit/目前最新的版本是percona-toolkit_2.2.12.tar.gz上传到服务器后,解压缩,并设置到环境变量在mysql用户的环境变量文件增加路径vi .bash_profileexport PATH=$PATH:/mysqldata/soft/percona-toolkit-2.2.12/bin 二.使用pt-table-checksum命令查找不一致的数据主要关注的列是D

关于Mysql 查询所有表的实时记录用于对比2个MySQL 库的数据是否异步

Xu言: 今天,为了研究一个MySQL主从同步开机后报错 问题,如下图 故障原因分析: 经过分析,可能是主从服务器开机顺序导致.(有待下次断电再次测试) 主从错误提示:日志读取错误的问题.解决方法:更新日志记录文件,重新主从同步. 担心主从问题过程中有数据写入,想去确认下主从库上的数据是否一致.想到了查询下数据库行数的方式. 网上查询了下 ,一般有2种: 方法一:查看当前表的记录行数 SELECT count(*) from 表名 方法二:"查看数据库中所有表的记录数"  # 这里之所

巧用Mysqlbinlog恢复数据库数据

关于binlog的详解请参考:http://zlyang.blog.51cto.com/1196234/1833062 binlog日志用于记录所有更新了数据或者已经潜在更新了数据的所有语句.语句以"事件"的形式保存,它描述数据更改.当我们因为某种原因导致数据库出现故障时,就可以利用binlog日志来挽回(前提是已经配置好了binlog),接下来我们来配置 一.开启mysql-binlog日志 在mysql配置文件my.cnf加上如下配置 [mysqld] log-bin=mysql-