22

数据一致性校验及数据同步,运维必看

 3 years ago
source link: https://mp.weixin.qq.com/s/jlbVJy_VI6WXc1GyTUSVkw
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

主从数据不一致对DBA来说是一个比较头疼的事情,刚接触MySQL时,遇到这种问题我一般采用重新还原备库的方式恢复数据,这对我来说是个很痛苦的过程。今天就来介绍两款pt工具,通过这两款工具可以针对数据不一致的情况进行快速检测和修复。

pt-table-checksum

pt-table-checksum可以在线校验主从数据库的一致性,他可以在主库上执行检查语句,在线检查MySQL复制的一致性,然后生成replace语句,通过复制传递到从库,再更新master_crc的值。最后 通过检测从服务器的this_crc和master_crc的值判断主从数据是否一致。 果复制有延迟,在从库的checksum会暂停直到赶上主库的计算时间点。

注意事项:

1. 主从数据库必须是同步状态。

2. 表中要有主键或者唯一索引。

使用示例

1. 首先我们先创建一个校验用户

mysql> grant select,insert,update,delete,create,drop,super,process,replication slave on *.* to 'syncuser'@'%' identified by 'Syncuser@123';

2. 通过pt-table-checksum命令对主从数据进行校验。

[root@node1 ~]# pt-table-checksum -usyncuser -pSyncuser@123 --nocheck-replication-filters --no-check-binlog-format --databases=test --replicate=test.checksums --create-replicate-table
Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
09-04T21:36:43 0 0 0 0 1 0 0.089 test.efs_sys_loginfo4
09-04T21:36:43 0 0 1006 0 1 0 0.089 test.groupby
09-04T21:36:43 0 0 0 0 1 0 0.030 test.groupby1
09-04T21:36:43 0 1 1006 0 1 0 0.030 test.groupby2
09-04T21:36:43 0 0 7 0 1 0 0.030 test.student
09-04T21:36:43 0 0 7 0 1 0 0.032 test.student1
09-04T21:36:43 0 1 0 8 1 0 0.034 test.t
09-04T21:36:43 0 0 57344 0 4 0 0.328 test.t1
09-04T21:36:43 0 1 1 0 1 0 0.028 test.test
09-04T21:36:43 0 0 8 0 1 0 0.036 test.tuser

3. 参数详解

--nocheck-replication-filters: 不检查复制的过滤规则,比如replicate-ignore-db、replicate-wild-do-table。

--no-check-binlog-format: 不检查复制的binlog模式,如果binlog模式是row模式,需要启用该参数。

--create-replicate-table: 第一次进行checksum需要启用该参数,会进行checksum表的创建,用于存放结果。

--replicate=test.checksums: 存放checksum结果的表。

--databases: 表示要检查的库。

--tables(-t): 表示要检查的表。

--replicate-check-only: 表示只显示不同步的表。

--recursion-method: 正常情况下工具会自动识别从库,如果识别失败,可以用该参数 指定查找slave的方法,参数有四种,分别是processlist、hosts、dsn=DSN、no四种,用来决定查找slave的方式是通过show processlist、show slave hosts还是通过dsn=DSN的方式。

采用dsn=DSN方式时需要先创建dsn表,建表语句如下:

CREATE TABLE `dsns` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`dsn` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);

然后插入主从复制关系:

insert into dsns(dsn) values('h=36.30.39.176,u=syncuser,p=Syncuser@123,P=3306');

这样就可以采用dsn方式了,--recursion-method dsn=D=test,t=dsns。

4. 结果分析

TS            ERRORS  DIFFS    ROWS  DIFF_ROWS  CHUNKS SKIPPED  TIME TABLE
09-04T22:29:52 0 0 1 0 1 0 0.029 test.dsns
TS:完成检查的时间
ERRORS:错误和告警的数量。
DIFFS:是否一致,0代表一致,1代表不一致。
ROWS:表的行数
DIFF_ROWS
CHUNKS:划分的块的数目
SKIPPED:跳过的块的数目
TIME:执行时长
TABLE:表名

pt-table-sync

我们上面介绍了pt-table-checksum可以检查主从数据的一致性,接下来我们就来说一下如何进行主从数据的同步。参考官方文档时就已经晕了,写出来之后难免有纰漏之处,还请读者朋友多多批评指正。

该工具采用replace into的方式同步数据,建议同步的表上要有主键或者唯一索引,否则replace into就和普通的insert语句一样了,会导致主库出现数据重复的情况。如果表上没有主键,变更需要再从库执行命令,并且指定--no-check-slave。

该工具可以以两种方式运行,当使用--replicate参数时,会使用由pt-table-checksum命令检测的结果进行同步,否则它会自动检测不一致并且修复。

当你使用了--replicate时,说明已经通过checksum工具检测出差异并保存在数据表里了,需要确定是否使--sync-to-master选项,如果使用该选项,则表示在使用pt-table-sync时仅接受一个DSN主机,并且是slave的DSN。工具会自动找出它的主库,找出差异进行同步。

如果你没有指定--sync-to-master参数,则DSN代表的是主库,工具会自动它的从库进行数据同步。

如果不使用--replicate,则分为以下几种情况:

当只有一个DSN信息时,并且指定了--sync-to-master,那么DSN信息必须是从库,否则会报错。

当有多个DSN主机时,第一个DSN是源端数据库,这时候并不区分主库或者从库,它会按照顺序向后面的DSN主机同步数据。

使用示例:

1. 在上面的例子中,我们已经通过pt-table-checksum检测出主从的不一致的表,接下来我

们开始进行同步。下面的命令中指定了--replicate,并且未指定--sync-to-master,则-h代表主库。

pt-table-sync  h=36.30.39.117,P=3306,u=syncuser,p=Syncuser@123 --database=test --replicate='test.checksums' --execute

2. 同时指定--replicate和--sync-to-master,DSN只能有一个,且为从库。

pt-table-sync  h=36.30.39.176,P=3306,u=syncuser,p=Syncuser@123 --database=test --tables=t1 --replicate='test.checksums' --sync-to-master --execute

3. 如果只指定一个DSN,那么必须使用--replicate或者--sync-to-master中的一个,否则报错: At least one  DSN is required, and at least two are required unless --sync-to-master or --replicate is specified。 这里我们指定了--sync-to-master,那么DSN信息就代表了从库。

pt-table-sync h=36.30.39.176,u=syncuser,p=Syncuser@123,D=test,t=t1 --sync-to-master --execute

4. 当有多个DSN时,如果指定了--sync-to-master,那么所有的主机均为从库。否则报错:

Can't determine master of D=test,h=…..,p=...,t=t1,u=syncuser at /usr/bin/pt-table-sync line 10020.         

pt-table-sync h=36.30.39.176,u=syncuser,p=Syncuser@123,D=test,t=t1 h=36.30.39.213,u=syncuser,p=Syncuser@123,D=test,t=t1 --sync-to-master --execute

5. 多个DSN,不指定--sync-to-master和--replicate,如果需要修复从库的数据需要指定

--no-check-slave。

pt-table-sync h=36.30.39.117,u=syncuser,p=Syncuser@123,D=test,t=t1  h=36.30.39.176,u=syncuser,p=Syncuser@123 h=36.30.39.213,u=syncuser,p=Syncuser@123 --no-check-slave –execute

参数详解:

--ask-pass: 连接MySQL时提示输入密码。

--[no]bin-log: 指定是否记录二进制日志,如果是--no-bin-log相当于执行了set sql_log_bin=0.

--[no]check-slave: 检测目标服务器是否是从库。如果目标服务器是从库的话,直接对其变更是不安全的,但是有时候必须要这么做,所以此时需要指定参数--no-check-slave。

--chunk-size: 指定表分块的chunk大小。

--dry-run: 分析同步的过程,并打印出信息退出,并不实际执行。

--execute: 指定工具执行变更操作,使表数据达成一致。

--print: 打印出工具需要执行哪些语句来变更表。

--wait: 如果存在主从延迟,从库可以等待多长时间追上主库,等待的时间由该参数设置,超时会终止退出。

DSN选项:

DSN syntax is key=value[,key=value...]  Allowable DSN keys:
KEY MEANING
=== =============================================
A 指定字符集
D 同步的数据库
P 端口
S Socket文件
h 要连接的host
p 数据库密码
t 要同步的表
u 数据库用户

注意事项及建议

1. 当出现主从不一致时,我们需要判断哪个库的数据是正确的,大多数情况我们希望在主库执行变更并且同步到从库。

2. 建议要同步的表要有主键,避免出现数据重复的问题。

3. 执行变更命令前先通过--print或者--dry-run进行检查。

4. 使用多个DSN选项时,按照数据同步方向填写主机信息,如果有从库需要配合--no-check-slave参数使用。

5. 该工具在进行校验分析时会对表执行for update操作,避免在业务高峰期进行。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK