database-migrations

Polar Sponsor
爱发电 赞助
.NET 9.0

生产环境安全、零停机的数据库迁移策略——涵盖模式演进、回滚规划、数据迁移、工具使用及避免反模式。适用于规划模式变更、编写迁移脚本或审查迁移安全性。

数据库迁移模式

功能概述

数据库迁移模式是一项面向实际任务的技能,主要用于chema Evolution 战略;Downtime.;

核心要点

  • Best Fortive- Only.;
  • Very Low.;
  • None.;

使用与执行

AP 具有后向兼容性保证: 扩展- Contact.;Low. 重命名, restructurin。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。

结果检查与注意事项

实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。

数据库迁移模式

模式演进策略

策略 风险 停机时间 适用场景
仅增加(Additive-Only) 极低 无 需保证向后兼容性的 API
扩展-收缩(Expand-Contract) 低 无 列重命名、结构重构、类型变更
并行变更(Parallel Change) 低 无 关键表上的高风险变更
懒迁移(Lazy Migration) 中 无 大表,批量迁移速度过慢时
一次性迁移(Big Bang) 高 有 仅限开发/预发布环境或小规模数据集

默认采用仅增加策略。 仅在必须修改或删除现有结构时,才升级为扩展-收缩策略。

零停机模式

所有生产环境迁移都必须避免锁表,且不能破坏正在运行的应用程序代码。

操作 模式 关键约束
新增列 先设为可空 切勿在大表上不带默认值直接添加 NOT NULL
重命名列 扩展-收缩 新增列 → 双写 → 填充历史数据 → 切换读取 → 删除旧列
删除列 先弃用 停止读取 → 停止写入 → 部署新版本 → 执行删除
变更类型 并行列 新增类型列 → 双写 + 类型转换 → 切换读写 → 删除旧列
新增索引 并发创建 使用 CREATE INDEX CONCURRENTLY — 不要将其包裹在事务中
拆分表 提取 + 外键 新建表 → 填充历史数据 → 添加外键 → 更新查询逻辑 → 删除原表中的对应列
变更约束 两阶段 先以 NOT VALID 方式添加 → 单独执行 VALIDATE CONSTRAINT
新增枚举值 仅追加 切勿删除或重命名已有枚举值

迁移工具

工具 生态体系 风格 核心优势
Prisma Migrate TypeScript/Node 声明式(基于 schema 差异) ORM 深度集成、影子数据库支持
Knex JavaScript/Node 命令式(up/down) 轻量、灵活
Drizzle Kit TypeScript/Node 声明式(基于 schema 差异) 类型安全、类 SQL 语法
Alembic Python 命令式(upgrade/downgrade) 细粒度控制、支持自动生成功能
Django Migrations Python/Django 声明式(基于模型差异) 自动检测变更
Flyway JVM / CLI SQL 文件版本管理 简单易用、支持广泛的数据库
golang-migrate Go / CLI SQL(up/down 文件) 极简、可嵌入
Atlas Go / CLI 声明式(HCL/SQL 差异) Schema-as-Code、内置 linting、CI 友好

根据所使用的 ORM 和部署流水线选择匹配的工具。简单 Schema 推荐使用声明式工具;需要精细控制数据操作时,优先选用命令式工具。

回滚策略

方式 适用场景
可逆式(up + down) 纯 Schema 变更、早期产品阶段
仅前向(修正式迁移) 破坏性数据变更、大规模生产环境
混合式 Schema 变更可逆,数据变更仅前向

数据保留

  1. 软删除列 — 使用 _deprecated 后缀重命名列,而非直接删除
  2. 快照表 — CREATE TABLE _backup__ AS SELECT * FROM
  3. 时间点恢复(PITR) — 确保 WAL 归档覆盖整个迁移窗口期
  4. 逻辑备份 — 迁移前对受影响表执行 pg_dump
  5. 蓝绿数据库

    1. 主库 → 从库(绿色)复制数据
    2. 在绿色库上应用迁移
    3. 对绿色库运行完整验证套件
    4. 将流量切换至绿色库
    5. 将蓝色库保留为回滚目标(N 小时)
    6. 在确认稳定后下线蓝色库
    

    数据迁移模式

    填充策略

    策略 适用场景
    内联填充(Inline backfill) 小表(< 100K 行)
    分批填充(Batched backfill) 中等规模表(100K–10M 行)
    后台任务(Background job) 大表(10M+ 行)
    懒填充(Lazy backfill) 无需立即强一致性的场景

    批处理示例

    DO $$
    DECLARE
      batch_size INT := 1000;
      rows_updated INT;
    BEGIN
      LOOP
        UPDATE my_table
        SET new_col = compute_value(old_col)
        WHERE id IN (
          SELECT id FROM my_table
          WHERE new_col IS NULL
          LIMIT batch_size
          FOR UPDATE SKIP LOCKED
        );
        GET DIAGNOSTICS rows_updated = ROW_COUNT;
        EXIT WHEN rows_updated = 0;
        PERFORM pg_sleep(0.1);  -- 限流以降低锁压力
        COMMIT;
      END LOOP;
    END $$;
    

    双写期

    适用于扩展-收缩与并行变更:

    1. 双写 — 应用同时向旧列/旧表和新列/新表写入
    2. 填充 — 使用历史数据补全新结构
    3. 校验 — 核查一致性(行数、校验和等)
    4. 切换 — 将读请求切至新结构,并停止向旧结构写入
    5. 清理 — 冷却期后删除旧结构

    迁移测试

    使用类生产数据进行测试

    • 切勿仅在空数据或合成数据上测试
    • 使用脱敏后的生产快照数据
    • 匹配真实数据量 — 在 1K 行上成功的迁移,在 10M 行上可能引发严重锁竞争
    • 复现边界情况:NULL 值、空字符串、最大长度字段、Unicode 字符等

    迁移 CI 流水线

    - name: Test migrations
      steps:
        - run: docker compose up -d db
        - run: npm run migrate:up        # 全量应用迁移
        - run: npm run migrate:down      # 全量回滚
        - run: npm run migrate:up        # 重新应用(验证幂等性)
        - run: npm run test:integration  # 验证应用功能
        - run: npm run migrate:status    # 确认无待执行迁移
    

    每个迁移 PR 必须通过以下流程:up → down → up → 测试。

    迁移检查清单

    迁移前

    • 已在类生产数据量级上完成测试
    • 已编写并验证回滚方案
    • 已创建受影响表的备份
    • 应用代码已兼容新旧两种 Schema
    • 已在预发环境完成执行耗时基准测试
    • 已分析锁影响范围
    • 已配置复制延迟监控

    迁移中

    • 监控锁等待与活跃查询
    • 监控复制延迟
    • 观察错误率是否突增
    • 随时准备执行回滚命令

    迁移后

    • Schema 状态与预期完全一致
    • 集成测试在迁移后的数据库上全部通过
    • 数据完整性已验证(行数、校验和等)
    • ORM 的 Schema / 类型定义已同步更新
    • 已在冷却期后清理弃用结构
    • 迁移过程已记录至团队运行手册

    绝对禁止事项

    1. 绝对禁止 在生产环境直接运行未经测试的迁移
    2. 绝对禁止 在未先移除所有应用层引用并完成部署前,直接删除列
    3. 绝对禁止 在大表上单条语句中添加无默认值的 NOT NULL 列
    4. 绝对禁止 在同一迁移文件中混用 Schema DDL 与数据变更操作
    5. 绝对禁止 在线上系统中重命名列时跳过双写阶段
    6. 绝对禁止 认为迁移是瞬时操作 — 必须始终在生产规模数据上进行基准测试
    7. 绝对禁止 为“加速”迁移而在生产环境中禁用外键检查
    8. 绝对禁止 在迁移尚未完成前,部署依赖该 Schema 变更的应用代码

相关专题

更多
Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

0

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

0

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

0

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

0

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

0

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

0

16

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习