引擎报告怎么看
SHOW ENGINE INNODB STATUS 输出 InnoDB 的完整运行报告,包含最近一次死锁的详细现场、事务与锁等待、缓冲池与内存使用、I/O 与后台线程状态,是疑难卡顿与死锁复盘的核心证据。报告只保留最近一次死锁,需要长期留证时要打开 innodb_print_all_deadlocks 把死锁写入错误日志。
基本信息
| 适用 | MySQL 5.7 / 8.0,InnoDB 引擎 |
|---|---|
| 语法 | SHOW ENGINE INNODB STATUS\G |
| 关键段落 | LATEST DETECTED DEADLOCK、TRANSACTIONS、BUFFER POOL AND MEMORY、ROW OPERATIONS |
| 留证参数 | innodb_print_all_deadlocks=ON 把每次死锁写进错误日志 |
获取与提取死锁段
获取与提取死锁段
mysql -uroot -p -E -e "SHOW ENGINE INNODB STATUS\G" > /tmp/innodb.txt # 先落盘,避免终端截断
grep -n 'LATEST DETECTED DEADLOCK' -A 40 /tmp/innodb.txt # 提取死锁现场
grep -n 'TRANSACTIONS' -A 30 /tmp/innodb.txt # 查看活跃事务与锁等待
grep -n 'BUFFER POOL AND MEMORY' -A 20 /tmp/innodb.txt # 缓冲池与内存分配
mysql -uroot -p -e "SHOW VARIABLES LIKE 'innodb_print_all_deadlocks';" # 确认是否长期记录死锁死锁段阅读要点
死锁段阅读要点
*** (1) TRANSACTION: 事务 1 等待的锁与正在执行的 SQL
*** (2) TRANSACTION: 事务 2 持有环形等待的另一半
*** WE ROLL BACK TRANSACTION (1) 本次被回滚的是事务 1
# 关键是把两个事务的 SQL 与加锁顺序对照阅读,找出成环的那一步段落读法
| 段落 | 内容 | 怎么用 |
|---|---|---|
| LATEST DETECTED DEADLOCK | 最近一次死锁的两个事务与 SQL | 对比加锁顺序,找出冲突点 |
| TRANSACTIONS | 活跃事务、锁等待与线程信息 | 定位长事务与阻塞源 |
| BUFFER POOL AND MEMORY | 缓冲池命中率与内存分配 | 判断内存与命中率是否恶化 |
| INSERT BUFFER AND ADAPTIVE HASH INDEX | 变更缓冲与自适应哈希 | 评估写放大与索引加速效果 |
| ROW OPERATIONS | 行读写操作统计 | 观察读写比例与历史累计趋势 |
典型使用场景
- 死锁复盘:还原两个事务的 SQL 与加锁顺序
- 卡顿排查:确认是否存在长事务与锁等待堆积
- 内存评估:结合缓冲池命中率判断是否需要扩容
- 参数调整前后对比报告,观察命中率与 I/O 变化
- 故障取证:把报告存档用于事后分析
报告里没有死锁段是正常现象,说明自上次输出以来没有发生死锁,并不代表语句执行失败。
输出内容较长,客户端可能截断,排查前先重定向到文件再分析,避免关键段落被截掉。