首页/开发/CI/CD 与发布速查/迁移 down 脚本与其边界
质量门禁与回滚51 条

迁移 down 脚本与其边界

为结构变更编写回退脚本(如 Liquibase rollback、Rails db:rollback、Flyway 的 undo 能力),同时明确边界:已删除的数据无法靠结构回退恢复。

CI/CD 与发布速查开发更新于 2026-10-13

down 脚本是什么

为结构变更编写回退脚本(如 Liquibase rollback、Rails db:rollback、Flyway 的 Undo 能力),同时明确边界:已删除的数据无法靠结构回退恢复。down 脚本与 up 一并评审入库,并在影子库演练;结构可回退,数据要靠备份。回退脚本是发布回滚方案的组成部分,而不是数据恢复手段,二者别混为一谈。

基本信息

工具形态Flyway(Undo)、Liquibase rollback、Rails db:rollback
边界结构可回退,已删除的数据不可回退
验证在影子库演练 down 脚本
记录down 脚本与 up 一并评审入库
定位发布回滚方案的一部分,不等于数据恢复

典型使用场景

  • 结构回退:加列、建索引类变更的撤销
  • 发布配套:回滚方案中结构部分的执行清单
  • 演练:影子库跑 up 再跑 down,验证可逆
  • 评审:与 up 脚本同仓同评审成对维护
  • 事故处置:与扩展收缩模式配合降低回退依赖
  • 归档:历史迁移的回退脚本按版本保留

迁移脚本成对示例

迁移脚本成对示例
-- V1__add_status.sql
ALTER TABLE orders ADD COLUMN status VARCHAR(16);
-- U1__add_status.sql(回退)
ALTER TABLE orders DROP COLUMN status;   -- 列内数据随回退丢失

可逆性读法

变更类型可逆性注意
加列容易回退回退会丢列内数据
建索引容易回退大表撤销注意耗时
删表删列不可逆靠备份而不是脚本
数据迁移视方向而定双向脚本都要评估
约束变更通常可逆先确认存量数据满足
down 脚本 DROP 刚写入数据的列或表:回退即数据丢失,必须先评估并备份。
先加后删思路:先加新结构、双写、再删旧结构,减小对回退脚本的依赖。
演练按真实量级:发布前在影子库用接近生产的数据量跑一遍回退。
回退耗时评估:大表结构撤销可能超过发布窗口本身,提前评估量级。

执行保障

  • 权限控制:回退脚本执行权限单独管理,避免误触发

易错点

  • down 脚本长期不演练:真正需要时才发现语法或依赖错误
  • 把 down 当作数据恢复手段:误删数据的恢复要靠备份而不是结构回退
  • 多步迁移撤销顺序错乱:链式撤销要严格按相反顺序执行
  • 高风险变更不评估可逆性:等出事才发现回不去,排期前先过一遍
  • 工具版本不一致:不同环境回退方式混乱,锁定同一迁移工具版本

数据来源与参考

  • Liquibase 文档(Rollback)
  • Flyway 文档(Undo migrations)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌