大表在线加字段的正确姿势
该文章由AI生成,仅为SEO优化测试,相关内容不保证准确!!!
引言
给一张千万行的表加字段,直接执行 ALTER TABLE 会发生什么?取决于 MySQL 版本与操作类型:可能秒级完成,也可能锁表数小时。理解 Online DDL 的机制,才能安全地变更线上表结构。
一、MySQL 8.0 的三种算法
ALTER 语句可显式指定 ALGORITHM=INSTANT/INPLACE/COPY。INSTANT(8.0.12+):只改元数据,秒级完成,加字段(末尾)、改列名等支持;INPLACE:不复制全表,但需重建部分数据,期间允许并发读写(仅开始与结束短暂加锁),加索引、加中间列等支持;COPY:全表复制重建,期间阻塞写入,最差。执行前先看支持情况:ALTER TABLE t ADD COLUMN c INT, ALGORITHM=INSTANT;——如果不支持会直接报错而不是悄悄锁表,这是最安全的试探方式。
二、MySQL 5.7 及以下:借助外部工具
5.7 的 Online DDL 支持有限(且 5.7 的 INSTANT 是 8.0 特性),大表变更推荐工具:pt-online-schema-change(pt-osc):创建影子表 → 加触发器同步增量 → 分批拷贝数据 → 原子改名。gh-ost:不依赖触发器,通过 binlog 消费增量,对主库压力更小、可暂停可限流,是当前更主流的选择。共同前提:表必须有主键或唯一索引;磁盘剩余空间要能容纳一份表副本;业务低峰执行并设置限流(gh-ost 的 --max-load 阈值)。
三、操作注意事项
① 变更前备份表结构与数据(至少 mysqldump --no-data 保留结构 + 做好快照);② 主从架构下,DDL 会先在主库执行再同步到从库,大表 DDL 会造成严重主从延迟——先在从库执行再切换角色(滚动变更)或接受延迟窗口;③ 避免多个 DDL 排队:一个未完成的大 DDL 会让后续 DDL 等待元数据锁,连带阻塞普通查询;④ gh-ost 执行中可用 --max-load 监控 Threads_running,超过阈值自动暂停;⑤ 变更窗口选业务低峰,并提前通知相关方。
总结
大表加字段的决策树:MySQL 8.0+ 先试 ALGORITHM=INSTANT;不支持时 5.7 用 gh-ost(优先)或 pt-osc;无论哪种,都要先在测试库演练、评估磁盘空间、低峰执行、准备好回滚方案(保留旧表结构备份)。表结构变更永远比代码上线危险,多一分准备少一分事故。