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