pt-table-checksum进行主从数据校验

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 前言:mysql的主从配置灵活简单,有时候太过于灵活了,所以经常会出现主从数据库不一致的问题,而这种不一致的情况多了或者出现在某个重要的业务场景的时候,mysql的数据的公信力就受到了严重的质疑,IT的价值就降低了,如果把这种信号传递给中心的领导,那么mysql dba的价值也就体现出来了。

前言:mysql的主从配置灵活简单,有时候太过于灵活了,所以经常会出现主从数据库不一致的问题,而这种不一致的情况多了或者出现在某个重要的业务场景的时候,mysql的数据的公信力就受到了严重的质疑,IT的价值就降低了,如果把这种信号传递给中心的领导,那么mysql dba的价值也就体现出来了。

主从不一致时的处理方法:通常我们处理主从不一致

主从数据的一致性校验是个头疼的问题,偶尔被业务投诉主从数据不一致,或者几个从库之间的 数据不一致,这会令人沮丧。通常我们仅有一种办法,热备主库,然后替换掉所有的从库。这不仅代价非常大,而且类似治标不治本的方案,让人十分不安。因此我们需要合适的工具,至少帮我们回答下面三个问题:

  • 是从库延迟导致了用户看到的数据不一致,还是真的主从数据就不一致?
  • 如果不一致,这个比例究竟多大?
  • 下次还会出现吗?

回答清楚这几个问题,有助于我们决定是否修复,以及修复的方式,还可以帮我们找出不一致的数据,进而定位问题根源。而percona的pt-table-checksum正是我们想要的。

 

Percona在针对mysql的管理方面提供了很多便捷的工具,并集成在percona-toolkit工具包里,下载网站如下:http://www.percona.com/downloads/percona-toolkit/LATEST/

在linux中,wget www.percona.com/downloads/percona-toolkit/2.2.2/percona-toolkit-2.2.2.tar.gz

工具包提供的工具很多:

image

本文档详细介绍pt-table-checksum和pt-table-sync这两个工具的使用;

 

一、环境说明

1、主数据库

IP地址:192.168.47.166

主机名:mysql01

同步数据库名称:test

 

2、从数据库

IP地址:192.168.47.165

主机名:mysql02

image

现在数据库的主从状态是一致的;

 

二、语法

pt-table-checksum [OPTIONS] [DSN]

[root@mysql02 data]# pt-table-checksum  --help
pt-table-checksum performs an online replication consistency check by executing checksum queries on the master, which produces different results on replicas that are inconsistent with the master.  The optional DSN specifies the master host.  The tool's L is non-zero if any differences are found, or if any warnings or errors occur.  For more details, please use the –help option, or try 'perldoc /bin/pt-table-checksum' for complete documentation.

Usage: pt-table-checksum [OPTIONS] [DSN]

 

常用语法说明:

--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。

--no-check-binlog-format      :不检查复制的binlog模式,要是binlog模式是ROW,则会报错。

--replicate-check-only          :只显示不同步的信息。(注意:要谨慎使用,此参数不会生成新的checksums数据,只会根据checksums表已经有的数据来显示。)

--replicate                            :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。

--databases=                         :指定需要被检查的数据库,多个则用逗号隔开。

--tables=                                :指定需要被检查的表,多个用逗号隔开

--host=127.0.0.1                    :Master的地址

--user=root                            :用户名

--password=123456                :密码

--port=3306                                 :端口

详细的选项说明:http://www.percona.com/doc/percona-toolkit/2.2/pt-table-checksum.html

 

三、测试

1、两边数据都是一致的情况下,进行pt-table-checksum进行测试

pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --databases=test --replicate=test.checksums --host=192.168.47.167 --port=3306 --user=root --password=123456

TS                    ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME         TABLE
03-10T14:17:18      0          0            4       1             0               0.025    test.john

 

说明:

TS              :完成检查的时间。

ERRORS       :检查时候发生错误和警告的数量。

DIFFS          :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。

ROWS         :被检查表的行数

CHUNKS      :被划分到表中的块的数目。

SKIPPED     :由于错误或警告或过大,则跳过块的数目。

TIME          :执行的时间。

TABLE        :被检查的表名。

这边可以直接显示两个表的数据情况,因为我们在进行校验的时候会写入到test.checksums表中,所以可以登录到数据库进行结果的检查;

mysql> select * from test.checksums;
+------+-------+---------+-----------------+-----------------+----------------------+----------------------+----------+-------------+----------------+---------------+-----------------------+
| db   | tbl  | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc | master_cnt | ts                          |
+------+-------+---------+-----------------+-----------------+----------------------+----------------------+----------+-------------+----------------+---------------+-------------------------+
| test | john |     1 |       0.005105 | NULL             | NULL                   | NULL                   | 709a8dc  |           4 | 709a8dc      |                4 | 2015-03-10 14:17:18 |
+------+-------+---------+-----------------+-----------------+----------------------+----------------------+----------+-------------+----------------+---------------+--------------------------+
1 row in set (0.00 sec)  

注:当前主从数据库的数据都是4条;

可以看出,当前test数据库下面的john这个表是一致的。

 

2、修改从表的数据,使主从数据不一致,方法:在从库上面增加一条记录

imageimage

 

然后进行主从数据库的校验

[root@mysql01 ~]# pt-table-checksum  --nocheck-replication-filters --replicate=test.checksums --databases=test  h=192.168.47.167,u=root,p=123456
TS                  ERRORS  DIFFS     ROWS  CHUNKS SKIPPED    TIME          TABLE
03-10T14:29:30      0     1             4       1                 0             0.026    test.john

DIFFS:1 表示当前主从数据库已经不一致;

 

登录主数据库查看test.checksums表的记录:主数据库显示this_cnt:4,master_cnt=4,这条记录显示的是:当前库表的记录信息和主库的记录信息,因为两个库是同一个库,所以这里显示的cnt值都是一样的;

 image,

 

登录到从库查看test.checksums表的记录,从库显示的john表中,this_cnt和master_cnt值是不一致的;

image

 

总结:一般进行主从校验的时候往往不是一两个表的核对,一个正常的业务的数据库包含的表个数一般超过100个,根据判断的情况可以直接对this_cnt和master_cnt进行比对;

脚本如下:select db,tbl,chunk,this_crc,this_cnt,master_crc,master_cnt,ts from checksums  where this_cntmaster_cnt ;

 

整个校验的过程从技术上来讲是很简单的,但是所带来的业务价值却是很高的。而DBA人员怎么把这个过程创造出来的业务价值体现出来,这是比技术更值得去深思的;

....................................................................................................................................................................

本文作者:JOHN,某上市公司DBA,业余时间专注于数据库的技术管理,从管理的角度去运用技术。

ORACLE技术博客:ORACLE 猎人笔记               数据库技术群:367875324 (请备注ORACLE管理 ) 

.....................................................................................................................................................................

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
关系型数据库 MySQL
pt-table-checksum原理详解
环境 MySQL: MySQL 5.6.27 OS: centos 6.6 tool: pt-table-checksum 2.2.15 它能做什么 业界最流行的MySQL主从数据对比工具,数据一致性检测最好的的工具,没有之一 如何使用 ./pt-table-che
7485 0
|
监控 关系型数据库 数据库
监控复制:PG_STAT_REPLICATION
监控复制:PG_STAT_REPLICATION
186 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 数据库数据文件BLOCK一致性校验、备份集恢复后的有效性快速校验 - pg_verify_checksums
PostgreSQL 数据库数据文件BLOCK一致性校验、备份集恢复后的有效性快速校验 - pg_verify_checksums
2585 0
|
自然语言处理 关系型数据库 MySQL
|
关系型数据库 数据库 索引
pt-table-checksum
pt-table-checksum是目前可以说是最好的查看主从一致性的工具 先来个使用例子,有助快速上手使用 在主库执行:mysql>GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON .
1713 0