浏览 AI使用教程

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

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

沿完整工作流推进

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

  1. 01把整数价格改成小数,为什么不能只执行一条 ALTER
  2. 02先确认这次任务的起点、边界和交付
  3. 03从“盘点读写路径”走到“分阶段验证和回滚”
  4. 04price_cents 与 price_amount 在兼容窗口内共存
  5. 05完成后的迁移计划、备份证据与回滚步骤
沿同一任务走到交付

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

教学迁移:原有 orders.price_cents 以分保存整数金额,计划新增 price_amount numeric(12,2)。先在临时表验证转换,再讨论真实库的读写兼容和分批回填。

只在练习连接执行以下TEMP表事务,末尾ROLLBACK。生产方案仍须有备份恢复记录、读写方清单和监控阈值;不得把四行演示的预期当作生产通过。

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

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

需要确认本例内容
现有材料PostgreSQL练习连接;四行临时orders表见下方,包括12345、0、NULL和-250分。新字段按price_cents/100.0转换,NULL保留,负值作为退款金额保留。
不能越过的边界先备份和恢复演练;采用可兼容的扩展—迁移—切换—收缩;回滚条件和数据不可逆点明确。
要交付的结果迁移计划、备份证据与回滚步骤
处理记录

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

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

price_cents 与 price_amount 在兼容窗口内共存

阶段本例动作确认依据暂停条件
新增新增price_amount,暂不删除price_cents旧应用读取旧列仍可工作未知读写方或锁等待超预算
双写应用按同一金额口径同时写两列逐主键核对新旧金额分/元单位或舍入约定不明
回填按已确认主键批次填充历史值行数、NULL与差异统计错误增加、复制延迟或业务延迟超预算
切读新应用改读price_amount,保留旧列正常/退款/空值及报表回归消费者尚未完成兼容
收缩观察窗后另行评估停旧写与删列可回滚范围和消费者清单删除列或新金额精度已不可逆
最小对账练习

复制到独立练习连接,验证分到元的口径

PostgreSQL

临时表与回滚事务

BEGIN;
CREATE TEMP TABLE orders (id integer PRIMARY KEY, price_cents integer) ON COMMIT DROP;
INSERT INTO orders VALUES (101,12345),(102,0),(103,NULL),(104,-250);
ALTER TABLE orders ADD COLUMN price_amount numeric(12,2);
UPDATE orders SET price_amount = price_cents / 100.0;
SELECT id, price_cents, price_amount FROM orders ORDER BY id;
SELECT count(*) AS mismatches FROM orders
WHERE price_amount IS DISTINCT FROM (price_cents / 100.0)::numeric(12,2);
ROLLBACK;

练习事务不包含生产表,也不证明大表锁和恢复时间。真实应用开始写入分无法无损表示的精度后,“切回旧列”可能丢信息,必须在迁移前定义这个不可逆点。

预期对账

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

教学查询的预期映射是12345→123.45、0→0.00、NULL→NULL、-250→-2.50;IS DISTINCT FROM比较的差异数应为0。该临时表实验不能证明生产备份可恢复、百万行回填耗时或复制延迟已经合格。

常见失败

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

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

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

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

依据与范围

本页实际使用的资料