ALTER TABLE orders ADD COLUMN remark VARCHAR(200) DEFAULT NULL, ALGORITHM=INPLACE, LOCK=NONE; SET SESSION lock_wait_timeout = 5;
给千万级订单表加一个状态字段,执行时业务写入全部阻塞,持续了好几分钟。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,早期版本或某些 DDL 类型需要复制表,期间持有元数据锁,阻塞读写。
「MySQL 加字段锁表」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
处理上按这个顺序:确认版本与 DDL 算法;使用 inplace 并允许并发 DML;在低峰执行并设置锁等待超时。
改完只确认一件事:加字段过程中业务写入正常,完成后新字段可读写。