不巧出现了操作Mysql不响应的情况。
第一步就要查看数据库状态,看当前活跃的连接正在进行什么操作。
show processlist;
看一下结果
很明显,有多个连接正处于:
Waiting for table metadata lock 状态。
有一个在对数据表进行
TRUNCATE TABLE XXX;
还有两个连接在进行 insert
SQL不返回的原因
元数据锁(meta data lock, MDL)是MySQL 5.5 版本中引入的表级锁的一种(另一种就是表锁)。
支持事务的InnoDB引擎表和不支持事务的MyISAM引擎表,都会出现Metadata Lock Wait等待现象。一旦出现Metadata Lock Wait等待现象,后续所有对该表的访问都会阻塞等待。
常见MDL锁场景有:
①当前有执行DML操作时执行DDL操作
② 当前有对表的长时间查询或使用mysqldump/mysqlpump时,使用alter会被堵住
③ 显示或者隐式开启事务后未提交或回滚,比如查询完成后未提交或者回滚,DDL会被堵住
解决办法
修改表结构之前,需要把导致metadata lock的语句kill掉。先要找到正在持有metadata lock的连接。
这里只能根据 show processlist;
结合自己的操作看Waiting for table metadata lock之前的那个process 是已经获取到metadata lock的。
OK,比如确定是 1233 挣持有metadata lock,需要执行
kill 1233;
---------------------------------
有没有直接的命令查出来呢?
有的,但是要MySql5.7以上,并且需要提前设置,具体可以参考这篇文章