SHOW ENGINE INNODB STATUS\G 是查看 InnoDB 状态最常用方式,重点关注 LOG 段的 LSN、刷盘与检查点状态,结合 Innodb_os_log_written 等状态变量分析写入性能,并通过 TRANSACTIONS 和死锁日志排查锁冲突。

直接执行 SHOW ENGINE INNODB STATUS\G 是查看 InnoDB 运行状态最常用、最有效的方式。它不依赖外部工具,也不需要解析二进制日志,能实时反映缓冲池、事务、锁、日志、检查点等核心模块的内部状况。
重点关注 LOG 部分:redo log 与 checkpoint 状态
输出中 LOG 段落集中展示了重做日志的关键指标:
- Log sequence number(LSN):当前已生成的日志总量(字节数),反映所有已写入 redo log 的变更量
- Log flushed up to:已成功刷盘到 ib_logfile* 文件的最新 LSN
- Last checkpoint at:最近一次 checkpoint 记录的 LSN,表示该 LSN 之前的所有日志对应的数据页均已刷入数据文件
- Max checkpoint age / Checkpoint age:用于判断是否接近日志覆盖风险,差值过大可能触发强制刷脏页或阻塞事务
若发现 Log flushed up to 明显滞后于 Log sequence number,说明 redo log buffer 刷盘慢或磁盘 I/O 压力大;若 Checkpoint age 接近 Max checkpoint age,需警惕日志循环覆盖导致恢复能力下降。
结合状态变量观察写入行为
仅看 STATUS 输出不够量化,应配合全局状态变量持续监控:
- Innodb_os_log_written:自启动以来写入 redo log 的总字节数,可用于计算单位时间写入速率
- Innodb_log_waits:因 log buffer 不足而被迫等待刷盘的次数,该值非零说明 innodb_log_buffer_size 可能偏小
- Innodb_log_write_requests:redo log 写请求总数,与 Innodb_os_log_written 对比可估算平均日志条目大小
例如:每秒 Innodb_os_log_written 增长超 10MB,但 Innodb_log_waits 持续上升,建议将 innodb_log_buffer_size 从默认 16MB 提高至 32MB 或 64MB。
识别事务与锁相关线索
TRANSACTIONS 和 LATEST DETECTED DEADLOCK 是排查异常的核心区域:
- 在 TRANSACTIONS 列表中,关注 ACTIVE 时间过长(如 >60 秒)、状态为 LOCK WAIT 的事务,它们往往持有锁并阻塞其他操作
- 死锁日志会明确标出两个(或多个)事务各自的持有锁(HOLDS THE LOCK(S))和等待锁(WAITING FOR THIS LOCK TO BE GRANTED),包括索引名、记录主键值、锁模式(X/S、rec/not gap)
- 结合线程 ID(MySQL thread id)和 SQL 语句(query id),可快速定位到应用层具体哪条语句引发冲突
其他实用信息位置
BUFFER POOL AND MEMORY 段显示缓冲池使用率、命中率(Buffer pool hit rate)、free/flush list 页面数,是判断内存压力的重要依据;ROW OPERATIONS 统计插入、更新、删除的行数,辅助分析负载特征;SEMAPHORES 中的 os_waits 若异常高,可能暗示锁竞争或 CPU 资源瓶颈。
不复杂但容易忽略










