mysql修复主备,MySQL主备库数据一致性校验及修复

概述

很多时候需要把一个从库提升为主库,但对从库和主库的数据一致性不敢保证,这时我们就可以利用 pt-table-checksum来检查主库数据的一致性,如果存在不一致的数据,我们可以利用pt-table-sync来修复这些不一致的数据。

工具安装#yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKeyperl-Digest-MD5

#rpm -ivh https://www.percona.com/downloads/percona-toolkit/3.0.13/binary/redhat/7/x86_64/percona-toolkit-3.0.13-1.el7.x86_64.rpm

工具使用

主备架构介绍主:10.8.23.209

备:10.8.23.208;10.8.23.210

pt-table-checksum

在主(master)上通过执行校验的查询对复制的一致性进行检查,对比主从的校验值,从而产生结果。

下面通过实际的例子来解释该工具如何使用:

主库(10.8.23.209)数据:

380623aa9525

从库(10.8.23.208)数据:

380623aa9525

从库(10.8.23.210)数据:

380623aa9525

很明显主备数据不一致,我们使用工具来检测下:pt-table-checksum -h 192.168.1.199 -u root -p'123456' --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums -d test -t zwk

380623aa9525

校验命令参数解释:--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用-d来指定需要检查的数据库。

--no-check-binlog-format:不检查复制的binlog模式,要是binlog模式是ROW,则会报错。

--replicate:把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。

-d:指定需要被检查的数据库,多个则用逗号隔开。

-t:指定需要被检查的表,多个用逗号隔开

-h:Master的地址

-u:用户名

-p:密码

校验结果字段解释:TS:完成检查的时间。

ERRORS:检查时候发生错误和警告的数量。

DIFFS:0表示一致,1表示不一致。

ROWS:表的行数。

CHUNKS:被划分到表中的块的数目。

SKIPPED:由于错误或警告或过大,则跳过块的数目。

TIME:执行的时间。

TABLE:被检查的表名。

好了,命令以及常用参数都介绍了,一起解释下上面执行的效果,通过DIFFS 是1 就可以看出主从的表数据不一致。怎么不一致呢? 通过指定—replicate=test.checksums 参数,就说明把检查信息都写到了checksums表中。

进入备库(10.8.23.208)中查看checksums表的信息:

380623aa9525

进入备库(10.8.23.210)中查看checksums表的信息:

380623aa9525

通过上面找到了这些不一致的数据,如何修复呢?利用另外一个工具 pt-table-sync。

pt-table-sync

高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据。他可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。接着上面的复制情况,主库和从库的aaa表数据不一致,需要修复。pt-table-sync --replicate=test.checksums h=192.168.1.199,u=root,p='123456' --print --charset=utf8

380623aa9525

参数解释:--replicate:指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。

--databases:指定执行同步的数据库,多个用逗号隔开。

--tables:指定执行同步的表,多个用逗号隔开。

h:服务器地址。

u:帐号。

p:密码。

--print:打印,但不执行命令。

--execute:执行命令。

--charset:指定字符集

命令介绍完了,一起解释下执行的效果:通过(--print)打印出来了修复数据的sql语句,可以手动的去从行执行,让他们数据保持一致性。那能否直接执行?当然可以,通过(--execute)#pt-table-sync --replicate=test.checksums h=10.8.23.209,u=root,p='123456' --execute --charset=utf8

380623aa9525

没发现任何异常,然后检查主从数据的一致性:

380623aa9525

主库(10.8.23.209)数据:

380623aa9525

从库(10.8.23.208)数据:

380623aa9525

从库(10.8.23.210)数据:

380623aa9525

OK,数据已经保持一致了。

不过建议还是--print 打印出来的好,这样就可以知道那些数据有问题,可以人为的干预下。

不然直接执行了,出现问题之后不好处理。总之还是在处理之前做好数据的备份工作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值