什么是死鎖?
死鎖是指兩個(gè)或多個(gè)進(jìn)程在執(zhí)行過程中,因爭奪資源而造成的互相等待的狀況,若無外力作用,他們都將無法向前推進(jìn)。
如何查看MySQL的死鎖日志?
MySQL提供了兩種方式來查看死鎖日志:
方法一:
在my.cnf配置文件中將log-warnings參數(shù)的值設(shè)定為2或更高。這將在錯(cuò)誤日志(error log)中,記錄每個(gè)被殺掉的線程,以及原因(包括死鎖):
[mysqld]
log-warnings=2
方法二:
在執(zhí)行show engine innodb status語句后,可以查看到InnoDB存儲引擎的狀態(tài),其中包括死鎖日志的信息。
如何解析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
.
.
.
------------------------
其中,最近檢測到的死鎖信息以*****開頭和結(jié)尾,下面是該死鎖所涉及的事務(wù)的信息,包括事務(wù)ID、事務(wù)狀態(tài)、加鎖的表、等待的鎖、以及Holding該鎖的事務(wù)的ID和狀態(tài),等待超時(shí)時(shí)間(wait time before grant)。
解析死鎖日志的方法基本上就是理解這些信息并最終確定哪些事務(wù)被終止以及為什么。