一、问题描述

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

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

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

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

二、原因分析

【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:

普通主从复制环境

从库:

主库:

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

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

从库:

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

基于GTID复制环境

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

【ERROR】1032:

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

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

普通主从复制环境

从库:

基于GTID复制环境

从库:

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

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

普通主从复制环境

从库:

主库:

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

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

从库:

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

基于GTID复制环境

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

【ERROR】1062:

普通主从复制环境

从库:

主库:

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

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

从库:

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

基于GTID复制环境

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

2.彻底解决方案

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

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

(1)   从库停止复制

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

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

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

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

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

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

四、优化建议

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

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

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

MySQL主从复制中常见的3个错误及填坑方案的更多相关文章

  1. MYSQL数据库中,常见的数据类型有哪些?它们与java中的数据类型如何对应

    A.常规 映射 integer 或者 int int 或者 java.lang.Integer INTEGER 4 字节 long long Long BIGINT 8 字节 short short  ...

  2. ubuntu 14.04中安装 ruby on rails 环境(填坑版) 呕血推荐

    环境:在win7 上Vmware虚拟机环境中安装的ubuntu 14.04 开发相关: ruby 2.2.0 rails 4.2.0 sublime text 3 本文说明:所有的命令均在$ 之后,若 ...

  3. 随机记录工作中常见的sql用法错误(一)

    没事开始写博客,留下以前工作中常用的笔记,内容不全或者需要补充的可以留言,我只写我常用的. 网上很多类似动软生成器的小工具,这类工具虽然在表关系复杂的时候没什么软用,但是在一些简单的表结构关系还是很方 ...

  4. 转载iOS开发中常见的警告及错误

    iOS警告收录及科学快速的消除方法     前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下面的操作. ...

  5. WPF中嵌入Skyline提供的COM组件填坑

    网上有很多关于在WPF中使用的Skyline提供的COM组件的教程,但大都雷同一律,其中很多的细节均为涉及,本文意在在其原基础上进行一些细节的补充. 工具:Visual Studio 2017 1.  ...

  6. Java 中最常见的 5 个错误

    在编程时,开发者经常会遭遇各式各样莫名错误.近日,Sushil Das 在 Geek On Java上列举了 Java 开发中常见的 5 个错误,与君共「免」. 原文链接:Top 5 Common M ...

  7. MySQL主从复制报错一致性问题解决

    当MySQL主从复制中因为不一致报错的情况,我们第一时间想到的就是使用pt-table-checksum来进行检查主从一致并进行修复,但是使用此工具的前提是主从复制线程都为on状态, 所以这种情况下可 ...

  8. 重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践

    一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库 ...

  9. MySQL主从复制异步原理以及搭建

    MySQL主从复制的原理: 1.首先,MySQL主库在事务提交时会把数据变更作为时间events记录在二进制日志文件binlog中:MySQL主库上的sync_binlog参数控制Binlog日志以什 ...

随机推荐

  1. iOS之设置头像(访问系统相册、本地上传)

    1. UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:                               ...

  2. iOS 系统分析(一) 阅读内核准备知识

    ➠更多技术干货请戳:听云博客 0x01 iOS体系架构 1.1 iOS 系统的整体体系架构 用户体验( The User Experience layer ):SpringBoard 同时支持 Spo ...

  3. 安装Cocoapods时候ERROR: While executing gem ... (Errno::EPERM)

    OS X 10.11 安装Cocoapods 出现问题的解决方法 今天尝试用 Cocoapods安装个第三方库.. 输入pod install, 发现 command not find. WTF! 估 ...

  4. [转]浅谈CSRF攻击方式

    在CSDN中看到对CSRF攻击的原理及防护文章,讲解浅显易懂,特转之: 来源:http://blog.csdn.net/fationyyk/article/details/50833620 一.CSR ...

  5. Linux tmp目录自动清理总结

    在Linux系统中/tmp文件夹下的文件是会被清理.删除的,文件清理的规则是如何设定的呢? 以Redhat为例,这个主要是因为作业里面会调用tmpwatch命令删除那些一段时间没有访问的文件. 那么什 ...

  6. JS/JQuery针对不同类型元素的操作(radio、select、checkbox)

    一.select下拉框 I:javascript方法 1:获取选中的值 F1:   var  myselect=document.getElementById("test");或者 ...

  7. wordpress-4.4.1 数据库表结构解析

    wordpress-4.4.1.zip 安装包  SQL结构 : wp_commentmeta  :文章评论额外信息表. CREATE TABLE IF NOT EXISTS `wp_commentm ...

  8. Node.js 命令行程序开发教程

    nodejs开发命令行程序非常方便,具体操作方式查看下面几篇文章 http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html ...

  9. java并发编程资料

    并发这玩意很有用,把自己在网上看过觉得总结的很好的资料分享出来.猛击下面的地址查看吧 java并发编程:线程池的使用说明 java并发编程系列文章 Java并发性和多线程专题 并发工具类 Java 7 ...

  10. Transaction详细介绍

    闲暇之时浏览技术站点时,看到了对事物写的很好的一篇文章,看完之后感觉讲的实在是太好了. 原文地址:http://my.oschina.net/huangyong/blog/160012 Transac ...