如何检测Mysql/InnoDB中的死锁?

16

我知道在使用Innodb中的事务时,死锁是不可避免的,如果应用程序代码正确处理,它们是无害的 - 正如手册所说,“再试一次”。

那么我想知道 - 如何检测死锁?死锁会发出特殊的MySQL错误号码吗?如果有必要的话,我正在使用PHP的mysqli扩展。

谢谢。

编辑:解决方案已找到,请参见评论部分。

7个回答

20

"SHOW ENGINE INNODB STATUS" 命令可在 MySQL 命令行客户端(而非查询浏览器)中提供有关死锁的信息。

死锁也可能由未提交的事务引起(通常是程序错误),运行未提交事务的人将看不到问题,因为他们将正常工作(尽管他们的数据尚未被提交)。


4
有很多输出..我能用grep搜索来检测它吗? - OZZIE

14

1
@S.Lott的链接已经失效。 - Farid Movsumov
@S.Lott,谷歌把我带到这里...在这里说这样的话有点奇怪^^,因为这是一个聚集信息的地方。 - OZZIE

8
尝试使用MaatKit。它有一个死锁记录器。

8
Maatkit 最近已被吸收进 Percona Toolkit。该工具现在称为 pt-deadlock-logger,以前称为 __mk-deadlock-logger__。 - Mei

5

建议使用MONyog。开启MONyog的“死锁监控”选项,以追踪INNODB STATUS报告的死锁。当发生新的死锁时,MONyog会向用户发送警报。 enter image description here


2
如果你使用的是Mac电脑: $ brew install percona-toolkit $ pt-deadlock-logger -uroot --ask-pass localhost

1
我最近为网页应用程序的冒烟测试实现了一个非常简单的死锁检查。代码可以大大改进,但现在它能够正常工作。有关以下使用的查询输出的更多信息,请参见https://dev.mysql.com/doc/refman/8.0/en/innodb-standard-monitor.html
$status = DB::select("SHOW ENGINE INNODB STATUS")["Status"]??null;

if(strpos($status,"LATEST DETECTED DEADLOCK") !== false)
{
  trigger_error("LATEST DETECTED DEADLOCK section present in output of SHOW ENGINE INNODB STATUS");
}

if(strpos($status,"LATEST FOREIGN KEY ERROR") !== false)
{
  trigger_error("LATEST FOREIGN KEY ERROR section present in output of SHOW ENGINE INNODB STATUS");
}

1

尝试使用innotop,它会为您检测死锁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接