什么是死鎖?
死鎖是指兩個或多個進程在執行過程中,因爭奪資源而造成的互相等待的狀況,若無外力作用,他們都將無法向前推進。
如何查看MySQL的死鎖日志?
MySQL提供了兩種方式來查看死鎖日志:
方法一:
在my.cnf配置文件中將log-warnings參數的值設定為2或更高。這將在錯誤日志(error log)中,記錄每個被殺掉的線程,以及原因(包括死鎖):
[mysqld]
log-warnings=2
方法二:
在執行show engine innodb status語句后,可以查看到InnoDB存儲引擎的狀態,其中包括死鎖日志的信息。
如何解析MySQL的死鎖日志?
MySQL的死鎖日志類似于以下格式:
------------------------
LATEST DETECTED DEADLOCK
------------------------
2021-11-09 17:28:00 0x7f4595981700
*** (1) TRANSACTION:
TRANSACTION 558615115, ACTIVE 24 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 302 lock struct(s), heap size 17808, 12271392 row lock(s), undo log entries 12221141
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 9869 page no 1068607 n bits 616 index PRIMARY of table `database_name`.`table_name` trx id 558615115 lock_mode X lock hold time 9 wait time before grant 140
.
.
.
------------------------
其中,最近檢測到的死鎖信息以*****開頭和結尾,下面是該死鎖所涉及的事務的信息,包括事務ID、事務狀態、加鎖的表、等待的鎖、以及Holding該鎖的事務的ID和狀態,等待超時時間(wait time before grant)。
解析死鎖日志的方法基本上就是理解這些信息并最終確定哪些事務被終止以及為什么。