找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2014

积分

0

好友

290

主题
发表于 昨天 05:29 | 查看: 4| 回复: 0

一、问题概述

一套 MySQL 从库在执行主从复制时出现报错,具体错误信息如下:

[ERROR][MY-816584][Repl) Slave SQL for channel '': Worker 1 failed executing transaction ‘ba29b661-5a98-11ed-blfc-08505698cce4:237961657’ at master log mysql-bin.802883, end log pos 548199875; Could not execute Write rows event on table_xx.xx; Multi-statement transaction required more than ‘max_binlog_cache_size’ bytes of storage ; increase this mysqld variable and try again , Error_code :1197; Writing one row to the row- based binary log failed , Error_code :1534; handler error HA_ERR_RBR_LOGGING_FAILED ; the event ‘s master log mysql-bin.082883, end_log_pos 548199875, Error_code : MY-001197

错误代码 1197 明确指出,问题源于事务所需的二进制日志缓存空间超过了 max_binlog_cache_size 参数的设定值。

二、问题分析

根据 MySQL 官方文档说明,max_binlog_cache_size 参数用于控制单个事务可以使用的最大二进制日志缓存大小(以字节为单位)。

MySQL max_binlog_cache_size参数官方说明

当从库应用(回放)主库的大型事务时,如果该事务对缓存的需求量超过了此参数的设定上限,服务器就会抛出上述错误。这通常意味着当前的 max_binlog_cache_size 值设置过小,无法处理业务中产生的复杂或数据量较大的事务。该参数支持动态修改,调整后无需重启 MySQL 服务,对业务影响较小。

相关参数说明:

  • max_binlog_cache_size:主要针对事务性语句(如 INSERTUPDATEDELETE)的二进制日志缓存大小。
  • max_binlog_stmt_cache_size:针对非事务性语句(如 SELECT)的缓存大小。若遇到非事务语句的类似缓存错误,也需要同步检查并调整此参数。

最佳实践建议:参数值的设置需要权衡。设置过小会导致大型事务执行失败;设置过大则可能造成不必要的内存浪费。建议通过监控 Binlog_cache_disk_use(使用了临时文件缓存的事务数)等状态变量,观察系统运行情况,从而找到一个平衡点进行优化。

三、解决方案

解决此问题的核心思路是适当增加 max_binlog_cache_size 的值。以下是详细的操作步骤。

1. 检查当前参数值

首先,我们需要分别检查主库和从库上该参数的当前设置,以确认是否存在配置不一致的情况。

登录主库查询:

mysql> SHOW VARIABLES LIKE 'max_binlog_cache_size';
+-----------------------+----------------------+
| Variable_name         | Value                |
+-----------------------+----------------------+
| max_binlog_cache_size | 1073741824           |
+-----------------------+----------------------+
1 row in set (0.02 sec)

(示例显示主库值约为 1GB)

登录从库查询:

mysql> SHOW VARIABLES LIKE 'max_binlog_cache_size';
+-----------------------+----------------------+
| Variable_name         | Value                |
+-----------------------+----------------------+
| max_binlog_cache_size | 536870912            |
+-----------------------+----------------------+
1 row in set (0.02 sec)

(示例显示从库值约为 512MB,明显小于主库)

通过对比发现,从库的 max_binlog_cache_size 值小于主库。当主库执行一个需要约 1GB 缓存的事务时,从库因为限制更小而无法成功回放,从而触发了错误 1197。

2. 动态调整参数值

确认问题后,可以在从库上动态调整该参数,无需重启MySQL服务。通常,为了确保主从能够处理同样规模的事务,建议将从库的值设置为与主库一致或根据从库实际负载调整。

在从库执行:

SET GLOBAL max_binlog_cache_size = 1073741824;

重要提示:

  • 设置的值必须是 4096 字节的倍数。
  • 为了保证 MySQL 服务重启后配置依然生效,必须同时修改配置文件 my.cnf(或 my.ini)中的 max_binlog_cache_size 参数。

3. 重启从库 SQL 线程

动态修改参数后,需要重启从库的 SQL 线程以使新的参数值生效。

STOP SLAVE SQL_THREAD;
START SLAVE SQL_THREAD;

或者使用简写:

STOP SLAVE;
START SLAVE;

4. 验证修复结果

执行以下命令检查从库复制状态,确认错误已消除:

SHOW SLAVE STATUS\G

在输出结果中,重点关注:

  • Slave_SQL_Running:应为 Yes
  • Last_SQL_Errno:应为 0
  • Last_SQL_Error:应为空。

如果这些指标正常,则表明 Error 1197 问题已得到解决,主从复制恢复正常。

四、总结与建议

  1. 配置一致性:在 主从复制 架构中,务必确保主库和从库的关键参数(如 max_binlog_cache_size)设置一致或从库配置不低于主库,以避免因配置不匹配引发的复制中断。特别是在处理包含大量数据修改的高并发事务时,这一点尤为重要。
  2. 生效时机SET GLOBAL 命令修改的参数值对新建立的会话立即生效,但已存在的复制SQL线程可能仍在使用旧值。因此,修改参数后重启SQL线程是必不可少的步骤
  3. 长期优化:如果该错误反复出现,建议深入分析业务中产生的大型事务模式,从SQL语句优化或业务逻辑拆分方面进行根本治理,而不是无限制地调高缓存参数。

参考文档:

希望本篇针对 MySQL 主从复制错误 1197 的案例分析能为您带来帮助。在实际运维中遇到棘手的数据库问题,欢迎到 云栈社区 与广大开发者一起交流探讨。




上一篇:C++内存泄漏的10种常见原因分析与解决方案
下一篇:PostgreSQL WAL机制核心功能选择题解析
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-11 13:58 , Processed in 0.199166 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表