作者:王福祥
爱可生 DBA 团队成员,负责客户的数据库故障处理以及调优。擅长故障排查及性能优化。对数据库相关技术有浓厚的兴趣,喜欢分析各种逻辑。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
MySQL 主从复制功能可以搭建从库来为 MySQL 创建一套在线的备份系统,但是自身不能独立实现切换;需要借助第三方高可用工具。然而当自身有大事务在运行时会阻塞一些 show 语句;例如“show master status”,造成误判。
场景模拟
1、构造两千万行数据,以事务的形式删除

2、新建会话执行 show master status ,在 sql 语句运行期间执行成功。在 commit 期间被阻塞。

3、show master status 处于 starting 状态,也就是语句开始执行的第一个阶段,启动阶段,准备资源。

4、查看 stack 信息,show master status 是在获取 lock_log 锁时被阻塞
#6 0x0000000000ee8278 in MYSQL_BIN_LOG::get_currrent_log (this=0x1e839c0 <mysql_bin_log>

本文分析了在MySQL主从复制中,大事务执行时如何阻塞`showmasterstatus`命令,导致故障切换的问题。通过详细梳理commit流程和`showmasterstatus`的工作原理,揭示了问题的根源在于lock_log锁的争用。解决方案包括避免大事务和使用`select @@global.gtid_executed`替代`showmasterstatus`获取GTID信息。
最低0.47元/天 解锁文章
851

被折叠的 条评论
为什么被折叠?



