error 1197是因单事务binlog event总量超出max_binlog_cache_size硬限制所致,非磁盘或权限问题;需优先拆分事务,调参仅作临时缓解,且主从参数必须一致、并配合stop/start slave生效。

报错 ERROR 1197 (HY000) 不是磁盘满或权限问题,而是单个事务生成的 binlog event 总量超出了 max_binlog_cache_size 的硬性限制——哪怕你设成 2GB,只要事务本身没拆分,照样会崩。
为什么 max_binlog_cache_size 会触发复制中断
MySQL 在 ROW 格式下记录 binlog 时,每个被修改的行都会生成独立的 Write_rows 或 Update_rows event。一个影响 50 万行的 UPDATE,可能产生远超 100MB 的 binlog 缓存需求。而该参数限制的是「单事务」能使用的最大内存缓冲(含落盘临时文件上限),不是总日志大小。
-
binlog_cache_size是每个会话私有缓冲,默认 32KB,只影响单语句;max_binlog_cache_size才管多语句事务的总容量 - 从库开启并行复制(
slave_parallel_workers > 0)时,Coordinator 需为每个 Worker 分配独立缓存空间,实际消耗翻倍 - 主库
binlog_format=ROW+ 从库也开log_bin(即级联复制),会导致 binlog 被二次解析和缓存,进一步放大压力 - 错误日志里出现
Worker 1 failed executing transaction,基本可锁定是并行复制场景下的缓存不足
怎么判断是不是真需要调大 max_binlog_cache_size
先看监控指标,别一上来就改参数:
- 查状态变量:
SHOW GLOBAL STATUS LIKE 'Binlog_cache%';—— 如果Binlog_cache_disk_use占Binlog_cache_use比例超过 5%,说明频繁落盘,缓存确实偏小 - 查当前值:
SELECT @@max_binlog_cache_size;—— MySQL 8.0 默认 64MB,5.7 是 4MB;但若显示接近18446744073709547520(即 16EB),其实是“不限制”,此时报错必是其他原因(如主从参数不一致) - 对比事务实际 binlog 体积:用
mysqlbinlog --base64-output=decode-rows -v解析对应 binlog 文件片段,估算单事务 event 总长 - 确认主从是否一致:
SELECT @@max_binlog_cache_size在主库和所有从库上分别执行,值必须完全相同
临时应急:安全调整 max_binlog_cache_size
仅适用于明确可控的短期操作,且必须主从同步调整:
- 动态设置(立即生效,但重启丢失):
SET GLOBAL max_binlog_cache_size = 1073741824;(1GB) - RDS/PolarDB 用户必须通过控制台参数模板修改,
SET GLOBAL无效 - Linux 下修改配置文件后需重启:
max_binlog_cache_size = 2G(注意单位是字节,配置文件中支持G后缀) - 切勿设为 0 或超大值(如 100G):会挤占 InnoDB buffer pool,反而引发 OOM 或锁等待加剧
- 调参后务必执行
STOP SLAVE; START SLAVE;重置复制线程,否则旧缓存不会释放
真正要做的:把大事务拆成小事务
调参只是止痛药,拆事务才是根治方案。重点防住三类高危 SQL:
-
INSERT INTO t SELECT * FROM s WHERE ...:按主键或时间字段分段,例如加AND id BETWEEN 1 AND 10000循环执行 -
UPDATE/DELETE带OR、函数、隐式类型转换:先EXPLAIN确认走索引,再用LIMIT分批,如UPDATE t SET x=1 WHERE y=2 LIMIT 5000 - 批量导入
LOAD DATA INFILE:改用客户端分片,或在 SQL 层加SET SESSION binlog_format='STATEMENT'(仅限确定无复制风险的场景) - 应用层加重试逻辑:捕获
ERROR 1197后自动降级为分批执行,而不是直接失败
最易被忽略的一点:即使你把 max_binlog_cache_size 设到 4GB,只要事务未拆分,它仍会阻塞整个复制线程(尤其在 slave_parallel_type=DATABASE 下),导致 Seconds_Behind_Master 瞬间飙升。拆事务不是“优化”,是复制稳定性的底线。











