查找MySQL Table Lock

现场问题

客户使用Xtrabackup在进行备份,今天上班发现数据库完全不能使用了。通过processlist看到如下信息。

查找问题

可以看到xtrabackup执行了FTWRL,此操作会阻塞住后续所有的操作,所以后续其它会话出现了waiting for global read lock.

FTWRL也被阻塞住了,但是除了FTWRL被阻塞,还有很多时间更久的线程被阻塞住了,报的是waiting for table level lock。可以知道肯定是MyIsam表被阻塞了,但是在processlist里面没有找到最长的阻塞其它线程的语句。

猜测可能是执行了LOCK TABLE操作,导致看不到会话信息,但是同样达到了阻塞其它线程的效果。

一般这种问题,我们把最长的那个语句找到,kill之后,集群就正常了。

但是目前从processlist中无法看到哪个会话是执行了LOCK TABLE操作,由于是操作的MyISAM表,故无法从innodb_lock等表中获取所信息。

这时想到了mysqladmin debug操作,可以看到锁信息以及会话id.

解决问题

  1. 找到堵塞其它所有线程的那个线程,kill掉
    • 通过processlist查找
    • 通过mysqladmin debug查找
  2. 尽量避免使用MyISAM表
  3. 备份一定要在备库执行

本文标题:查找MySQL Table Lock

文章作者:Louis

发布时间:2017年09月16日 - 10:09

最后更新:2017年09月25日 - 14:09

原始链接:/2017/09/16/table-lock/

许可协议: Louis-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。