死锁是指两个或多个进程在执行过程中,因争夺资源而造成的互相等待的状况,若无外力作用,他们都将无法向前推进。
如何查看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)。
解析死锁日志的方法基本上就是理解这些信息并最终确定哪些事务被终止以及为什么。