概述
直接重命名会让滚动发布期间仍在运行的旧版本崩溃,从而使两次部署之间出现错误。expand-contract 把一次破坏性变更拆成多个兼容步骤,让新旧代码在过渡期共存。
关键步骤
- 在一个部署中把新列加为可空。
- 双写两列,并以批处理回填历史行。
- 把读取切到新列,并停止写旧列。
- 待所有实例运行新代码后,在后续部署中删除旧列。
验证
- 过渡期内新旧代码都能运行。
- 新列数据完整且为最新。
- 读取切换后新代码不再依赖旧列。
- 删除旧列后应用无错误。
注意事项
- expand-contract 需要多次部署与临时存储,对很小的 schema 可能是负担。
- 需确保在仍有旧版本运行时绝不删除旧列。
适用范围
本条目围绕「零停机重命名数据库列」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
-- deploy 1: add + dual write
ALTER TABLE users ADD COLUMN full_name text;
-- deploy 2: backfill (batched), switch reads
-- deploy 3: drop old
ALTER TABLE users DROP COLUMN name;