查看最后几个innodb僵局


12

我看到可以在mysql / innodb中查看最新的死锁,但是有没有办法查看过去的死锁?我们有两个僵局问题,一个很重要,另一个不重要。不太重要的死锁每天发生几次,因此它成为“最新的”死锁。

Answers:


15

MySQL 5.5.30中引入了一个设置:innodb_print_all_deadlocks

启用此选项后,有关InnoDB用户事务中所有死锁的信息将记录在mysqld错误日志中。否则,您可以使用SHOW ENGINE INNODB STATUS命令查看有关最后一个死锁的信息。偶尔的InnoDB死锁不一定是问题,因为InnoDB会立即检测到这种情况,并自动回滚其中一个事务。如果应用程序没有适当的错误处理逻辑来检测回滚并重试其操作,则可以使用此选项来解决为什么会发生死锁。大量的死锁可能表明需要重组发布多个表的DML或SELECT ... FOR UPDATE语句的事务,以便每个事务以相同的顺序访问表,从而避免出现死锁情况。

只需将此设置添加到 my.cnf

[mysqld]
innodb_print_all_deadlocks = 1

要么

[mysqld]
innodb_print_all_deadlocks = on

您不必重启mysql。只需登录mysql并运行

mysql> SET GLOBAL innodb_print_all_deadlocks = 1;

or

mysql> SET GLOBAL innodb_print_all_deadlocks = 'ON';

这个设置对我来说也是新的。

试试看,告诉我们您的想法!!!


我们正在运行5.5.34。我们的版本有什么选择吗?
gwgeller 2014年

我的错。它在5.5dev.mysql.com/doc/refman/5.5/en/…中。我将更新我的答案。
RolandoMySQLDBA 2014年

作品如广告所示,谢谢!我使用sql更改了设置,因此不必重新启动。巧合的是,发生了一些不太严重的死锁,并出现在错误日志中。
gwgeller 2015年

在运行时设置值对我不起作用,它不会在错误日志中写入任何内容。
lapo

1
@Jordan AWS从来没有给出过SUPER,我在6年前提到过:dba.stackexchange.com/questions/34525/…。他们使用触发器来确保您无法破解mysql.user和运行FLUSH PRIVILEGES;
RolandoMySQLDBA
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.