本文共 4436 字,大约阅读时间需要 14 分钟。
前言:mysql的主从配置灵活简单,有时候太过于灵活了,所以经常会出现主从数据库不一致的问题,而这种不一致的情况多了或者出现在某个重要的业务场景的时候,mysql的数据的公信力就受到了严重的质疑,IT的价值就降低了,如果把这种信号传递给中心的领导,那么mysql dba的价值也就体现出来了。
主从不一致时的处理方法:通常我们处理主从不一致
主从数据的一致性校验是个头疼的问题,偶尔被业务投诉主从数据不一致,或者几个从库之间的 数据不一致,这会令人沮丧。通常我们仅有一种办法,热备主库,然后替换掉所有的从库。这不仅代价非常大,而且类似治标不治本的方案,让人十分不安。因此我们需要合适的工具,至少帮我们回答下面三个问题:
回答清楚这几个问题,有助于我们决定是否修复,以及修复的方式,还可以帮我们找出不一致的数据,进而定位问题根源。而percona的pt-table-checksum正是我们想要的。
Percona在针对mysql的管理方面提供了很多便捷的工具,并集成在percona-toolkit工具包里,下载网站如下:
在linux中,wget
工具包提供的工具很多:
本文档详细介绍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 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 :端口 详细的选项说明: |
三、测试
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、修改从表的数据,使主从数据不一致,方法:在从库上面增加一条记录
然后进行主从数据库的校验
[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 TABLE03-10T14:29:30 0 1 4 1 0 0.026 test.john |
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管理 )
.....................................................................................................................................................................
转载地址:http://qdjta.baihongyu.com/