mysql ftwrl定位_由FTWRL导致的MySQL从库死锁分析及参数深究

本文深入探讨了由FTWRL(Flush Tables With Read Lock)引起的MySQL从库死锁问题,分析了死锁的原因、复现过程以及解决方案。在并行复制和`slave_preserve_commit_order=1`设置下,死锁涉及到全局读锁、提交锁和事务顺序。解决方法包括合理设置参数、避免长时间查询以及理解`kill-long-query-type`参数的正确用法。
摘要由CSDN通过智能技术生成

144Coordinator线程分发relaylog中事务时发现这个事务不能执行,要等待前面的事务完成提交,所以处于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的死循环,形成死锁。

同样的,图二中:

183是备份程序执行的flush tables with read lock;

165是SQL线程,并行复制的Coordinator线程;

166/167是并行复制的worker线程。

e462e6238bafff4b3b4e984ea0dc0e20.png

图二

165Coordinator线程分发的事务还不能执行,进入waiting for dependent transaction to commit的状态,183、166、167三个线程形成死锁,183占有全局读锁,获取全局commit锁的时候进入阻塞,等待167释放事务涉及到表的commit锁;166,167的事务可以并行复制,167占有表级commit锁,但是事务对应的binlog在后面,阻塞等待166先提交进入waiting for preceding transaction to commit的状态;166线程事务执行时提交要获得表级commit锁,但已经被183占有,所以阻塞等待。这样形成了183->167->166->183的死锁。

三个线程相互形成死锁,在我的经验中还是很少见的,又因为涉及的MDL锁是服务层的锁,死锁检测也不会起作用。

死锁原因分析

1、MDL锁

参考:http://mysql.taobao.org/monthly/2015/11/04/

2、flush tables with read lock获取两个锁

MDL::global read lock 和MDL

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值