故障分析|【故障分析】排查myisam 引擎表查询阻塞问题

  • 问题背景
myisam 表查询的时候,长时间阻塞。myisam 表本身数据量不大。

  • 排查步骤如下
  1. 查看processlist
show full processlist; 如下:
故障分析|【故障分析】排查myisam 引擎表查询阻塞问题
文章图片

这里可以看到查询被阻塞,是因为在等待获取表锁。

2.查看是哪个语句或者会话占有该表的表锁。
select * from performance_schema.metadata_locks where object_schema='test' and object_name='myitest'\G
故障分析|【故障分析】排查myisam 引擎表查询阻塞问题
文章图片

从metadata_locks 表中。我们可以知道,id=65 的线程目前拥有 myitest表的排它锁。 而id=66 的线程则在队列中,等待获取myitest表的共享锁。

3.接着,我们看下线程id=65 和 id=66 的线程目前分别的连接和语句是什么。
select * from performance_schema.threads where processlist_db='test'\G
故障分析|【故障分析】排查myisam 引擎表查询阻塞问题
文章图片

到这里,大概就可以知道。select * from myitest 被阻塞的原因。是被processlist_id=25的操作给阻塞了。processlist_id=25进行了一个锁表的动作。

4. 解决
这里可以根据实际情况进行处理。可以kill 掉拥有锁的操作。也可以kill 掉查询操作。这里kill processlist_id。具体如下:
故障分析|【故障分析】排查myisam 引擎表查询阻塞问题
文章图片

kill 25 或者 kill 26
故障分析|【故障分析】排查myisam 引擎表查询阻塞问题
文章图片


5.上面的排查过程,主要是通过performance_schema 中统计的信息进行排查的。这里也可以通过sys 进行排查。通过sys 排查的话,会比较简单。如下:
故障分析|【故障分析】排查myisam 引擎表查询阻塞问题
文章图片

select * from sys.schema_table_lock_waits\G
故障分析|【故障分析】排查myisam 引擎表查询阻塞问题
文章图片

schema_table_lock_waits 这里给出了建议的方法。比如kill 31。这里直接杀掉拥有锁的线程。
【故障分析|【故障分析】排查myisam 引擎表查询阻塞问题】

    推荐阅读