前言: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
工具包提供的工具很多:
本文档详细介绍pt-table-checksum和pt-table-sync这两个工具的使用;
一、环境说明
1、主数据库
IP地址:192.168.47.166
主机名:mysql01
同步数据库名称:test
2、从数据库
IP地址:192.168.47.165
主机名:mysql02
现在数据库的主从状态是一致的;
二、语法
pt-table-checksum [OPTIONS] [DSN]
[root@mysql02 data]# pt-table-checksum --help 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
说明: TS :完成检查的时间。 ERRORS :检查时候发生错误和警告的数量。 DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。 ROWS :被检查表的行数 CHUNKS :被划分到表中的块的数目。 SKIPPED :由于错误或警告或过大,则跳过块的数目。 TIME :执行的时间。 TABLE :被检查的表名。 |
这边可以直接显示两个表的数据情况,因为我们在进行校验的时候会写入到test.checksums表中,所以可以登录到数据库进行结果的检查;
mysql> select * from test.checksums; 注:当前主从数据库的数据都是4条; |
可以看出,当前test数据库下面的john这个表是一致的。
2、修改从表的数据,使主从数据不一致,方法:在从库上面增加一条记录
然后进行主从数据库的校验
[root@mysql01 ~]# pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=test h=192.168.47.167,u=root,p=123456 |
DIFFS:1 表示当前主从数据库已经不一致;
登录主数据库查看test.checksums表的记录:主数据库显示this_cnt:4,master_cnt=4,这条记录显示的是:当前库表的记录信息和主库的记录信息,因为两个库是同一个库,所以这里显示的cnt值都是一样的;
登录到从库查看test.checksums表的记录,从库显示的john表中,this_cnt和master_cnt值是不一致的;
总结:一般进行主从校验的时候往往不是一两个表的核对,一个正常的业务的数据库包含的表个数一般超过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管理 )
.....................................................................................................................................................................