直接回答:三条路:MySQL 原生 Online DDL、pt-online-schema-change、gh-ost。MySQL 5.6 起 InnoDB 支持 ALGORITHM=INPLACE,加字段、加索引只需短暂元数据锁,期间表可读写;8.0.12 起支持 ALGORITHM=INSTANT,只改数据字典,秒级完成(限表尾加列等少数操作)。COPY 算法全程锁表,必须避免。

展开解析:INPLACE 大多仍需重建表(INSTANT 除外),要预留双倍磁盘空间;且 DDL 开始和结束时需获取 MDL 写锁,若被长事务阻塞会排队,进而挡住后续所有对该表的读写——执行前先清理长事务。pt-osc 与 gh-ost 思路一致:建影子表、全量拷贝、增量同步、原子 rename 切换;区别在于增量同步方式,pt-osc 用触发器,gh-ost 直接解析 binlog 伪装成从库,无触发器开销,还支持暂停、限速、动态调整,对主从环境更友好。注意 pt-osc 要求表有主键且不能已有触发器;两种工具都会显著增加写入和 binlog 量,应在低峰期执行并监控从库延迟与磁盘余量(影子表需要近乎一倍的额外空间)。执行失败时的清理也要预案:pt-osc 会留下 _tablename_new 影子表和触发器,gh-ost 会留下 _gho 表,不能直接删原表了事。

-- MySQL 8.0.12+,仅表尾加列等场景秒级完成
ALTER TABLE orders ADD COLUMN remark varchar(200) NULL, ALGORITHM=INSTANT;
-- 显式指定:不满足就报错,绝不退化为 COPY
ALTER TABLE orders ADD INDEX idx_status(status), ALGORITHM=INPLACE, LOCK=NONE;

追问方向:MDL 锁等待如何排查(sys.schema_table_lock_waits)?gh-ost 的 cut-over 怎么保证一致性?INSTANT 加列后老记录格式如何兼容? (约 357 字)