1197: Multi-statement transaction required more than 'max_binlog_cache_size'(多语句事务所需空间超过了 'max_binlog_cache_size')
MySQL含义
单个事务生成的 binlog 数据超过了 max_binlog_cache_size 定义的内存/缓存限制。该事务无法放入二进制日志,因此失败并被回滚。
原因
超大事务(一次性 INSERT/UPDATE/DELETE 数百万行,或巨大的批量加载)占满了 binlog 缓存。在启用二进制日志(复制/时间点恢复)时,大事务很容易超出此限制。
解决方法
将大事务拆分为小批次;每批之后 COMMIT。如果确实无法避免大事务,增大 max_binlog_cache_size(必要时也增大 binlog_cache_size)。在 ETL/批量加载中,带中间 COMMIT 的分块加载既能避免此错误,也能避免长时间持有锁。
同一数据库的其他条目
- 1055Expression not in GROUP BY (only_full_group_by)(表达式不在 GROUP BY 中)
- 1267Illegal mix of collations(非法的排序规则混用)
- 1030Got error N from storage engine(从存储引擎收到错误 N)
- 1785Statement violates GTID consistency(语句违反 GTID 一致性)
- 3024Query execution was interrupted, maximum statement execution time exceeded(查询执行被中断,超出最大语句执行时间)
- 1298Unknown or incorrect time zone(未知或不正确的时区)
- 1418Function has none of DETERMINISTIC, NO SQL, or READS SQL DATA (binary logging enabled)(函数未声明 DETERMINISTIC、NO SQL 或 READS SQL DATA 中的任何一项)