浏览 AI 知识库
数据库改字段前怎样准备迁移、备份和回滚
数据库字段变更会同时影响数据、旧版本应用和回滚路径。动生产库前,需要把兼容期、备份验证、迁移顺序和失败后的恢复动作写清楚。
沿完整工作流推进
前一阶段的可检查结果,是下一阶段的输入;中间证据不足时停在当前阶段。
把整数价格改成小数,为什么不能只执行一条 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 通过,线上仍被锁表
- 原因
- 测试数据规模太小,没有测锁与时长
- 怎么改
- 在相近规模副本测执行计划和锁,设置批次、超时与观察指标
