最近开发中遇到的一个MySQL主从延迟的坑,记录并总结,避免再次犯同样的错误。

情景

一个活动信息需要审批,审批之后才能生效。因为之后活动要编辑,编辑后也可能触发审批,审批中展示的是编辑前的活动内容,考虑到字段比较多,也要保存审批活动的内容,因此设计采用了一张临时表,审批中的活动写进审批表(activity_tmp),审批通过之后才把真正的活动内容写进活动表(activity)。表的简要设计如下,这里将活动内容字段合并为content展示:


activity_tmp()
id
status // 审批状态
content //  审批阶段提交的活动内容activity
id
content // 审批通过后真正展示的活动内容

遇到的问题

当时是有编辑触发审批的情况,发现审批通过之后活动内容是空的,于是开始追查问题的原因。这里说一句,当程序出问题的时候,95%都是代码的问题,先不要去怀疑环境出问题。好好的查日志,然后看看你的代码吧。

追查问题回溯

1、查activity_tmp表,发现当时提交审批的活动内容是正常的,而且状态也更新为审批通过了,怀疑是写入activity表失败
2、查activity表,发现审批后的内容确实没有写入,怀疑是代码问题
3、查看代码,代码逻辑没看出问题,怀疑数据库操作失败,查看日志
4、日志显示,有一句insert语句的活动内容为空,活动内容来自上一个mysql执行的是select语句,把该select语句拿出来放到线上的备库查询,发现活动内容是存在的。运行时查询为空,执行完毕后查询时内容存在,初步怀疑是主从延迟问题。
5、报错只是部分失败,确定是主从延迟的问题。

当时的问题代码

$intStatus = $arrInput[‘status’];
$this->objActTmp->updateInfoByAId($intActId, $intStatus);
// 更新后,马上查
$arrActContent = $this->objActTmp->getActByStatus($intStatus);

这就是主从延迟出现的地方,update后,马上get,这是主从复制架构上开发的一个大忌。

解决方案

这类问题的解决方案有两种:

  • 修改代码逻辑

  • 修改系统架构

对于修改代码逻辑,鄙人有两点见解:

  • 如果第二步获取的数据不需要第一步更新的status字段,那就先读,然后再更新

  • 如果第二步获取的数据需要依赖第一步的status字段,那就在读出来的时候先判断是否为空,如果是空的,报错,下一次重试。

总结

其实之前也听到过这样的例子,但是由于没有亲身经历,所以只保留了一种理论上的记忆,实际上印象不深,经历了这么一次踩坑后,印象特别深刻,现在看到别人写这样的代码也能马上发现并指出。还是自己亲身去踩坑印象最深。

日志很重要,详细的日志更重要。日志要记录有用的信息,方便追查问题的时候去追溯问题的本质原因。我觉得日志就应该尽量做成飞机中的黑匣子,帮助我们保存“事故“发生时的所有相关信息。

接下来,会去学习主从复制的原理,敬请期待。

更多精彩内容,请关注个人公众号。

【踩坑记录】记一次MySQL主从复制延迟的坑相关推荐

  1. MySQL主从复制延迟原因及处理思路

    简单概述一下复制逻辑: 1.主库将对数据库实例的变更记录到binlog中. 2.主库会有binlog dump线程实时监测binlog的变更并将这些新的events推给从库(Master has se ...

  2. mysql 触发器采坑记录(mysql 触发器采坑记录 由于不了解mysql创建触发器要记录创建者IP,导致更改创建者IP后,触发器不可执行。 当创建触发器(视图、存储过程、函数)时,如果没有)

    mysql 触发器采坑记录(语序有点凌乱,回头再整理) 由于不了解mysql创建触发器要记录创建者IP,导致更改创建者IP后,触发器不可执行. 当创建触发器(视图.存储过程.函数)时,如果没有指定创建 ...

  3. 动力节点老杜mysql文件_mysql主从复制+mysql主从复制延迟解决方案

    ### 1. 为什么需要mysql主从复制 1. 数据热备 在复杂的业务场景中, 可能因为某一条sql造成了锁表, 这样就会影响正常的业务运行.在复杂的业务场景中, 我们可以使用mysql主从复制, ...

  4. mysql主从复制延迟问题的相关知识与解决方案

    一.如何监控发生了主从延迟? 在从库机器上,执行show slave status,查看Seconds_Behind_Master值,代表主从同步从库落后主库的时间,单位为秒,若同从同步无延迟,这个值 ...

  5. mysql主从复制延迟解决

    mysql主从配置成功,但是过段时间再操作master,发现slave没有同步更新 复制有延迟,slave想要尽可能及时跟上master的进度,可以尝试采用以下几种方法: 1.采用MariaDB发行版 ...

  6. 安装ngtpy踩坑记录(C++打包Python的一些小坑)

    文章目录 前言 一.前期准备 二.大致步骤 坑一:关于解释器的问题 坑二:关于pybind11 写在后面 前言 最近需要使用NGT包,链接: 参考博客,这篇博客对NGT包做了简介,其主要内容翻译自源码 ...

  7. mysql 案例~mysql主从复制延迟处理(2)

    一 简介:今天来聊聊周期性从库延迟的问题,是上一篇的基础分析的一个场景 二 背景:近期每天的指定时间段,收到从库延迟的报警,然后过一段时间恢复.由于从库是提供读服务的,所以需要解决 三 分析思路: 1 ...

  8. mysql replication延迟_深入mysql主从复制延迟问题的详解

    面试mysqldba的时候遇到一个题: 描述msyql replication 机制的实现原理,如何在不停掉mysql主库的情况下,恢复数据不一致的slave的数据库节点? MySQL的复制(repl ...

  9. MySQL主从复制延迟的监测及缓解

    参考:http://blog.csdn.net/jiao_fuyou/article/details/15027447 http://mp.weixin.qq.com/s?__biz=MzA5Nzc4 ...

最新文章

  1. 在Win10下如何实现VS下工程代码的开机自启功能
  2. sencha touch 组件选择器getCmp和ComponentQuery.query()的效率解析
  3. 设置Tomcat字符编码UTF-8
  4. 转:sqlserver2005安装时提示“无法找到产品SQLXml4的安装包。
  5. ###《Effective STL》--Chapter2
  6. mysql boost 5.7.21_mysql 5.7.21 安装配置方法图文教程(window)
  7. 从github clone文件: Failed to receive SOCKS4 connect request ack.
  8. 负数的开方到底等于多少?
  9. 11.标识符_unicode和GBK_各种字符集的关系
  10. HSSFworkbook,XSSFworkbook,SXSSFworkbook区别总结
  11. Node.js新手教程——怎样实现文件上传功能
  12. 转载《XAMPP安装和使用教程》(转)
  13. python编程是啥-Python编程
  14. Android 获取联系人列表
  15. schedule()函数的调用时机(周期性调度)
  16. 哈弗h2s车内时间怎么调_你想拥抱的品质生活,就让哈弗H4乐享版帮你实现吧
  17. UOS 安装nvidia官方显卡驱动
  18. vue axio的使用
  19. C++定义一个描述员工(Employee)基本情况的类
  20. 一个人知道自己为什么而活,他就可以忍受生活加诸他的一切苦难

热门文章

  1. Oracle导出空表解决办法
  2. swift轮播图代码
  3. Win7封装无损廋身清单
  4. BeanUtils威力和代价
  5. Symantec BE 12.5 备份Exchange错误排除
  6. 房子成焦点,被挂马的房产网站仍在增加中
  7. 【性能优化之道】每秒上万并发下的Spring Cloud参数优化实战
  8. [转] vuewebpack多页面配置
  9. windows7/8 安装mysql5.7
  10. CentOS 6.9下配置安装KVM