Mysql
‘LATEST DETECTED DEADLOCK’ InnoDB 狀態輸出中缺少語句資訊
我正在學習如何解釋輸出中的
LATEST DETECTED DEADLOCK
部分SHOW ENGINE INNODB STATUS
,並且對輸出有疑問。我們數據庫的一些範例輸出SHOW ENGINE INNODB STATUS
:------------------------ LATEST DETECTED DEADLOCK ------------------------ 2015-09-29 17:00:30 7f9eb7410700 *** (1) TRANSACTION: TRANSACTION 2842247584, ACTIVE 0 sec, thread declared inside InnoDB 4998 mysql tables in use 1, locked 1 LOCK WAIT 5 lock struct(s), heap size 1184, 26 row lock(s) MySQL thread id 69517881, OS thread handle 0x7f9ee07bd700, query id 11929163563 cfsender01.cf.intela.local 192.168.20.116 cfsender01 updating *** (1) WAITING FOR THIS LOCK TO BE GRANTED: ...
請注意,事務 (1) 中沒有列出 SQL 語句。
有誰知道為什麼會發生這種情況,或者缺少 sql 語句
show engine innodb status
會表明該事務是什麼?FWIW,事務 (1) 被 MySQL 選為受害者並回滾。
此外,我們正在執行 MySQL Server 版本:5.6.19-67.0-log Percona Server (GPL),Release 67.0,Revision 618。
客戶端是用什麼語言編寫的?您應該在每個事務中的每個語句(包括 COMMIT)之後測試錯誤。這就是定位問題的方法。
SHOW ENGINE InnoDB STATUS
如您所見,不應該依賴它。更重要的是,它不一定會擷取所有死鎖。
因為查詢已經完成並且 InnoDB 不再知道它是什麼查詢。
SHOW ENGINE InnoDB STATUS
不保證向您提供此資訊。但是,您擁有執行緒 ID,並且您知道檢測到死鎖的時間。您可以使用
mysqlbinlog
來檢查該執行緒在當時或之前執行了哪些查詢。即使您使用 ROW 格式(推薦),您仍然會看到有用的資訊。或者,也許您啟用了慢速日誌。您可能已經記錄了該查詢 - 特別是如果您有
long_query_time=0
,我建議您這樣做。