MySQL主从一致性的快速校验

最近测试环境的MySQL出现了偶发主从同步失败的现象。主从同步失败的问题很快的得到了解决。但我对于测试环境的数据库主从数据是否完全一致产生了怀疑,有怀疑就得有验证,得找个法子验证一下主从数据是否一致。手工检查也可以做,太耗时间,由此便引入了我本次所要介绍的工具pt-table-checksum

原理介绍

pt-table-checksum的工作原理很简单,通过在主库和从库对表进行一致性的checksum计算,如果主从库的某张表(结构或者数据)不一致,那么checksum结果值就不一样,通过对比主库和从库checksum的值就可以很容易的知道主从是否数据一致了(checksum结果见下文示例)。pt-table-checksum同一时间只会对一张表进行checksum计算,所以它不会消耗过多的数据库资源。无论需要检查的MySQL数据库有多大,我们都无需担心。知道了工作原理,其他的就好办了。接下来我们来实际测试一下,看一看这个工具是如何能够方便的帮我们检查主从的不一致。

一个典型的checksum计算结果如下所示:

mysql> select * from checksums limit 1 \G;
*************************** 1. row ***************************
            db: cmdb
           tbl: t_cmdb_tb_1
         chunk: 1
    chunk_time: 0.00604
   chunk_index: NULL
lower_boundary: NULL
upper_boundary: NULL
      this_crc: ef1e7532 --当前库表计算值
      this_cnt: 107 --当前表记录数
    master_crc: ef1e7532  --主库表计算值
    master_cnt: 107 --主库表记录数
            ts: 2020-12-18 11:06:37

实操部分

1、安装

pt-table-checksum工具存在于percona-toolkit工具包内。基于不同的操作系统下载对应的包进行安装即可,安装过程在此省略。需要注意的一点是percona-toolkit的安装并不限制于主库或是从库,只需要安装在某台能同时访问主库和从库的机器中即可。在笔者的测试环境中,该工具在主库所在的服务器上安装。工具包可以从以下链接找到:

https://www.percona.com/downloads/percona-toolkit/LATEST/

2、基础准备

在使用pt-table-checksum工具之前所需要做的准备工作主要包含以下2步。

1)创建数据库账户

在master和slave上创建统一的账号,并进行必要权限的授权,可参考以下语句:

mysql> grant select,process,super,replication slave,create,delete,insert,update on *.* to 'ms_check_user'@'%' identified by '123456';
mysql> grant all privileges on percona.* to 'ms_check_user'@'%';
mysql> flush privileges;
2)创建用户和表

pt-table_checksum会在主库上自动创建percona数据库以及checksums表,但如果从库设置的同步方式是指定数据库才同步(基于replicate-do-db)的话,那么对应的percona库和checksums表就不会在从库自动创建。在笔者的测试环境中,从库同步的数据库是通过replicate-do-db指定的,因此为了避免出现问题,手动在从库上创建库和表。创建库和表可参考以下语句:

mysql> create database percona;
mysql> use percona;
mysql> CREATE TABLE `checksums` (
    ->   `db` char(64) NOT NULL,
    ->   `tbl` char(64) NOT NULL,
    ->   `chunk` int(11) NOT NULL,
    ->   `chunk_time` float DEFAULT NULL,
    ->   `chunk_index` varchar(200) DEFAULT NULL,
    ->   `lower_boundary` text,
    ->   `upper_boundary` text,
    ->   `this_crc` char(40) NOT NULL,
    ->   `this_cnt` int(11) NOT NULL,
    ->   `master_crc` char(40) DEFAULT NULL,
    ->   `master_cnt` int(11) DEFAULT NULL,
    ->   `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    ->   PRIMARY KEY (`db`,`tbl`,`chunk`),
    ->   KEY `ts_db_tbl` (`ts`,`db`,`tbl`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3、测试验证

我们可以通过以下命令在MySQL主库所在服务器上进行测试,以确认CMDB数据库在主从双边是否一致。

pt-table-checksum --no-check-binlog-format --nocheck-replication-filters --databases cmdb -h127.0.0.1 -u'ms_check_user' -p'123456'

该命令中包含的几个可选参数解释如下:
--no-check-binlog-format:检查复制的binlog模式,如果binlog模式是ROW,则会报错;
--nocheck-replication-filters:不检查复制过滤器;
--databases:要进行主从检查的数据库,多个库以逗号分隔;
-h:服务器地址;
-u:账户;
-p:密码;

pt-table-checksum还有许多可选的参数,在此就不做一一介绍了,可以查看以下链接:

https://www.percona.com/doc/percona-toolkit/1.0/pt-table-checksum.html

该命令执行完毕后,我们可以看到类似如下输出。

Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED   TIME  TABLE
12-18T11:06:37      0      0      107          0       1       0   0.040 cmdb.t_cmdb_tb_1
12-18T11:06:37      0      0       65          0       1       0   0.055 cmdb.t_cmdb_tb_2
12-18T11:06:37      0      0       67          0       1       0   0.052 cmdb.t_cmdb_tb_3
12-18T11:06:37      0      0       83          0       1       0   0.041 cmdb.t_cmdb_tb_4
12-18T11:06:38      0      0        4          0       1       0   0.048 cmdb.t_cmdb_tb_5
12-18T11:06:38      0      0        2          0       1       0   0.042 cmdb.t_cmdb_tb_6

对于该检查输出结果的各项字段解释如下:

TS:完成检查的时间;
ERRORS:检查时候发生错误和警告的数量;
DIFFS:0表示一致,1表示不一致。当指定–no-replicate-check时,会一直为0,当指定–replicate-check-only会显示不同的信息;
ROWS:表的行数;
DIFF_ROWS:不一致的行数;
CHUNKS:被划分到表中的块的数目;
SKIPPED:由于错误或警告或过大,则跳过块的数目;
TIME:执行的时间;
TABLE:被检查的表名;

我们可以看出,对于MySQL中CMDB库的各表检查结果确认主从并未出现任何不一致(所有表的ERRORS和DIFFS都为0)。按照这个方式,我们可以依次对主从涉及到的所有重要数据库进行主从一致性检查。

至此,我们介绍了如何通过pt-table-checksum来实现对MySQL主从的一致性检查。如果检查发现已经存在了数据或结构的不一致,又该如何处理呢?我们可以通过同一软件包内的pt-table-sync工具来实现主从不一致的修复,修复操作如何进行请见下篇文章分解。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容