使用 pt-table-checksum 检查MySQL数据一致性

简介:pt-table-checksum 主要用来检查主从数据是否一致,原理即在主库执行把表每行的列通过concat函数进行拼接,然后对拼接的值进行hash,并把该动作通过binlog传递到从库,从而在从库上也执行相关操作(pt-table-checksum会自动设置所在会话的binlog_format=statment)。默认主库上每对一个表完成checksum操作后,会等待所有从库对该表完成checksum,然后比对主从库上该表checksum值是否一致来判断数据是否一致。

#!/bin/bash
time_now=$(date "+%Y-%m-%d_%H-%M-%S")

master_ip=`mysql -uroot -p -e "show slave status\G"|grep Master_Host|awk '{print $2}' 2>/dev/null `

cd /data/scripts/table_check_cnt

echo $master_ip

nohup pt-table-checksum --replicate=cnt_percona.checksums --nocheck-replication-filters --no-check-binlog-format --max-load  Threads_running=25 --ignore-databases=mysql,sys,percona,cnt h=${master_ip},u=dba_user,p='',P=3306 >/data/scripts/table_check_cnt/table_check_$time_now.log  &

2 校验结束后,在每个从库上,执行如下的sql语句即可看到是否有主从不一致发生:

select * from percona.checksums where master_cnt <> this_cnt OR master_crc <> this_crc OR ISNULL(master_crc) <> ISNULL(this_crc) 

配置选型:

  • --replicate-check:执行完 checksum 查询在percona.checksums表中,不一定马上查看结果呀 —— yes则马上比较chunk的crc32值并输出DIFFS列,否则不输出。默认yes,如果指定为--noreplicate-check,一般后续使用下面的--replicate-check-only去输出DIFF结果。
  • --replicate-check-only:不在主从库做 checksum 查询,只在原有 percona.checksums 表中查询结果,并输出数据不一致的信息。周期性的检测一致性时可能用到。
  • --nocheck-binlog-format:不检测日志格式。这个选项对于 ROW 模式的复制很重要,因为pt-table-checksum会在 Master和Slave 上设置binlog_format=STATEMENT(确保从库也会执行 checksum SQL),MySQL限制从库是无法设置的,所以假如行复制从库,再作为主库复制出新从库时(A->B->C),B的checksums数据将无法传输。(没验证)
  • --replicate= 指定 checksum 计算结果存到哪个库表里,如果没有指定,默认是 percona.checksums 。

3.使用非默认端口(dsn指定从库)

如果主库使用非默认端口,--recursion-method默认值为hosts,这时如果从库没有配置report_host参数,则pt-table-checksum无法自动检测到从库。

  如果主库使用的是默认端口,那么--recursion-method默认值为processlist,这时pt-table-checksum只能连上端口为3306的从库,无法连接非默认端口的从库

 如果主库或者从库使用了非默认端口,可以通过dsn指定从库信息

在主库创建dsn表,并插入从库信息

CREATE TABLE percona.`dsns` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`parent_id` int(11) DEFAULT NULL,

`dsn` varchar(255) NOT NULL,

PRIMARY KEY (`id`)

);

insert into percona.dsns select 1,1,'h=192.168.136.76,u=dba_user,p=root,P=3306';

insert into percona.dsns select 2,2,'h=192.168.132.77,u=dba_user,p=root,P=3307';

nohup pt-table-checksum --replicate=cnt_percona.checksums --nocheck-replication-filters --no-check-binlog-format --max-load --recursion-method=dsn=h=192.168.201.120,D=percona,t=dsns Threads_running=25 --ignore-databases=mysql,sys,percona,cnt h=${master_ip},u=dba_user,p='',P=3306 >/data/scripts/table_check_cnt/table_check_$time_now.log  &

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值