'show engine innodb status' 中的过时死锁信息

Outdated deadlock info in 'show engine innodb status'

我正在 运行基于 MariaDB 10.1.32 构建一个具有 3 个节点的 MariaDB Galera 集群。目前我在我的系统日志中收到了很多 "Deadlock found" 这样的消息:

2018-05-04  9:21:33 140130671872768 [ERROR] mysqld: Deadlock found when trying to get lock; try restarting transaction

为了找到死锁的原因,我 运行 "show engine innodb status" 但是 "LATEST DETECTED DEADLOCK" 部分只包含过时的信息(根据时间戳):

------------------------
LATEST DETECTED DEADLOCK
------------------------
2018-04-28 21:21:08 7f71a9450b00
*** (1) TRANSACTION:
[...]

为什么日志中报告了死锁,但 "show engine innodb status" 的输出中却没有出现?

简短的回答是 Galera 可以抛出不是 InnoDB 死锁的死锁错误。

您在 SHOW ENGINE INNODB STATUS; 中唯一会看到的是 InnoDB 死锁,即同一服务器上的多个事务试图获得不兼容的锁。这些永远不会在事务提交时发生——它们总是比这更早,这是 InnoDB 内置的悲观锁定的结果。它们只出现在它们出现的服务器上。

当跨多个服务器的事务试图提交相互冲突的结果并且这些事务发生冲突时,Galera 将引发死锁。由于 Galera 的乐观锁定,这些发生在事务提交时,或者如果您处于自动提交模式,则发生在隐式提交时。这些是写入不同master之间的冲突。

http://galeracluster.com/documentation-webpages/dealingwithmultimasterconflicts.html