【问题标题】:Outdated deadlock info in 'show engine innodb status'“显示引擎 innodb 状态”中的过时死锁信息
【发布时间】:2018-05-04 07:30:48
【问题描述】:

我正在运行一个基于 MariaDB 10.1.32 的具有 3 个节点的 MariaDB Galera 集群。目前我在我的系统日志中收到很多这样的“发现死锁”消息:

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

为了找出死锁的原因,我运行“显示引擎 innodb 状态”,但“最新检测到的死锁”部分仅包含过时的信息(根据时间戳):

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

为什么日志中报告了死锁,但它们没有显示在“show engine innodb status”的输出中?

【问题讨论】:

    标签: mysql mariadb deadlock database-deadlocks galera


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,很有帮助!
    • 原来是“set global wsrep_log_conflicts=ON;”有助于在日志文件中找到冲突的查询。
    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 2015-03-03
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多