I
Member
给千万级大表加字段,最怕的不是慢,而是执行一半锁表把业务拖垮。原生 online DDL 和 pt-online-schema-change 我都在线上用过,结论是:没有哪个一定更好,得看表和业务。先说原生 online DDL:优点是官方支持、不需要额外触发器,MySQL 8.0 对加列做了不少优化,瞬间加列在很多场景下确实能做到秒级完成;但限制也实在,比如加列位置、字符集变更、某些类型转换仍然会重建表,一旦进入重建,锁表时间就不可控。pt-osc 的思路是建影子表、触发器同步增量、最后原子切换,好处是全程业务基本不受影响,失败了影子表一删就能回滚;代价是触发器会放大写负载,主从延迟敏感的业务要格外小心,而且外键多的表用 pt-osc 容易踩坑。我的实操流程是:先在从库或影子环境用同样数据量跑一遍,记录执行时长和主从延迟曲线;再看业务低峰窗口够不够;最后上线时全程盯着复制延迟和触发器队列,延迟超过阈值就暂停而不是硬扛。另外提醒一点:无论用哪种方式,加字段前先确认有没有长事务持有元数据锁,一个没提交的老事务能让两种方案都卡在等待 MDL 上。你们给大表加字段时,更倾向于原生 DDL 还是 pt-osc?有没有被 MDL 锁坑过的经历?