一、metadata_locks 视图核心作用
performance_schema.metadata_locks 表记录 MySQL 元数据锁(MDL)的持有和等待状态,用于定位因 DDL 操作或未提交事务导致的阻塞问题。
二、诊断阻塞会话的步骤
1. 启用元数据锁监控
确保 metadata_locks 功能已启用:
– 检查 instruments 配置
SELECT * FROM performance_schema.setup_instruments WHERE NAME = 'wait/lock/metadata/sql/mdl';
复制
若 ENABLED 为 NO,需动态启用:
UPDATE performance\_schema.setup\_instruments SET ENABLED = 'YES' WHERE NAME = 'wait/lock/metadata/sql/mdl';
复制
同时确保 global_instrumentation 和 thread_instrumentation 已开启。
2. 查询元数据锁状态
筛选目标表(如 books)的锁信息:
SELECT
ml.LOCK_STATUS, -- 锁状态(GRANTED/PENDING)
ml.LOCK_TYPE, -- 锁类型(SHARED\_READ/EXCLUSIVE)
ml.OWNER_THREAD_ID, -- 持有锁的线程 ID
t.PROCESSLIST_ID, -- 关联的会话 ID(即 SHOW PROCESSLIST 中的 Id)
t.PROCESSLIST_USER,
t.PROCESSLIST_TIME
FROM performance_schema.metadata_locks ml
JOIN performance_schema.threads t
ON ml.OWNER_THREAD_ID = t.THREAD_ID
WHERE OBJECT_NAME = 'books';
复制
结果解析:
- GRANTED:已持有锁的会话(可能是阻塞源)。
- PENDING:等待锁的会话(被阻塞方)。
- LOCK_TYPE 为 EXCLUSIVE 表示排他锁(如 DDL 操作)。
3. 定位阻塞链
若存在 PENDING 状态的锁,通过 OWNER_THREAD_ID 找到持有锁的会话。例如:
+-------------+-----------------+-----------------+----------------+------------------+------------------+
| LOCK_STATUS | LOCK_TYPE | OWNER_THREAD_ID | PROCESSLIST_ID | PROCESSLIST_USER | PROCESSLIST_TIME |
+-------------+-----------------+-----------------+----------------+------------------+------------------+
| GRANTED | SHARED_READ | 45 | 10 | root | 202 |
| PENDING | EXCLUSIVE | 46 | 11 | root | 20 |
+-------------+-----------------+-----------------+----------------+------------------+------------------+
复制
分析:
会话 Id=10(对应 PROCESSLIST_ID)持有 SHARED_READ 锁。
会话 Id=11 因请求 EXCLUSIVE 锁被阻塞。
4. 终止阻塞源
终止持有锁的会话(如 Id=10):
KILL 10;
复制
完成后,被阻塞会话(Id=11)将自动恢复执行78。
三、典型场景案例
场景:未提交事务导致元数据锁阻塞
复现步骤:
会话 A 执行事务未提交:
BEGIN;
SELECT * FROM books WHERE id=1; -- 隐式获取 SHARED\_READ 锁
复制
会话 B 执行 DDL:
ALTER TABLE books ADD COLUMN author VARCHAR(50); -- 等待 EXCLUSIVE 锁
复制
诊断:
metadata_locks 显示会话 A 持有 SHARED_READ 锁,会话 B 状态为 PENDING。
通过终止会话 A 或提交事务解决。
最后修改时间:2025-03-25 17:17:13
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1221次阅读
2025-03-13 11:40:53
MySQL8.0统计信息总结
闫建(Rock Yan)
455次阅读
2025-03-17 16:04:03
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
440次阅读
2025-03-13 14:38:19
Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触
曹海峰
437次阅读
2025-03-04 21:56:13
SQL优化 - explain查看SQL执行计划(一)
金同学
378次阅读
2025-03-13 16:04:22
MySQL突然崩溃?教你用gdb解剖core文件,快速锁定“元凶”!
szrsu
323次阅读
2025-03-13 00:29:43
MySQL生产实战优化(利用Index skip scan优化性能提升257倍)
chengang
310次阅读
2025-03-17 10:36:40
[MYSQL] xtrabackup备份报错Unable to obtain lock分析
大大刺猬
232次阅读
2025-02-28 16:43:00
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
224次阅读
2025-03-10 07:58:44
MySQL8.0直方图功能简介
Rock Yan
212次阅读
2025-03-21 15:30:53