今天对一个表的字段进行扩容,但是现在修改实在太慢了。
- 我一开始认为表中的数据可能太大了,导致这个alter太慢了, 查看表的数据大小: 进入information_schema 数据库;
select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data from TABLES where table_schema='数据库名' and table_name='数据表';
才这么点数据不应该啊。
- 查看数据库连接信息:show PROCESSLIST
发现这条表字段修改语句正在等待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空闲状态呀,等以后再尝试叭,暂时是解决这个问题了