首页/数据/SQL 速查/sys.innodb_lock_waits 找阻塞源头
性能与执行计划72 条

sys.innodb_lock_waits 找阻塞源头

锁等待排查:等待方、阻塞方、阻塞语句与等待时长在一个视图里,直接定位谁在挡谁。

SQL 速查数据更新于 2026-10-13

为什么用这个视图

并发写同一批行时会出现锁等待:sys.innodb_lock_waits 把等待方与阻塞方的连接、语句、锁对象和等待时长放在一个视图里,一眼就能看出谁在挡谁。MySQL 5.7 起提供 sys 库,8.0 上底层数据来自 performance_schema 的锁表,不再需要手工拼接复杂的查询。

基本信息

适用平台MySQL 5.7+(sys schema);8.0 底层为 performance_schema
核心视图sys.innodb_lock_waits:等待方、阻塞方、锁对象、等待时长
配套视图information_schema.innodb_trx:事务起点与当前语句
关键列wait_age 已等待时长,持续增长说明阻塞方没有释放
处置顺序先确认业务归属再决定处理,不要盲目终止连接

典型使用场景

  • 应用报锁等待超时,定位到底是谁持有锁
  • DDL 被卡住时检查是否有长事务在跑
  • 批量更新撞上在线业务,找出冲突的表与索引区间
  • 监控里等待时长持续增长时第一时间介入
  • 复盘锁竞争频率,指导事务拆分与批次调小

排查语句

排查语句
-- 一条语句看清谁在等谁
SELECT wait_started, wait_age, locked_table, locked_index,
       waiting_pid, waiting_query,
       blocking_pid, blocking_query
FROM sys.innodb_lock_waits;

-- 关联事务信息:阻塞事务开了多久、当前在跑什么
SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query
FROM information_schema.innodb_trx;

-- DDL 被阻塞时还要看元数据锁
SELECT * FROM sys.schema_table_lock_waits;

关键列读法

列含义怎么判断
wait_age本次等待已持续多久持续增长说明阻塞方没有释放
waiting_query等待方的 SQL定位被卡住的业务
blocking_pid阻塞事务的连接号对应到业务后再处置
locked_table / locked_index冲突的表与索引判断热点行还是索引区间
trx_started阻塞事务的开始时间越久越可疑,常见于忘了提交
终止阻塞连接是最后手段:它可能是核心业务事务,回滚本身还要时间,可能放大影响。先看 blocking_query 与业务归属,能等就等,能联系到业务方就先联系。
链式阻塞时视图里会同时出现多组等待关系,串起来看才能找到最上游的源头事务,只盯着第一个等待方很容易误判。

易错点

  • 直接处理阻塞方连接:可能是核心业务事务,回滚耗时还会放大影响,先看语句与业务归属
  • 只看等待方不看阻塞链:链式阻塞时源头在更上游的事务,只处理中间一环问题很快重现
  • 忽略空闲事务:开了事务却没提交的连接同样持锁,排查时要看 trx_state 与 trx_started
  • 把加大锁等待超时当成解决方案:只是让等待更久,冲突本身没有解决
  • 在 5.7 与 8.0 之间照搬排查 SQL:底层 performance_schema 表结构不同,升级后要核对视图列名与数据来源

数据来源与参考

  • MySQL 8.0 Reference Manual · sys.innodb_lock_waits
  • MySQL 8.0 Reference Manual · Performance Schema Lock Tables
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌