Slave SQL线程与PXB FTWRL死锁问题分析
1. 问题背景
2.27号凌晨生产环境MySQL备库在执行备份期间出现因FLUSH TABLES WITH READ LOCK未释放导致备库复制延时拉大,慢日志内看持锁接近25分钟未释放。
版本:
- MySQL 5.7.21
- PXB 2.4.18
慢查询日志:
备份脚本中的备份命令:
mysql_kill.sh的主要逻辑内容:
备份参数:
2. 问题复现及分析
2.1 问题分析
- 144是SQL线程,并行复制中的Coordinator线程;
- 145/146是并行复制的worker线程,145/146worker线程队列中的事务可以并行执行。
- 162线程是执行innobackup执行的flush tables with read lock;
144 Coordinator线程分发relay log中事务时发现这个事务不能执行,要等待前面的事务完成提交,所以处于waiting for dependent transaction to commit的状态。145/146线程和备份线程162形成死锁,145线程等待162线程 global read lock 释放,162线程占有MDL::global read lock 全局读锁,申请全局commit lock的时候阻塞等待146线程,146线程占有MDL:: commit lock,因为从库设置slave_preserve_commit_order=1,保证从库binlog提交顺序,而146线程执行事务对应的binlog靠后面,所以等待145的事务提交。最终形成了145->162->146->145的死循环,形成死锁。
三个线程相互形成死锁,还是很少见的。
2.2 相关参数为何未生效
--ftwrl-wait-timeout=60 指的是执行FTWRL之前,如果检测到存在长SQL,先等待指定时间(秒),如果超时后还存在长SQL,则备份报错退出。默认为0则表示立即执行。
--ftwrl-wait-threshold=5 指的是执行FTWRL之前,检测长SQL的方法,如果在执行flush前存在已经运行了超过指定时间(秒)的SQL,则将该SQL定义为长SQL,默认60s。
--kill-long-queries_timeout=0 在执行FTWRL后,如果flush操作被阻塞了N秒,则kill掉阻塞它的线程,默认0的情况就是不kill任何阻塞flush的SQL,直到该SQL执行完成。
从上面各个参数的解释,不难看出,--ftwrl-wait-*参数是针对执行FTWRL之前的长SQL检测机制,对于已执行FTWRL时无济于事,--kill-long-*参数则是设置默认值0,不起任何作用。
3. 结论与建议
- PXB备份中执行FTWRL加全局读锁与SQL线程形成死锁是导致本次从库延迟过高的原因。
- 启用
--kill-long-queries\_type
和--kill-long-queries\_timeout
参数,在检测到flush被阻塞后执行kill掉相关线程的操作。比较暴力,存在较大的风险,若备库无业务访问则可考虑。 - 启用
--safe-slave-backup
参数,执行备份时该参数会停掉SQL线程,从而避免死锁的产生。仅建议在无业务访问的备库上执行。 - 设置MySQL参数
slave\_preserve\_commit\_order=0
,关闭从库binlog的顺序提交,关闭该参数只是影响并行复制的事务在从库的提交顺序,对最终的数据一致性并无影响,所以如果无特别要求从库的binlog顺序必须与主库保持一致,可以考虑设置slave\_preserve\_commit\_order=0
避免死锁的产生。
Enjoy GreatSQL :)
关于 GreatSQL
GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。
相关链接: GreatSQL社区 Gitee GitHub Bilibili
GreatSQL社区:
社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html
社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html
(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)
技术交流群:
微信&QQ群:
QQ群:533341697
微信群:添加GreatSQL社区助手(微信号:wanlidbc
)好友,待社区助手拉您进群。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
开源日报 | 开源模型行业化;国产Sora的秘密;谷歌Python基金会团队裁员;通义千问千亿参数模型开源;开源鸿蒙价值
欢迎阅读 OSCHINA 编辑部出品的开源日报,每天更新一期。 # 2024.4.28 今日要点 谷歌 Python 基金会团队被裁员 Thomas Wouters 是谷歌 Python 工程师、CPython 核心开发者兼 Python 指导委员会成员,昨天晚上他在社交媒体发布动态称:包括自己在内的同事、主管均已被裁员。 综合 Thomas 本人陈述和其他网友的补充评论,谷歌解雇了内部参与 Python 基金会工作的团队,并要求被裁员工对将在慕尼黑办公室【接替他们工作】的员工进行培训。 阿里巴巴开源 1100 亿参数 Qwen1.5-110B 模型 阿里巴巴宣布开源 Qwen1.5 系列首个千亿参数模型 Qwen1.5-110B,该模型在基础能力评估中与 Meta-Llama3-70B 相媲美,在 Chat 评估中表现出色,包括 MT-Bench 和 AlpacaEval 2.0。 据介绍,Qwen1.5-110B 与其他 Qwen1.5 模型相似,采用了相同的 Transformer 解码器架构。它包含了分组查询注意力(GQA),在模型推理时更加高效。该模型支持 32K token...
- 下一篇
Smart Admin 高质量代码快速开发平台 v3.3.0 发布,新增多项功能
SmartAdmin「高质量代码、简洁、高效、安全」的快速开发平台 v3.3.0 已重磅发布,更新如下: 1、【新增】uniapp 首页菜单功能区多平台适配 2、【新增】菜单组件路径说明 3、【优化】长时间不在线自动返回登录页 4、【优化】标签页 tab 为圆角 5、【优化】升级 sa token 到 1.37.0 6、【优化】代码生成表单弹窗 关闭事件 7、【优化】接口操作日志@OperateLogAspect 对文件的处理 SmartAdmin 由 河南·洛阳 1024创新实验室 坚持以 「高质量代码」为核心,「简洁、高效、安全」的中后台解决方案! 国内首个满足《网络安全》、《数据安全》、三级等保, 支持登录限制、支持接口国产加解密、支持数据加解密等一系列安全措施的开源项目。 我们开源一套漂亮的代码和一套整洁的代码规范,让大家在这浮躁的代码世界里感受到一股把代码写好的清流!同时又让开发者节省大量的时间,减少加班,快乐工作,保持谦逊,保持学习,热爱代码,更热爱生活 技术体系 前端:Vue3 + Vite5 + Vue-Router + Pinia + Ant Design Vue ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Mario游戏-低调大师作品
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2配置默认Tomcat设置,开启更多高级功能