【故障分析】排查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。這裏直接殺掉擁有鎖的線程。

 

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