今天本来想在开发测试机上做测试,测试过程中需要flush table ,不过让人想不到的是执行后居然卡住不动了。于是赶紧开启另一个会话查看情况如下:
原来数据库里还有一个慢查询(已经执行了2w多秒),然后继续执行show processlist 观察,更多惊喜还在后面:
所有的查询都在“waiting for table flush” ,够恐怖的吧(这让人想起了waiting for matedata lock),更甚至就算kill 了 flush table 的会话,阻塞依然。最后是直接kill了慢查询才恢复正常。
这里让我们想到一个问题,即很多备份包括mysqldumper,xtrabackup 在备份期间都有flush table with read lock 的操作,如果在备份期间出现了慢查询并且慢查询长时间阻塞,那么可能就会出现比较恐怖的阻塞情况,因此避免的情况可以设置kill超时时间的慢查询。
后来一直想弄明白具体的原因,也巧在网上找到了一篇文章在源码层面进行了解读具体见:mysql阻塞初探。
又一个愉快的周末!