翔云

Just try, don't shy. 最新文章请点击
随笔 - 294, 文章 - 0, 评论 - 27, 阅读 - 49万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

stop slave卡住--事务的事件没有复制完整

Posted on   翔云123456  阅读(111)  评论(0编辑  收藏  举报

在文章stop slave卡住,初步介绍了stop slave的问题现象以及一些原因。

以及文章stop slave 卡住模拟--大事务场景中,介绍了大事务场景中,stop slave的模拟。

本文介绍另外一种情况:一个事务的事件没有完整复制到从库。

主从架构中,在主库上更新数据后,会写入binlog,并复制到从库。

在事务型存储引擎中,如innoDB,数据更新以事务为单位。

一个事务通常有很多event组成,例如begin, commit,query, write_rows等等。

在主库上提交一个事务,事件写入binlog,再复制到从库,从库接着开始回放binlog。从库回放binlog,并不是一个事务的所有event都复制过来以后,才开始回放的,而是一边I/O线程接收binlog日志,一边SQL 线程应用binlog日志。

这样,就可能存在一个问题,如果一个事务的event比较多,只将一部分event复制到从库,此时主库故障 或 网络断开,从库上一直无法接收剩余的event,导致SQL线程一直在等待剩余event。

在这个时候,在从库上执行stop slave,SQL 线程会等待,直到超过等待时间(默认60s),然后回滚事务。

基本的排查思路:

  1. 查看大事务正在执行的event(预先有大事务监控,可以采集正在执行的event)。
  2. 查看从库的错误日志,确定当时从库正在复制的主库的日志位点。使用这个日志位点,在老主库的binlog中查找对应的事件。
  3. 分析原因:
    • 如果正在执行的是begin事件,且从库复制位点对应的事件不是commit,则可以得出,导致stop slave 超时的原因是事务的事件没有接收完整。
    • 正在执行的SQL是 正常更新SQL,则导致stop slave超时原因可能是事务比较大,实际执行很耗时,也可能是事件没有接收完整(因为无法确定正在执行的事务与正在复制的事务是否同一个)。
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示