MySQL怎么查看最近一次详细死锁日志SHOW ENGINE INNODB STATUS

梦墨吖_5235

梦墨吖_5235

2026-10-21

160人浏览

原创

死锁详情在show engine innodb status输出中位于latest detected deadlock区块下,含 (1)和 (2)两个事务块,需对照holds the lock(s)与waiting for this lock to be granted分析闭环,并结合索引、sql及隔离级别定位根因。

mysql怎么查看最近一次详细死锁日志show engine innodb status

SHOW ENGINE INNODB STATUS 输出里哪段才是死锁详情

它不在开头,也不在结尾,而是固定出现在 TRANSACTIONS 小节末尾、以 *** (1) WAITING FOR THIS LOCK TO BE GRANTED: 开头的那块内容。MySQL 每次检测到死锁后,会把最近一次的完整死锁信息“快照”写进这里,覆盖前一次——也就是说,SHOW ENGINE INNODB STATUS 只保留最后一次,不是历史日志。

常见误区是盯着 LATEST DETECTED DEADLOCK 这行标题猛看,其实它只是个分隔标记,真正有用的细节全在它下面的两段事务描述里:一段标着 *** (1)(被回滚的事务),一段标着 *** (2)(成功执行的事务)。

怎么快速定位并提取关键字段

重点盯住四类信息,每段事务里都有:

  • TRANSACTION 后的十六进制ID(如 4294967296),用于关联 information_schema.INNODB_TRX 查原始SQL
  • mysql tables in use 和 locked tables —— 看涉及哪些表,是否跨表加锁
  • LOCK WAIT 行里的 index 名称,确认锁的是哪个索引,不是表名也不是列名
  • lock_mode X locks rec but not gap waiting 这类描述,区分是记录锁、间隙锁还是临键锁;waiting 表示正在等锁,holding lock(s) 表示已持有锁

如果看到 lock_mode X locks gap before rec,基本可以断定是间隙锁引发的死锁,和 WHERE 条件没走索引或范围查询强相关。

为什么刚执行完死锁报错却看不到详情

因为 SHOW ENGINE INNODB STATUS 的输出是异步刷新的,不是实时镜像。从死锁发生 → MySQL 回滚事务 → 更新状态缓冲区 → 你执行命令,中间有毫秒级延迟。如果在这期间有其他事务触发了新的死锁,就会覆盖掉你想看的那一次。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

实操建议:

  • 线上出问题时,别只跑一次 SHOW ENGINE INNODB STATUS,立刻连跑 3–5 次,取最早那次结果(最可能保留原貌)
  • 配合查 SELECT * FROM information_schema.INNODB_TRX ORDER BY trx_started DESC LIMIT 5;,看有没有残留的长事务卡在 LOCK WAIT 状态
  • 想长期捕获,必须开 innodb_print_all_deadlocks = ON,日志会写进错误日志文件,而不是依赖这条命令

容易被忽略的上下文陷阱

死锁日志本身不告诉你 SQL 是怎么写的,只展示执行时的锁行为。比如你看到 index PRIMARY 被锁,但实际执行的可能是 UPDATE user SET status=1 WHERE name='xxx'——而 name 字段没索引,InnoDB 就被迫扫描主键并锁住一堆无关记录。

所以光看日志不够,必须同步做三件事:

  • 用 EXPLAIN 重放对应 SQL,确认是否走了预期索引
  • 检查该表的索引定义,特别是 WHERE 和 JOIN 条件字段有没有被覆盖
  • 注意隔离级别:REPEATABLE READ 下默认用 Next-Key Lock,READ COMMITTED 会降级为 Record Lock,死锁概率显著降低但幻读风险上升

真正难的从来不是看懂日志,而是把锁行为和业务 SQL、索引设计、隔离级别这三层对齐。漏掉任何一层,都可能花两小时分析日志,最后发现只是少建了个联合索引。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2293

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1399

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

815

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3172

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5388

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1199

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5651

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4942

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6574

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 188人学习