Mysql

‘LATEST DETECTED DEADLOCK’ InnoDB 狀態輸出中缺少語句資訊

  • January 11, 2022

我正在學習如何解釋輸出中的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,我建議您這樣做。

引用自:https://dba.stackexchange.com/questions/116531