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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 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管理 ) 

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
Java 关系型数据库 MySQL
java连接mariaDB的设置
java连接mariaDB的设置
851 0
|
NoSQL Java Redis
SpringBoot2.0整合Redis高可用之Sentinel哨兵
本篇博文分享的是一主二从三哨兵模式。至于为什么用三个哨兵,同第一段。本文是模拟环境,都是一个服务器上面。
1205 0
|
12月前
|
存储 Python
Python Logging 限制文件大小
Python Logging 限制文件大小
186 3
|
SQL 安全 Go
【Go语言专栏】Go语言中的安全审计与漏洞修复
【4月更文挑战第30天】本文介绍了Go语言中的安全审计和漏洞修复实践。安全审计包括代码审查、静态分析、运行时分析、渗透测试和专业服务,借助工具如`go vet`、`staticcheck`、`gosec`等。修复漏洞的方法涉及防止SQL注入、XSS攻击、CSRF、不安全反序列化等。遵循最小权限原则、输入验证等最佳实践,结合持续学习,可提升Go应用安全性。参考[Go安全工作组](https://github.com/golang/security)和[OWASP Top 10](https://owasp.org/www-project-top-ten/)深入学习。
367 0
HTTP慢速攻击详解
HTTP慢速攻击详解
223 7
|
容器 C# Docker
WPF与容器技术的碰撞:手把手教你Docker化WPF应用,实现跨环境一致性的开发与部署
【8月更文挑战第31天】容器技术简化了软件开发、测试和部署流程,尤其对Windows Presentation Foundation(WPF)应用程序而言,利用Docker能显著提升其可移植性和可维护性。本文通过具体示例代码,详细介绍了如何将WPF应用Docker化的过程,包括创建Dockerfile及构建和运行Docker镜像的步骤。借助容器技术,WPF应用能在任何支持Docker的环境下一致运行,极大地提升了开发效率和部署灵活性。
527 1
echarts图例legend实现默认选中显示状态的解决方案
echarts图例legend实现默认选中显示状态的解决方案
787 0
|
监控 Oracle 数据可视化
深度解析JVM性能监控工具:推荐与详细用法
深度解析JVM性能监控工具:推荐与详细用法
1562 0
|
存储 NoSQL Java
使用SpringBoot整合redis多主多从集群
使用SpringBoot整合redis多主多从集群
501 0
|
Linux 网络安全 开发工具
[笔记]Win10+VSCode+CentOs7+SSH+gcc 远程开发C++(一)
[笔记]Win10+VSCode+CentOs7+SSH+gcc 远程开发C++
279 0