innodb_status_output_locks是控制SHOW ENGINE INNODB STATUS是否输出TRANSACTIONS段中详细锁信息的动态全局变量,开启后可实时查看事务持有的行锁/表锁、等待关系、锁类型(X/S)、模式(RECORD/GAP/NEXT-KEY)及被阻塞SQL,需配合innodb_status_output实现每15秒周期性日志输出,分析完毕应及时关闭以防日志膨胀。

要深度在线审计 InnoDB 行级锁的实时持有状态,innodb_status_output_locks 是关键开关——它本身不采集锁,而是控制 SHOW ENGINE INNODB STATUS 是否输出“TRANSACTIONS”段中详尽的锁等待与持有关系。开启后,你能看到谁在等哪条记录、哪个事务持有哪些行锁、锁类型(X/S)、锁模式(RECORD、GAP、NEXT-KEY)、甚至被阻塞的 SQL 片段。
启用锁信息输出并立即捕获快照
该参数是动态全局变量,无需重启,但仅对后续执行的 SHOW ENGINE INNODB STATUS 生效:
- 执行
SET GLOBAL innodb_status_output_locks = ON; - 立刻运行
SHOW ENGINE INNODB STATUS\G(务必加\G格式化输出) - 重点查看输出中 TRANSACTIONS 段落,尤其是以
---TRANSACTION [id], ACTIVE [sec] sec开头的每个事务块 - 每个活跃事务下会列出:
mysql tables in use [n], locked [m]、LOCK WAIT(表示正在等待)、Trx has been waiting [x] sec,以及具体锁记录如RECORD LOCKS space id [sid] page no [pid] n bits [b] index `idx_col` of table `db`.`t1`
结合 innodb_status_output 获取周期性锁视图
单次 SHOW ENGINE INNODB STATUS 只是瞬时快照。若需观察锁演变过程(例如确认某事务是否长期持锁),需配合标准监控:
- 先开启基础状态输出:
SET GLOBAL innodb_status_output = ON; - 此时 MySQL 会每 15 秒自动将完整
INNODB STATUS写入错误日志(error log) - 只要
innodb_status_output_locks = ON同时生效,这每 15 秒的日志中就都包含锁详情 - 用
tail -f /path/to/error.log | grep -A 20 "TRANSACTIONS"可实时跟踪锁变化趋势
精准定位死锁与长等待事务
该参数对死锁分析有间接但关键作用:
- 死锁发生后,
SHOW ENGINE INNODB STATUS的 LATEST DETECTED DEADLOCK 段会显示完整死锁图,但仅保留最近一次;而锁详情(由本参数开启)能帮你确认:死锁前各事务已持有哪些锁、是否因 GAP 锁扩大范围导致、是否存在未提交事务长期占用索引页 - 查找长时间等待者:在
TRANSACTIONS段中筛选Trx has been waiting [>60]的事务,结合其MySQL thread id和query id,可关联SHOW PROCESSLIST查看原始 SQL 与连接来源 - 注意识别
lock_mode X locks rec but not gap waiting(等待行锁) vslock_mode X locks gap before rec insert intention waiting(等待插入意向锁),这对判断是否为唯一键冲突或间隙竞争至关重要
使用后及时关闭,避免日志膨胀
该参数虽不直接降低性能,但开启后会使错误日志体积显著增长(尤其高并发场景):
- 完成审计后,务必执行
SET GLOBAL innodb_status_output_locks = OFF; - 若同时开启了
innodb_status_output,也建议同步关闭:SET GLOBAL innodb_status_output = OFF; - 生产环境不建议长期开启;如需持续监控,应改用
performance_schema.data_locks+data_lock_waits表(MySQL 5.7+),它们提供结构化、可查询的实时锁视图,且无日志写入开销


















