news 2026/6/10 20:50:04

<span class=“js_title_inner“>MySQL参数max_binlog_cache_size设置不当引发的从库复制中断的案例</span>

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
<span class=“js_title_inner“>MySQL参数max_binlog_cache_size设置不当引发的从库复制中断的案例</span>

日常运维中的坑真是防不胜防,不一小心就遇到别人给你挖的坑。想起多年前生产环境中遇到的因经验不足的DBA不知道从哪拷贝的配置文件(据说是当时参加某培训机构视频培训时资料里的模板,真的是误人子弟呀)放在生产环境而导致数据同步中断的故障。起因是其把max_binlog_cache_size设置成有2G,而MySQL早已将此参数的默认值调整的很大了(18446744073709547520,约16EB),实在没想通为何有人会如此修改。

01 故障描述

突然收到告警,MySQL其中一个从库SQL线程停止,查看日志,其中的错误内容如下:

[ERROR] Slave SQL for channel '': Worker 1 failed executing transaction '370e03bf-aa09-11e9-9bd3-e4434b2aa008:248804226' at master log , end_log_pos 2149953254; Could not execute Update_rows event on table dbname.tbname; Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again, Error_code: 1197; handler error HA_ERR_RBR_LOGGING_FAILED; the event's master log FIRST, end_log_pos 2149953254, Error_code: 1197

提示得很明显,max_binlog_cache_size参数的值小了。

引发此问题的主库执行了几个很大的事务,且从库开启了并行复制,因此需要更大的max_binlog_cache_size来处理innodb事务。

02 故障处理

处理过程倒是非常简单,该参数可以动态修改,因此直接调整主库及从库的值。因为也确实没必要还原为默认值,毕竟达不到那么大,因此,先将其设置为40GB

mysql> set global max_binlog_cache_size=40*1024*1024*1024;Query OK, 0 rows affected (0.00 sec)

注意:

  • 主库及从库均进行调整

  • 动态修改后配置文件也需要修改,以免重启后又还原回去了

  • max_binlog_cache_size参数与binlog_cache_size以及Binlog_cache_use等参数有关,因此设置时要根据实际情况调整,千万不可无脑的跟风设置

  • 注意监控并优化大事务,以免出现类似情况或者大事务导致性能及数据同步问题

03 补充原理:max_binlog_cache_size是如何工作的?

要理解这个故障,我们需要了解MySQL记录二进制日志(Binlog)的机制。

  • Binlog Cache(二进制日志缓存): 当一个事务在MySQL中执行时,它产生的所有修改数据的SQL语句(或基于行的修改事件)并不会立即写入磁盘的Binlog文件。为了提升性能,MySQL会先将其暂存在一个线程级的内存缓冲区中,这个缓冲区就是Binlog Cache。每个会话线程在开启一个事务时,都会分配自己独立的Binlog Cache。

  • 两阶段提交与Cache写入: 在事务提交时,为了保证Binlog和存储引擎(如InnoDB)redo log的一致性,MySQL使用“两阶段提交”。在此过程中,Binlog Cache中的内容会被一次性写入到磁盘上的Binlog文件中。这是一个顺序写入操作,效率很高。

  • max_binlog_cache_size的角色: 这个参数定义了单个事务所能使用的最大Binlog Cache内存大小。如果事务非常大(例如,一次性更新或插入几十万行数据),它产生的日志事件可能会填满其所属线程的Binlog Cache。当缓存使用量超过 max_binlog_cache_size的限制时,MySQL就会报错 ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX(错误码1197),并拒绝执行该事务。

为何从库并行复制下更易触发?

在主库上,大事务执行时就会检查 max_binlog_cache_size。如果主库设置得过小,大事务在主库就会执行失败,根本不会记录到Binlog中,也就不会影响到从库。

在本案例中,问题出在从库。当从库启用并行复制(Multi-Threaded Slave)时,多个工作线程(Worker Thread)会并发回放不同的事务。这些工作线程在应用大事务时,同样需要为自己的任务分配Binlog Cache(用于模拟执行,并非真的写Binlog)。此时,从库上的 max_binlog_cache_size限制就生效了。如果从库的该参数值设置得比主库小,一个在主库成功执行的大事务,在从库却可能因缓存不足而应用失败,导致复制中断。

在工作中你又遇到什么坑的问题吗,欢迎留言区留言交流。

关注微信公众号「数据库干货铺」,获取更多数据库运维干货。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:21:37

Linux-sh -c \dirname

1. 核心深度解析:sh -c (子 Shell 运行) sh -c 的作用是启动一个临时的 子 Shell 来执行引号内的复杂命令字符串。为什么要用它?支持复合指令:xargs 默认只能接一个命令。如果你想用 &&、; 或者 |(管道)组合多…

作者头像 李华
网站建设 2026/6/10 19:12:32

“英”领物联:英飞凌详解构成物联网的五大元素

lin收发器 想必大家对于半导体的概念都不陌生了,那么对于拥有完备功能的物联网设备而言,都需要搭载哪些不可或缺的半导体器件,您是否也了如指掌呢?英飞凌提出了五大硬件元素的概念,分别指的是感知、计算、执行、连接和…

作者头像 李华
网站建设 2026/6/10 11:39:05

学生数据统计不再头疼,学工一体化平台助力辅导员高效减负

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

作者头像 李华
网站建设 2026/6/10 11:43:07

<span class=“js_title_inner“>全栈“进化”公开课邀您参加|文心Moment大会走进大模型高效微调与极致推理全栈工程实践</span>

大模型效果越来越强,为什么真正上线却越来越难?从训练到推理、从算力到部署,工程能力正在成为决定成败的关键。从“模型可用”到“工程好用”,大模型正在经历一场真正的全栈进化。 1月22日下午13:00,全栈“…

作者头像 李华
网站建设 2026/6/10 11:39:03

Python入门篇【异常】

Python【异常】 文章目录Python【异常】一、Bug定义二、捕获异常2.1.基本捕获异常2.2.指定捕获异常提示:以下是本篇文章正文内容,下面案例可供参考 一、Bug定义 早期计算机采用大量继电器工作,马克二型计算机就是这样的。1945年9月9日&#…

作者头像 李华
网站建设 2026/6/10 11:43:18

Thread.sleep()与Object.wait()的区别解析

文章目录Thread.sleep() 与 Object.wait() 的区别解析一、引言:线程的基本操作二、Thread.sleep() 的详解1. 基本概念2. 示例代码3. 核心特点三、Object.wait() 的详解1. 基本概念2. 示例代码3. 核心特点四、Thread.sleep() 和 Object.wait() 的区别1. 调用方式2. 锁…

作者头像 李华