浏览 AI 知识库

数据库改字段前怎样准备迁移、备份和回滚

数据库字段变更会同时影响数据、旧版本应用和回滚路径。动生产库前,需要把兼容期、备份验证、迁移顺序和失败后的恢复动作写清楚。

沿完整工作流推进

前一阶段的可检查结果,是下一阶段的输入;中间证据不足时停在当前阶段。

  1. 01把整数价格改成小数,为什么不能只执行一条 ALTER
  2. 02先确认这次任务的起点、边界和交付
  3. 03从“盘点读写路径”走到“分阶段验证和回滚”
  4. 04把 user_name 改成 display_name,先双写再切读
  5. 05完成后的迁移计划、备份证据与回滚步骤
沿一件真实任务走到底

把整数价格改成小数,为什么不能只执行一条 ALTER

准备把 `price` 从整数改为小数时,有人直接在生产执行 ALTER。旧应用仍按整数解析,回滚又会丢失小数部分。

  • 备份已验证可恢复
  • 新旧应用兼容窗口明确
  • 数据校验和回滚触发条件可执行
本例材料

先确认这次任务的起点、边界和交付

需要确认本例内容
现有材料PostgreSQL `orders.price_cents integer`,目标新增 `price_amount numeric(12,2)`;表约 240 万行,有读副本与夜间窗口。
不能越过的边界先备份和恢复演练;采用可兼容的扩展—迁移—切换—收缩;回滚条件和数据不可逆点明确。
要交付的结果迁移计划、备份证据与回滚步骤
处理记录

从“盘点读写路径”走到“分阶段验证和回滚”

当前阶段实际处理
盘点读写路径搜索模型、SQL、接口、报表、任务和外部消费者,确认字段在何处读取、写入和缓存。
设计向前兼容迁移优先采用新增、双写、回填、切读、停止旧写、再删除的阶段方式,避免代码和结构同时硬切。
准备备份与恢复确认备份覆盖目标表、恢复步骤、时间和存储空间;在测试环境实际恢复一次。
评估锁和批量回填用真实数据量估计时间、事务、索引、日志和复制影响,设置批次、暂停和观察指标。
分阶段验证和回滚每阶段检查行数、空值、约束、读写和性能,回滚条件具体到版本和数据状态。
字段迁移案例

把 user_name 改成 display_name,先双写再切读

阶段代码/数据动作验证停止条件
新增加 display_name,旧列保留迁移可回滚,旧代码仍通过锁表或复制延迟超阈值
双写新版本同时写两列,记录不一致数随机抽样和计数一致不一致持续增加
回填按主键批次回填历史行每批行数、空值、耗时和错误备份恢复演练失败
切读读 display_name,旧写停止接口、报表和缓存回归外部消费者仍读取旧列
清理观察窗后再删旧列所有消费者清单已签字任何未知引用都不执行

字段名和阶段为演示;真实迁移需按数据库、数据量、消费者和审批记录调整。

最终输出

完成后的迁移计划、备份证据与回滚步骤

迁移先新增 nullable 字段,分批回填并比对 cents/100;应用双写、读新字段前观察;切换后保留旧列一个版本。报告记录备份校验、每批行数、差异为 0 和回滚到旧读路径的步骤。

常见失败

为什么“迁移 SQL 通过,线上仍被锁表”还不能交付

迁移 SQL 通过,线上仍被锁表

原因
测试数据规模太小,没有测锁与时长
怎么改
在相近规模副本测执行计划和锁,设置批次、超时与观察指标
验收方式

迁移计划、备份证据与回滚步骤通过哪些检查才算完成

进一步核对

后端与数据:参考资料与核对入口