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

  • 问题背景

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

 

  • 排查步骤如下
  1. 查看processlist

show full processlist; 如下:

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

 

2.查看是哪个语句或者会话占有该表的表锁。

select * from performance_schema.metadata_locks where object_schema='test' and object_name='myitest'\G

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

 

3.接着,我们看下线程id=65 和 id=66 的线程目前分别的连接和语句是什么。

select * from performance_schema.threads where processlist_db='test'\G

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

 

4. 解决

这里可以根据实际情况进行处理。可以kill 掉拥有锁的操作。也可以kill 掉查询操作。这里kill processlist_id。具体如下:

kill 25 或者 kill 26

 

5.上面的排查过程,主要是通过performance_schema 中统计的信息进行排查的。这里也可以通过sys 进行排查。通过sys 排查的话,会比较简单。如下:

select * from sys.schema_table_lock_waits\G

schema_table_lock_waits 这里给出了建议的方法。比如kill 31。这里直接杀掉拥有锁的线程。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章