2026/4/15 17:22:52
网站建设
项目流程
临海市城市建设规划局网站,WordPress屏蔽cn国家访问,做电销哪些网站可以找到客户端,可信赖的顺的网站建设日常运维中的坑真是防不胜防#xff0c;不一小心就遇到别人给你挖的坑。想起多年前生产环境中遇到的因经验不足的DBA不知道从哪拷贝的配置文件#xff08;据说是当时参加某培训机构视频培训时资料里的模板#xff0c;真的是误人子弟呀#xff09;放在生产环境而导致数据同步…日常运维中的坑真是防不胜防不一小心就遇到别人给你挖的坑。想起多年前生产环境中遇到的因经验不足的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 events master log FIRST, end_log_pos 2149953254, Error_code: 1197提示得很明显max_binlog_cache_size参数的值小了。引发此问题的主库执行了几个很大的事务且从库开启了并行复制因此需要更大的max_binlog_cache_size来处理innodb事务。02 故障处理处理过程倒是非常简单该参数可以动态修改因此直接调整主库及从库的值。因为也确实没必要还原为默认值毕竟达不到那么大因此先将其设置为40GBmysql set global max_binlog_cache_size40*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和存储引擎如InnoDBredo 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限制就生效了。如果从库的该参数值设置得比主库小一个在主库成功执行的大事务在从库却可能因缓存不足而应用失败导致复制中断。在工作中你又遇到什么坑的问题吗欢迎留言区留言交流。关注微信公众号「数据库干货铺」获取更多数据库运维干货。