mysql查询卡死,从navicat客户端查看“服务器监控”看到state有很多“Waiting for table metadata lock”。
我的解决方式就是kill掉“Waiting for table metadata lock”的查询。kill掉就好了。
出现问题的原因可能跟我给表加索引有关系。因为发现多表联查sql很慢,而且在这之前已经执行了多次这个sql,都没返回结果。
而此时我又去alter表,可能导致了死锁。后续的insert也堵塞在那里。
等我kill掉“Waiting for table metadata lock”的查询sql后,insert马上被消费了。
网上看到的答案:
MySQL在进行一些alter table等DDL操作时,如果该表上有未提交的事务则会出现 Waiting for table metadata lock ,而一旦出现metadata lock,该表上的后续操作都会被阻塞。
1、metadata Lock 简述
为了在并发环境下维护表元数据的数据一致性,在表上有活动事务(显式或隐式)的时候,不可以对元数据进行写入操作。
因此从MySQL5.5版本开始引入了MDL锁(metadata lock),来保护表的元数据信息,用于解决或者保证DDL操作与DML操作之间的一致性。
对于引入MDL,其主要解决了2个问题,一个是事务隔离问题,比如在可重复隔离级别下,会话A在2次查询期间,会话B对表结构做了修改,两次查询结果就会不一致,无法满足可重复读的要求;另外一个是数据复制的问题,比如会话A执行了多条更新语句期间,另外一个会话B做了表结