Performance Schema 默认开启但锁监控需手动启用instruments和consumers,否则data_lock_waits为空;须确认performance_schema=ON、threads非空、启用wait/lock/和transaction%采集器,并在阻塞发生瞬间查询。

Performance Schema 默认开着,但锁监控基本等于没开——不手动启用 instruments 和 consumers,data_lock_waits 就是空表,查不到任何阻塞关系。
确认 performance_schema 真的在工作
别跳过这步。很多“查不到锁”的问题,根源是 performance_schema 根本没初始化成功:
- 执行
SHOW VARIABLES LIKE 'performance_schema';,返回值必须是ON;如果是OFF,说明启动失败,得去错误日志里翻原因 - 执行
SELECT COUNT(*) FROM performance_schema.threads;,结果应大于 0(几十到上百行才正常),为 0 意味着线程 instrumentation 没加载 -
performance_schema=ON必须写在my.cnf的[mysqld]段并重启生效,SET GLOBAL动态设置无效
必须开启 wait/lock/ 和 transaction% 类采集器
MySQL 8.0 默认把锁相关 instrument 全设为 DISABLED,不改它,data_locks 和 data_lock_waits 就永远为空:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 执行这三条(顺序不能错):
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'wait/lock/%';UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'transaction%';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+ 行 - 注意:新设置只对后续新建连接生效,已有会话不会自动继承,得重连或新开终端再试
查 data_lock_waits 必须卡在阻塞发生的那一瞬间
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中 - 别只盯着行锁——
METADATA LOCK(MDL)才是线上卡死元凶,DDL 操作引发的阻塞常被忽略,得结合metadata_locks查
容易被忽略的兼容性细节
版本和字段稳定性直接影响能不能拿到有效信息:
-
BLOCKING_ENGINE_LOCK_ID在 MySQL 8.0.29 前不稳定,若字段报错或为NULL,先执行SELECT VERSION();确认版本 -
data_lock_waits依赖data_locks有数据,而后者又依赖事务真实持有锁;仅EXPLAIN或预编译未执行,不会触发采集 - 某些聚合表(如
memory_summary_by_digest)依赖events_statements_summary_by_digest先有数据,后者又依赖statement/sql/%instrument 开启,锁排查前最好顺手打开
真正难的不是查哪张表,而是理解“锁状态是瞬时态”——它不像慢查询日志那样可回溯,你得在阻塞发生的毫秒级窗口里完成采集、关联、定位。错过时机,就得重放现场,而线上环境往往不允许你反复触发阻塞。

















