6月底听朋友介绍,有款DBdoctor数据库性能诊断的工具可以免费使用,在他们官网下载以后,对接到了公司的一个业务MySQL实例上进行试用。
差不多两周后,回头想起来这款工具,登上它的管理后台看了看,还真发现了一个潜在问题:查看性能数据的统计时发现,这个实例上存在有大量的Waiting for table metadata lock异常报出,该事件表示部分表在持续一段时间内无法进行读写。
根据DBdoctor的操作手册的介绍,通过Average Action Session(AAS)曲线图可以查看数据库活跃会话。
首先查看24小时的活跃会话情况,如下图橘色所示(7月13日16:00~7月14日16:00),发现全天都有Waiting for table metadata lock出现,基本每小时一次。
然后,选取了两个比较有代表的时间段,一个是7月14日零点前后的,如下图绿色区域(从图例上看到,绿色区域代表的是Waiting for table metadata lock)所示。说明零点时段的锁事件持续了20分钟左右。
又查看了一个其他时段的,如下图蓝色区域(Waiting for table metadata lock)所示,发现非零点时段锁事件持续时间不到1分钟。
ad_rule
问题直接原因:
Lock Tables语句受备份影响,造成了业务阻塞。
与业务开发同事确认上述锁表SQL是特意设计的,每小时锁一次表,在写数据期间不允许读,预期1-2分钟完成写入并解锁;但是备份导致不可读写的时间变长,超出了预期时间。
分析引发MedataLock 时间变长的根因:
锁等待关系总结为:
业务SQL需要MD共享锁,需等待LOCK TABLES xx Write执行完成后释放MD排他锁;LOCK TABLES xx Write需要MD排他锁,需等待该表备份完成后释放MD共享锁。
回顾这个问题的发现和解决过程,DBdoctor这个工具对分析的提效还是挺有帮助的,也帮助业务提前发现了一个潜在问题。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞1
添加新评论0 条评论