我有一个 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