當我們在進行表的更新操作或者是想要drop table的操作的時候,有時候,會卡死,這樣的原因在於事務還未提交或者未回滾。但是此時有其他的用戶在執行表的ddl語句。
(更新表的字段或者刪除掉表)然後,由於表的ddl語句會佔用metadata的獨佔鎖。會導致之後的所有sql都無法執行。
這個時候,我們可以輸入命令 show processlist 查看到所有跟MySQL操作相關的進程。
我們可以看到waiting for table metadata lock 狀態的進程。我們可以將這些進程殺死掉。
我們有時候,在show processlist結果中看不到任何有關於目標表的操作。
這個時候,我們可以看一看 information_schema.innodb_trx這張表
select * from information_schema.innodb_trx;
在事務還沒有完成之前,目標表的鎖是不會被釋放的。
我們可以通過 查看information_schema.innodb_trx表中尋找事務的id,然後kill掉,就可以正常的進行表的ddl語句了。
上述是事務未提交的時候,
當事務開啓了,但是事務裏的sql語句又出錯了。
這時,失敗的語句獲取到的鎖依舊是有效的。所以還是不能對錶進行ddl操作。
performance_schema.events_statements_current
這時,可以從上面的表進行查詢執行失敗的事務的id,然後kill掉
參考網址: http://www.cnblogs.com/digdeep/p/4892953.html