記錄一次MySQL表無法訪問
在一次真實的開發測試中突然發現數據庫中訂單表 select、update、delete 沒有絲毫反應。以為是服務器性能過低導致MySQL進程執行過慢,但是等待10分鍾訂單表依然毫無反應,更奇怪的是其他表都可正常操作數據。這時我覺得是訂單表壞了,想把訂單表drop 掉 ,一樣無果。玄學!
排查
1.與同事交流之中,得知他剛剛在訂單表之中增加一個字段之后 MySQL客戶端就一直卡住。他直接強制關閉MySQL連接客戶端 , 之后訂單表無法使用。
2.執行下面命令之后,發現是訂單表死鎖,導致的問題
SHOW OPEN TABLES WHERE IN_USE > 0;
3.查詢死鎖的進程
SHOW PROCESSLIST
4.殺掉死鎖進程ID
KILL ID
法二
1.查看鎖事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2.殺掉死鎖進程ID
KILL ID
MySQL死鎖條件
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之
一不滿足,就不會發生死鎖。