暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

MySQL 主从复制数据一致性校验方法

原创 鸿惊九天 2022-11-23
949

使用pt-table-checksum 来做数据一致性检查,以下步骤均在主库上执行:

  1. 安装依赖包
    yum install perl perl-devel perl-Time-HiRes perl-DBI perl-DBD-MySQ

2.安装percona-toolkit工具包
wget percona.com/get/percona-toolkit.tar.gz

3.Master / Slave 数据库创建用户及授权
Create database pt CHARACTER SET utf8;
GRANT UPDATE,INSERT,DELETE,SELECT, PROCESS, SUPER, REPLICATION SLAVE ON . TO ‘checksums’@‘192.168.1.102’ identified by ‘Adminsynccheck’;
GRANT ALL ON pt.* TO ‘checksums’@‘192.168.1.102’ IDENTIFIED BY ‘Adminsynccheck’;
flush privileges;

use pt;
CREATE TABLE IF NOT EXISTS checksums (
db char(64) NOT NULL,
tbl char(64) NOT NULL,
chunk int NOT NULL,
chunk_time float NULL,
chunk_index varchar(200) NULL,
lower_boundary text NULL,
upper_boundary text NULL,
this_crc char(40) NOT NULL,
this_cnt int NOT NULL,
master_crc char(40) NULL,
master_cnt int NULL,
ts timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (db, tbl, chunk),
INDEX ts_db_tbl (ts, db, tbl)
) ENGINE=InnoDB;

4.校验(Master服务器运行)
pt-table-checksum -u’Adminsynccheck’ -p’Adminsynccheck’ -h192.168.1.102 --databases newtable --nocheck-binlog-format --nocheck-plan --nocheck-replication-filters --replicate=pt.checksums --set-vars innodb_lock_wait_timeout=120

# -h -u -p -P -S -d 连接信息
# --nocheck-replication-filters 检测中忽略mysql 配置参数binlog_ignore_db等。
# --nocheck-binlog-format 不检测日志格式
# --replicate 指定checksum 存储的db和表, 如test.checksum
# --chunk-size, --chunk-size-limit 用于指定检测块的大小。 可控性更强
# --ignore-databases/tables/column 跳出指定元素的过滤
# --lock-wait-timeout innodb 锁的超时设定, 默认为1
# --max-load 设置最大并发连接数
# --replicate-check-only 只输出数据不一致的信息。
# --replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
# --databases= :指定需要被检查的数据库,多个则用逗号隔开。
# --tables= :指定需要被检查的表,多个用逗号隔开
#备注:--no-check-binlog-format 忽略检查binlog格式,否则会报错,默认会去检查statement模式,一般我们都用row模式
# --help以及其他的详见文档。

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

备注:主要观察DIFFS列,标识差异数。

5.查看差异(Slave库运行)

select db, tbl, sum(this_cnt) as total_rows, count(*) as chunks  
 from checksums 
where ( master_cnt <> this_cnt OR master_crc <> this_crc OR isnull(master_crc) <> isnull(this_crc) )
 group by db, tbl; 

6.复制,消除差异(Master服务器运行)

假设newtables数据库tb1表存在差异
i.自动消除差异(不推荐)
pt-table-sync --print --execute --sync-to-master h=10.1.1.7,P=3306,u=checksums,p='checksums' --databases=newtables --tables=tb1

ii.打印出sql语句,人工干预到Slave库执行(推荐)
pt-table-sync --print --sync-to-master h=10.1.1.7,P=3306,u=checksums,p='checksums' --databases=newtables --tables=tb1
pt-table-sync --print --sync-to-master h=10.1.1.7,P=3306,u=checksums,p='checksums'--replicate pt.checksums

#--sync-to-master :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。
#--replicate :指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。
#--print :打印,但不执行命令。
#--execute  :执行命令。

备注:Slave需要授权主库Drop 和Create Temporary Tables权限

7.检验

重新执行一次pt-table-checksum,查看是否还存在差异。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论