mysql pt check sum_MySQL主从复制中常见的3个错误及填坑方案 - MySQL - dbaplus社群:围绕Data、Blockchain、AiOps的企业级专业社群。技术大咖、原...

一、问题描述

主从复制错误一直是MySQL DBA一直填不完的坑,如鲠在喉,也有人说mysql主从复制不稳定云云,其实MySQL复制比我们想象中要坚强得多,而绝大部分DBA却认为只要跳过错误继续复制就好啦,接下来不发生错误就好了,其实跳过错误就会有数据不一致的风险,数据不一致可能还会越来越严重,而我就复制错误中反复出现的1045、1032和1062错误引起的数据库主从不一致的的现象进行深入分析及给出一套完善的解决方案。

(1) 【ERROR】1452:无法在外键的表插入参考主键没有的数据

0811adf96dad916935829cb5ac44d0e3.png

(2) 【ERROR】1032:删除或更新数据,从库找不到记录

54e79f7184b6a4eed280e79e452f6fb1.png

(3) 【ERROR】1062:从库插入数据,发生唯一性冲突

8c5837fa4f29d9995ed770bde39d7308.png

二、原因分析

【ERROR】1452:无法在外键的表插入或更新参考主键没有的数据。由于item_discovery.itemid字段(外键)参考了items.itemid字段(主键),当要在item_discovery表插数据时,如果items表的主键没有对应的数据,则无法插入,报1452错误。此时可以检查参考的表的主键是否有主库对应的数据,如果有,则插入参考的表相应的数据,再开启复制恢复SQL线程。

【ERROR】1032:删除或更新从库的数据,从库找不到记录。此时,主库的数据是比从库新的,可以采取从库添加相同的数据在开启复制恢复SQL线程。

【ERROR】1062:从库插入数据,发生唯一性冲突。此时从库已经有相同主键的数据,如果再插入相同主键值的数据则会报错。可以查看主库的改行数据与从库的要插入数据是否一致,如一致则跳过错误,恢复SQL线程,如不一致,则以主库为准,将从库的该行记录删除,再开启复制。

如果当前高可用架构为Master-Master,则以下均在从库的操作都必须set sql_log_bin=0,避免从库执行的语句同步到主库(恢复时以主库的数据为准)。

三、标准化处理方案

(旨在落成标准化处理方案)

1.临时解决方案(业务运行期间不适宜使用数据对比和修复工具)

【ERROR】1452:

f9abdceb24d3e5a7e72f8c761aa203b6.png

普通主从复制环境

从库:

532fd0a0d73a8f1c1cec95530d05eddb.png

主库:

查看主库在出错的相应位置的执行语句,可通过SQL得出当时insert或者update的对应的主键值。

fd0935e93510d361ca1fb4fe4425375a.png

查询item_discovery的外键约束c_item_discovery_1参考的表items对应主键值的数据行。

8ef37436b3442ae2cc5513554f844e2a.png

从库:

在items表插入主库查询出来的数据。

6fcb583b68557f7f59f6ec4c13044928.png

基于GTID复制环境

与普通主从复制环境处理方式相同。

【ERROR】1032:

96d4e8923d29c015c0c28d4fc5474e2a.png

发生1032可能是delete或者update时从库没有对应数据行,可以分两种情况处理:

(1)如果是Could not execute Delete_rows,则可以直接跳过错误

普通主从复制环境

从库:

489b5f45c32f8f78d9764c2f14de20ec.png

基于GTID复制环境

从库:

找出复制出错时的executed_Gtid_Set,若出现多个,则选择跟Master_uuid相同的那一条。

f9d45d395b13a175a98e6082b108937a.png

(2)如果是Could not execute Update_rows,则需要在二进制日志找出出错位置的SQL,再找出该表在主库的对应的数据行,然后直接在从库插入这条数据,开启SQL线程恢复。

普通主从复制环境

从库:

6bac1206ce24b19f0cacbeaaa166da05.png

主库:

查看主库在出错的相应位置的执行语句,可通过SQL得出当时update的对应的主键值。

41fa51225349fa8053e57388322f7b46.png

查询item_discovery的对应主键值的数据行。

ee6c11225a80187eb229aab22a2a891a.png

从库:

在items表插入主库查询出来的数据。

a81014d368c9d45ee7ab36c82625d28c.png

基于GTID复制环境

与普通主从复制环境处理方式相同。

【ERROR】1062:

ab317ffd3f555683fda567e6ec9b09ac.png

普通主从复制环境

从库:

50973acd5b11559472bbcb4e67405b27.png

主库:

查看主库在出错的相应位置的执行语句,可通过SQL得出当时insert的对应的主键值。

53708c5e5ffe98e66fa8088b9268f25b.png

查询trends_uint表对应主键值的数据行。

9c51a815797df5a3b19b6001df42520f.png

从库:

在trends_uint表删除主库查询出来的数据。

68c181a13173de641aa293ce165a3dc7.png

基于GTID复制环境

与普通主从复制环境处理方式相同。

2.彻底解决方案

使用pt-table-checksum和pt-table-sync彻底修复数据不一致。

注意:使用pt工具包首先要安装pt工具包和安装perl模块。

(1)   从库停止复制

319f38e66c52acdc440557c3341f7740.png

(2) 在主库创建校验信息表

9c1013da58bd6ab07fe7d00ca3d4a8a1.png

(3) 在主库用pt-table-checksum校验主从数据一致性

在从库执行以下语句,查看Last_Error,发现数据不一致的表:

80d878e52b07aa7fad8b76b920267ac7.png

然后返回操作系统执行以下命令:

4e943a44410b969516fb500804da4656.png

该命令可以查看该表是否发生数据不一致情况,若有,则使用pt-table-sync修复。

(4) 在主库用pt-table-sync打印出修复不一致数据的SQL(如果有外键约束,修复数据应先从外键参考的字段所属表开始修复),后将修复语句在从库执行。

7b4c967e765a4bea914615391f13658a.png

四、优化建议

在复制由于1045、1032、1062的原因中断后,应使用三.1的临时解决方案,恢复复制后再在业务低谷使用pt-check-sum检查数据一致性。

检查完后可以在从库执行这条语句查看有无数据不一致表:

3ed6de7feee50fa056db24deefcf40ea.png

针对核心表,可以定制自动数据校验脚本,每周进行数据校验,但必须要在业务低谷进行校验哦!

dc62e43813e075fe8b232081c07fc2b2.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值