news 2026/4/11 17:23:46

<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/4/4 2:01:48

Linux C/C++组件编译全解析:从源码到可执行文件的奥秘

引言:为什么需要了解文件后缀? 在Linux C/C开发中,不同文件后缀代表着不同的编译阶段和用途。作为开发者,理解这些后缀的含义不仅有助于构建系统,还能在调试和优化时提供重要线索。本文将基于QEMU项目中virtio-balloon…

作者头像 李华
网站建设 2026/4/2 13:48:33

CPU/内存/硬盘/网络信息提取——工业级一句话指令集

文章目录 🚀 CPU/内存/硬盘/网络信息提取——工业级一句话指令集 🔍 核心设计原则 🖥️CPU 信息(物理/逻辑/频率) 1. 物理CPU数 + 逻辑CPU数 + 每核线程数 2. 物理CPU型号 + 主频(实时 + 标称) 3. CPU架构 + 字长 + 字节序 4. CPU缓存层级(L1/L2/L3) 5. NUMA节点拓…

作者头像 李华
网站建设 2026/4/10 21:23:19

2026年,Agent与APP必有一战

旧钥匙打不开新大门,旧地图找不到新大陆。 刚过去的2025年,AI炙手可热,人工智能第一次走进人类日常生活——前所未有地通过手机AI甚至AI手机。 但颠覆与创新,也总是伴随“争议”。 从近年手机厂运用AI算法辅助,让更多人…

作者头像 李华
网站建设 2026/4/7 14:36:55

基于PLC的立体车库管理系统设计

基于PLC的立体车库管理系统设计与实现 第一章 绪论 随着城市汽车保有量激增,停车难已成为城市交通治理的核心痛点,立体车库凭借空间利用率高(较传统平面车库提升3-5倍)的优势成为主流解决方案,但传统立体车库多仅具备…

作者头像 李华
网站建设 2026/4/9 21:12:02

DDD 架构演进,单层、三层,四层,工程分层演进过程!

定义接口、创建方法、调用展示,其实编程写代码说到底也就这3步,人人都是程序员👨🏻‍💻。公司老板都觉得,它有个AI工具,它都能写代码。 但现在的系统工程的分层结构,可不只是一层就写个 Controller,甚至是3层(Model-View-Controller),也有可能是4层(DDD)架构。…

作者头像 李华