Posted by lily's blog on May 9, 2025

死锁发生了如何排查

参考文章:

  1. 死锁日志如何查看(MySQL死锁系列-线上死锁问题排查思路-腾讯云开发者社区-腾讯云)
  2. InnoDB 死锁bug排查实例
    1. mysql8.0.18死锁检测源码分析: MySQL 死锁检测源码分析
  3. 死锁日志
    1. 开启死锁日志记录
    2. 分析日志
  4. 从bin log中查看具体发生死锁的sql语句和过程

    步骤

  5. 线上错误日志报警发现死锁异常
  6. 查看错误日志的堆栈信息
  7. 查看 MySQL 死锁相关的日志
  8. 根据 binlog 查看死锁相关事务的执行内容
  9. 根据上述信息找出两个相互死锁的事务执行的 SQL 操作,根据本系列介绍的锁相关理论知识,进行分析推断死锁原因
  10. 修改业务代码

根据这样的顺序进行死锁日志信息的查看,主要是为了系统化地分析死锁发生的原因,确保能够逐步且全面地理解问题。以下是每个步骤的具体作用及其获取的信息:

  1. 查看错误日志的堆栈信息
    • 作用:错误日志记录了死锁发生的相关信息,包括事务ID、错误代码、时间戳等。通过堆栈信息,可以快速定位死锁发生的具体操作和上下文。
    • 获取的信息:死锁发生时的事务状态、相关SQL语句、调用堆栈等。
  2. 查看MySQL死锁相关的日志
    • 作用:使用 SHOW ENGINE INNODB STATUS 命令可以获取最近一次的死锁信息。这是分析死锁的第一手资料,提供关于死锁的详细状态。
    • 获取的信息:包括死锁的事务ID、持有的锁、等待的锁、执行的SQL等。
  3. 根据binlog查看死锁相关事务的执行内容
    • 作用:binlog记录了所有事务执行的SQL语句,能够帮助我们了解在死锁发生前后,相关事务执行了哪些操作。
    • 获取的信息:完整的SQL执行历史,有助于分析事务之间的冲突。
  4. 找出相互死锁的事务执行的SQL操作
    • 作用:通过对比两个死锁事务的SQL操作,可以识别出导致死锁的具体原因,为后续的修改和优化提供依据。
    • 获取的信息:具体的SQL语句、执行顺序、锁类型等。

总结来说,这样的顺序帮助我们从宏观到微观、从表面到深层次地理解死锁的原因,最终找到解决方案。通过逐步分析,可以更有效地定位问题,减少处理死锁时的时间和精力消耗。

如何解决发生的死锁

手把手解决mysql死锁问题

死锁是如何发生的?

小林。。。