09月30, 2025
收藏本站

神奇的MDL

早上RD突然发消息说,有个DDLalter table xx modify column col varchar(10)无法执行。
一开始以为是个简单的长事务没有关闭,对表xx加了S锁。熟练的查询select * from information_schema.innodb_trx;竟然没有数据!再查一下processlist,alter table xx的进程真的是出于Waiting for table metadata lock。此时判断可能真没长事务,但有高频查询SQL ,导致DDL无法获取到X锁。看了下监控指标,查询QPS竟然也不高...此时跟RD反馈,让他把本地的SQL查询工具关了。alter执行成功!反馈说有开了另外一个窗口进行事务insert,但执行报错。

问题复现

会话一:
create table tmp(id int,val varchar(5));
begin;
insert into tmp values(1,'aaaaaa');  /*执行报错,事务没关闭*/

会话二:
alter table tmp modify column val varchar(10); /*MDL锁等待*/

会话三:
select * from information_schema.innodb_trx; /*查无会话一对应的长事务*/
select * from performance_schema.metadata_locks;

疑问:

  1. 会话三为何查无会话一的长事务,因为innodb_trx仅记录已成功开始执行的活跃事务,会话一开始就执行失败。
  2. 如何定位到是会话一导致的?暂时未知

Comments