现场问题
客户使用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.
解决问题
- 找到堵塞其它所有线程的那个线程,kill掉
- 通过processlist查找
- 通过mysqladmin debug查找
- 尽量避免使用MyISAM表
- 备份一定要在备库执行