首页/开发/CI/CD 与发布速查/数据库变更的回滚策略
质量门禁与回滚51 条

数据库变更的回滚策略

数据库没有一键回滚:策略以向前兼容为目标,先扩展后收缩、变更与应用发布解耦,并准备回退脚本、确认备份可用。

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

数据库回滚策略是什么

数据库没有一键回滚:数据被改写、删除后,逆向操作是否可行取决于有没有备份、有没有双写与闪回手段。策略以向前兼容为目标——扩展加字段、双写回填、切换读取、最后收缩清理;变更与应用发布解耦,任何一步都能单独停下观察。回退脚本、备份与闪回能力都提前准备并演练,而不是事故发生时才找。

基本信息

常用路径扩展(加字段或表)→ 双写与回填 → 切换读取 → 收缩(清理旧结构)
回退脚本每次迁移准备 down 脚本并演练
数据修复DML 失误用备份或闪回,先冻结写入再处理
验证回滚后跑数据一致性校验
前置条件备份可恢复性定期验证,闪回窗口(binlog 保留期)要清楚

不同失误的恢复手段

场景手段前提
误删少量行闪回或 binlog 回放binlog 保留期与权限可用
结构不兼容向前修复或切回旧结构双兼容窗口内
整表误删或损坏从备份恢复并补齐增量备份与补齐链路可用
数据被污染定点恢复或重放修正脚本污染范围可定位

典型使用场景

  • 结构变更发布:按扩展收缩节奏推进,每步保留回退点
  • DML 失误处置:先冻结写入、定位影响行,再选闪回或修正脚本
  • 大版本回滚:应用回滚而库保留新结构(双兼容设计兜底)
  • 恢复演练:季度级演练验证备份与恢复时长
  • 审计留痕:所有修复操作留档,事后复盘流程改进

扩展与收缩的版本节奏

扩展与收缩的版本节奏
V1 加可空字段           旧代码不受影响
V2 回填并双写
V3 读取切换到新字段
V4 删除旧字段(确认无回退需求后)
破坏性变更(DROP、TRUNCATE)前必须确认备份完成且可恢复,并安排在收缩阶段后期执行。
回滚窗口是设计产物:旧结构保留多久、binlog 留多久,决定你能退多远,写进架构决策而非默认值。

易错点

  • 迁移与应用发布同批次执行:回滚应用时数据库已变,两端不兼容
  • 没有预演:迁移在生产首次执行才暴露锁表与语法问题
  • 备份存在但没验证过恢复:真出事才发现备份不可用或缺失依赖,定期演练恢复
  • 用 DROP 代替收缩观察:观察期没结束就删旧结构,回退窗口被自己关掉

数据来源与参考

  • Martin Fowler《ParallelChange》
  • Prisma 文档(Expand and Contract Pattern)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌