Mysql表字段扩容出现锁问题

343 阅读1分钟

今天对一个表的字段进行扩容,但是现在修改实在太慢了。

  1. 我一开始认为表中的数据可能太大了,导致这个alter太慢了, 查看表的数据大小: 进入information_schema 数据库;
select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from TABLES where table_schema='数据库名' and table_name='数据表';

image.png 才这么点数据不应该啊。

  1. 查看数据库连接信息:show PROCESSLIST

image.png 发现这条表字段修改语句正在等待MDL锁,alter语句肯定是在等待MDL写锁,卧槽,但是所有state是都是Sleep,我也不知道是哪个进程在占用MDL读锁,准备直接将这些进程直接kill; 编写kill语句:

select concat('KILL ',id,';') from information_schema.processlist where COMMAND='Sleep' and TIME>60 and USER='userId';

依次执行这些语句,kill掉这些进程,然后执行

alter table tf_o_trade modify column trade_inmode varchar(10);

发现可以了,属实是不是太明白,我所有的status都是sleep,按道理讲MDL的读锁应该没有被占用,trade表应该属于MDL空闲状态呀,等以后再尝试叭,暂时是解决这个问题了