1.问题现象
线上在对其他表进行修改的时候,无论是修改字段长度还是删除索引添加唯一约束都没有问题,但是唯独有一张表,无论进行什么表操作全部都会出现Waiting for table metadata lock。
2.问题分析
这种现象的一个可能的原因是某个事务持有着这个表的元数据锁,需要把这个事务找出来并kill掉,使其回滚,那么alter table和其后续被阻塞的操作包括读等才会顺利进行下去。
2.解决办法
通过以下命令查看当前所有的进程,并找出来出现表锁的原因及进程ID
select * from information_schema.PROCESSLIST where info is not null;
show processlist;
杀死阻塞进程ID
kill id;
如果进程数比较多不知道kill那个进程数则需要找出所有阻塞进程ID全部杀掉则可解决 Waiting for table metadata lock问题。
select concat("kill ",trx_mysql_thread_id,";") as kill_id from information_schema.INNODB_TRX where trx_lock_structs=0 and trx_weight=0 and trx_rows_locked=0 and trx_rows_modified=0 and trx_state='RUNNING';