最近经常线上的Slave老报1062的错误,蛋碎一地,幸好Slave暂时没有用到业务上,也就是说没有做读写分离,所以Slave有问题,影响也不大,但每隔一阵子就报1062主键冲突的错误,让我好纠结,如果不解决的话,我都不敢上Atlas,所以一直在排查到底是什么引起的。虽然大家都知道当Master插入的数据所包含的主键或者唯一键在Slave上已经存在的时候,就会报Last_Errno: 1062,主从同步就断开了。但是奇怪的是每次报1062的时候,Slave上的数据都和Master想插入的数据一样的,这足以排除人为手动插入数据的可能。

排查过程:

1、如果经常出现1062错误的时候,要注意出现的时间点,错误报在那个库那个表,下次再出现的时候是否又是它。

2、当出现1062错误的时候,查看Slave最近的一次备份,看这数据是否早存在Slave上了

3、当出现1062错误的时候,查看Master和Slave的行记录是否一样,如果每次都是一样的,这时可以考虑是是否有定时器调存储过程进行Insert操作。

Slave上报错1062的信息如下:

查一下Master binlog的记录:

可以看到Master binlog是插入了一条记录,登录Master查一下:

之前用的binlog格式是本来是用了默认的mixed,后来以为有可能是binlog的日志格式导致了数据问题,把它修改为ROW了,但问题依旧存在。

mixed格式的问题可以参考:http://mp.weixin.qq.com/s?__biz=MjM5MjIxNDA4NA==&mid=400804310&idx=1&sn=2ea8b7455688a41621b8c9b59fbf822e&scene=0#wechat_redirect

查看Slave上的信息,可以看到binlog格式也是ROW,而且设置为read_only,行数据记录和Master是完全一样的,如下:

到这里是不是觉得有点怪呢,到底Slave上的数据是怎么来的呢?后来查看了一下与这个表相关的存储过程和定时器,如下:(相关的表名我用数字代替了,请见谅!)

Create Procedure 

CREATE DEFINER=`root`@`localhost` PROCEDURE `_sp_1036`()
BEGIN DECLARE _count INT UNSIGNED DEFAULT ; DECLARE _current_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP();SELECT COUNT(*) INTO _count FROM _1030 WHERE F04 IS NOT NULL AND F05 > _current_time;
INSERT INTO _1036 SET F01 = DATE(_current_time), F02 = HOUR(_current_time), F03 = _count ON DUPLICATE KEY UPDATE F03 = VALUES(F03);END Create Event CREATE DEFINER=`root`@`localhost` EVENT `_daily_sp_1036` ON SCHEDULE EVERY HOUR STARTS '2014-01-01 00:00:00' ON COMPLETION PRESERVE ENABLE DO CALL _sp_1036()

这个定时器一个小时运行一次,调用存储过程,向表里插入数据,其实这里的存储过程和定时器写得都没什么问题,问题在 CREATE DEFINER=`root`@`localhost`,历史留下的坑好大啊,Slave上设置了read_only只对普通用户有用,对管理级别的用户是没用的,所以Slave上也执行了定时器到时间就执行存储过程,为了证明Slave有自己产生数据,我们做了测试,把Slave的SQL线程停掉:

可以看到主从同步断开的情况,每个小时整点Slave也会产生一条记录。Slave上的数据是怎么来的,已经很明显了。

从上面可以看到Master的数据和Slave的是一样的,这样先把主从同步处理好,通过set global sql_slave_skip_counter=1  跳过一个事务,如果数据不一致的情况,以Master的数据记录为准:

可以看到出现了跳过一个事务后,报了一条很有趣的Log: the event's master log FIRST 。这时还是报同一条记录的主键冲突,再执行一次

可以看到同步正常了,虽然是正常了,为了保证数据的完整性,建议使用我之前写的pt-table-checksum校验一个数据的完整性。

讨论几个问题:

一、为什么上面的情况有时会有报1062的错误,有时候没有呢?

二、是master同步数据过来的时候报了1062错误,还是slave上执行定时器调存储过程时把数据插入slave的时候报1062呢?

嘻嘻,欢迎大家讨论

总结:

     一、管理好MySQL的权限,实现权限最小化管理,需要什么权限,开什么权限,禁止管理员级别的用户运行程序相关的任何东西。

     二、定期进行主从的数据完整性校验,确保主从的数据是一致性,特别是读写分离场景,一定要重视这类问题

作者:陆炫志

出处:xuanzhi的博客 http://www.cnblogs.com/xuanzhi201111

您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

线上Slave报1062的案例的更多相关文章

  1. 线上MySQL慢查询现象案例--Impossible WHERE noticed after reading const tables

    前言:2012年的笔记整理而得,发布个人博客,做备忘录使用. 背景:线上慢查询日志监控,得到如下的语句:       发现:select doc_text from t_wiki_doc_text w ...

  2. 关于线上js报错问题的思考

    1.有没有可能对线上报错进行实时监控,只要线上报错出现就会以邮件的形式发出来. 2.有没有可能将每个模块和开发者联系起来,只要报错就直接报给开发者

  3. mongoDB线上数据库连接报错记录

    报错信息提示:无法在第一次连接时连接到服务器 别的一切正常,经过查询得知,是因为如果电脑没设定固定IP,并且重启情况下可能会导致IP地址更改. 解决方法: 将本机ip地址添加到cluster的白名单即 ...

  4. 利用Chrome浏览器调试线上代码

    前言 之前调试前端bug都是在开发环境中做完并多次测试没有问题之后发布测试环境,验收合格之后发布生产.但生产环境偏偏会有和开发和测试环境不一致的情况,例如测试环境需要加密,而开发环境先不加密,测试环境 ...

  5. 线上MYSQL同步报错故障处理总结(转)

    前言 在发生故障切换后,经常遇到的问题就是同步报错,数据库很小的时候,dump完再导入很简单就处理好了,但线上的数据库都150G-200G,如果用单纯的这种方法,成本太高,故经过一段时间的摸索,总结了 ...

  6. 前端通信:SSE设计方案(二)--- 服务器推送技术的实践以及一些应用场景的demo(包括在线及时聊天系统以及线上缓存更新,代码热修复案例)

    距离上一篇博客,这篇文章的发布大概过了整整三个月.我也从饿了么度过了试用期,成为了正式员工.刚进来恰好遇到项目底层改造和迁移,将项目从angular全部迁移到vue上,所以适应这边的节奏和业务的开发任 ...

  7. 转载:MySQL:亲测备份策略实例(线上真实备份案例)

    是否为线上库的备份而烦恼过,这里提供一个完整的备份从属数据库的备份方案,亲测可用 说明: 备份从库,按周计,每周进行一次全备 每周一的早上六点进行全备,其他时间备份中继日志 在从库上启用rsync服务 ...

  8. [svc]线上Iptables重启报错

    线上iptables重启了下发现报错,排查了下 [root@xxxx ~]# /etc/init.d/iptables restart iptables: Setting chains to poli ...

  9. angular项目线上地址跳转或刷新报错的解决

    引用地址:https://blog.csdn.net/qq_35415307/article/details/80707463 本地ng项目没问题,到了线上跳转刷新都会报404错误,相信这个问题每个做 ...

随机推荐

  1. python爬虫 前程无忧网页抓取

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  2. 将web应用部署到Tomcat的三种方式

    Tomcat作为Servlet/JSP容器(服务器)挺不错的,开源免费,需要知道的是Tomcat是一个Web服务器,其符合Servlet/JSP规范,但是却没有实现所有JavaEE规范,所以我们还是应 ...

  3. vue基础篇---class样式绑定

    因为class的绑定在实际的工作中会经常用到.所以特意记录一下,有好几种方法. 对象绑定方法,另外一个值来控制显示隐藏 <!DOCTYPE html> <html lang=&quo ...

  4. springboot(七)邮件服务

    简单使用 发送邮件应该是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送营销信息.最早期的时候我们会使用JavaMail相关api来写发送邮件的相关代码,后来spring退出了JavaMai ...

  5. C# 与 SQL Server 的数据类型对应关系

    (一)C#与SQL Server 2005(或以下版本): C# C#取值 SQL Server SQL Server取值 System.DateTime samlltime System.Objec ...

  6. The android command is deprecated

    新版的SDK tools中的android命令已经不支持 android create project,用起来很不顺手. The "android" command is depr ...

  7. Java基础编程题——素数

    package com.yangzl.basic; /** * 判断101-200之间有多少个素数,并输出所有素数. * @author Administrator * */ /*程序分析:判断素数的 ...

  8. 20155334 2016-2017-2 《Java程序设计》第五周学习总结

    20155334 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 第八章:异常处理 Java中所有错误都会被打包为对象,在编程的时候会遇到因各种原因而导致的错 ...

  9. Android的网络通信机制

    1. Socket接口 不常用 2.HttpURLConnection接口 3. HttpClient接口 http://blog.csdn.net/ccc20134/article/details/ ...

  10. script标签中type为"text/x-template"或"text/html"

    写过一点前端的都会碰到需要使用JS字符串拼接HTML元素然后append到页面DOM树上的情况,一般的写法都是使用+号以字符串的形式拼接,如果是短点的还好,如果很长很长的话就会拼接到令人崩溃了. 比如 ...