查不到data_lock_waits或data_locks,大概率是锁采集器未启用:MySQL 8.0默认关闭wait/lock/和transaction%类instrument,需手动开启performance_schema中相关采集器并启用consumers,且必须在阻塞发生过程中查询,同时注意区分行锁与元数据锁。

查不到 data_lock_waits 或 data_locks,大概率不是没锁,而是采集器根本没开——MySQL 8.0 默认关闭所有锁相关 instrument,必须手动启用。
确认 performance_schema 已启用且锁采集器未被禁用
MySQL 8.0+ 默认开启 performance_schema,但 wait/lock/ 和 transaction% 类采集器默认全是 DISABLED。不改它们,data_locks 就永远为空。
- 先验证是否启用:
SELECT @@performance_schema;返回1即可 - 关键三步启用(顺序不能错):
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'wait/lock/%';<br>UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'transaction%';<br>UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME IN ('global_instrumentation', 'thread_instrumentation'); - 执行后立刻验证:
SELECT COUNT(*) FROM performance_schema.setup_instruments WHERE NAME LIKE 'wait/lock/%' AND ENABLED = 'YES';—— 至少要看到 10+ 行,否则采集链断裂
为什么刚执行 SELECT ... FOR UPDATE 就查不到 data_lock_waits?
performance_schema.data_lock_waits 只记录“正在发生的阻塞”,不是快照,也不是日志:事务一提交、锁一释放,行就消失。它抓的是瞬时态,不是历史态。
- 必须在阻塞发生“过程中”查:会话 A 执行
BEGIN; SELECT * FROM t WHERE id = 1 FOR UPDATE;不提交;会话 B 执行同条件SELECT ... FOR UPDATE卡住;此时立刻在会话 C 中查data_lock_waits - 注意线程类型:
performance_schema.threads中TYPE = 'FOREGROUND'的才参与锁采集,复制线程、后台清理线程等不会出现在data_lock_waits中 - 版本敏感:
BLOCKING_ENGINE_LOCK_ID字段在 8.0.29 前不稳定,若字段报错或为 NULL,先确认SELECT VERSION();
别只盯着行锁——元数据锁(MDL)才是线上卡死元凶
DML 行锁容易被发现,但 DDL 操作(如 ALTER TABLE、DROP INDEX)引发的元数据锁常被忽略。一个 SELECT 都可能因持有 MDL S 锁而阻塞后续 DDL,且这种锁不体现在 data_locks 里。
- 定位 MDL 阻塞:
SELECT OBJECT_SCHEMA, OBJECT_NAME, LOCK_TYPE, LOCK_DURATION, LOCK_STATUS, SOURCE<br>FROM performance_schema.metadata_locks<br>WHERE LOCK_STATUS = 'PENDING';
- 结合
threads查源头:SELECT THREAD_ID, PROCESSLIST_ID, PROCESSLIST_INFO FROM performance_schema.threads WHERE THREAD_ID IN (SELECT OWNER_THREAD_ID FROM performance_schema.metadata_locks WHERE LOCK_STATUS = 'PENDING'); - MDL 锁无法被
KILL终止,只能等持有者主动释放(比如长事务未提交、客户端断连未 cleanup)
锁监控最易被忽略的点:采集器启用后不验证、查表时机不对、混淆行锁与元数据锁的表来源。真正有效的排查,是把 setup_instruments 状态、阻塞现场、线程活跃性三者对齐,缺一不可。



















