暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL通过performance_schema.metadata_locks视图诊断元数据锁

原创 徐孝亮 5天前
40

一、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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论