为什么 SHOW ENGINE INNODB STATUS; 没有显示我的死锁?

为什么 SHOW ENGINE INNODB STATUS; 没有显示我的死锁?

我有一个 MariaDB ( 5.5.41) 集群,由 2 个配置为主从的节点组成。所有读取和写入都发送到同一个节点。

几周以来我一直在调查一些死锁问题。

我的 PHP 应用程序定期返回Message: SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction.

我曾经能够运行SHOW ENGINE INNODB STATUS;并且会看到最后的死锁,但是由于某种原因,在进行了一个小的不相关的配置更改(innodb_buffer_pool_instances从 1 更改为 19)并重新启动两个节点之后,执行此操作SHOW ENGINE INNODB STATUS;不会显示任何死锁。

但是,如果我连接我的 mysql 客户端并手动创建事务导致死锁,status 命令显示僵局。

我尝试过打开和关闭播放。除了我手动触发的死锁外,innodb_print_all_deadlocks什么也没显示。mysql-error.log

为什么我的 PHP 应用程序创建的死锁不再显示?

答案1

由于我无法访问您的系统和提供的信息,我想我无法直接回答您的问题。不过,这里有一些非常棒的工具,我曾用它们来更好地处理我负责管理的各种 MySQL 派生数据库。

创新顶峰https://github.com/innotop/innotop

查看 innotop 手册页中的“D”命令:

       D: InnoDB Deadlocks
           This mode shows the transactions involved in the last InnoDB
           deadlock.  A second table shows the locks each transaction held and
           waited for.  A deadlock is caused by a cycle in the waits-for
           graph, so there should be two locks held and one waited for unless
           the deadlock information is truncated. [...]

“K”和“L”命令也可能与您相关。

笔记:为了充分发挥作用,innotop 可能需要更改模式信息和设置,并添加“测试”数据库来收集信息。阅读整个手册页在盲目更改数据库之前了解您将要面对的情况。(就我个人而言,我喜欢 innotop 更改揭示的额外信息……)

与您的锁问题不太直接相关,但仍然非常有用:

Percona 工具包(原 MAATKIT): https://www.percona.com/software/database-tools/percona-toolkit

祝你好运!

答案2

令人费解的是,它show engine innodb status没有提供所需的死锁信息。但是,您可以通过运行来检查死锁,它会记录所有锁以及本例中mysqladmin debug未显示的 LOCK TABLE 锁。show engine innodb status

这些问题有时会在错误的时间出现,浪费大量时间。我个人使用莫尼奥格监控哪个也能做到这一点。如果不起作用,你可以尝试使用它的试用版。

答案3

my.cnf/ini 的 [mysqld] 部分中要做的事情

innodb_print_all_deadlocks=ON  # for error log documentation & be proactive in correcting.
log_error=(a valid filename)  # to write to  RTM
innodb_buffer_pool_instances=8  # from 19 would be adequate RAM overhead

相关内容