一、执行的ALTER语句
ALTER TABLE order_info
ADD COLUMN `flag` int(11) default 0 not null comment '0-不急 1--急';
假设这个表数量比较大,有一千万数据,同时你又有业务场景对它增删改查,肯定会锁表的。锁表了你们业务就会异常,肯定就会报警
二、解决锁表问题
定位mysql内,执行你加字段语句的进程id
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE DB = '你的数据库名' and INFO LIKE '%你的表名%';
拿到id
kill id
三、如何预防
最好有专门的sql执行平台和维护人员,比如Yearning,可以防止这类问题发生。
如果没有这些条件,又必须要加字段,执行的时候加上onlineDDL关键字,
ALTER TABLE order_info
algorithm = inplace,
lock = none,
ADD COLUMN `flag` int(11) default 0 not null comment '0-不急 1--急';
lock = none,表示在执行ALTER TABLE语句期间不对表进行锁定,允许其他会话对表进行读写操作。这种方式可以提高并发性,但可能会导致数据不一致的情况。
algorithm = inplace,明确指示 MySQL 尝试在原地修改表结构。这意味着 MySQL 将尝试尽可能在不重新创建整个表的情况下应用修改
这样执行效率会高很多。而且不会锁表。
网友评论