生产环境安全、零停机的数据库迁移策略——涵盖模式演进、回滚规划、数据迁移、工具使用及避免反模式。适用于规划模式变更、编写迁移脚本或审查迁移安全性。
数据库迁移模式是一项面向实际任务的技能,主要用于chema Evolution 战略;Downtime.;
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 变更可逆,数据变更仅前向 |
_deprecated 后缀重命名列,而非直接删除CREATE TABLE _backup__ AS SELECT * FROM
- 时间点恢复(PITR) — 确保 WAL 归档覆盖整个迁移窗口期
- 逻辑备份 — 迁移前对受影响表执行
pg_dump
蓝绿数据库
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 $$;
双写期
适用于扩展-收缩与并行变更:
- 双写 — 应用同时向旧列/旧表和新列/新表写入
- 填充 — 使用历史数据补全新结构
- 校验 — 核查一致性(行数、校验和等)
- 切换 — 将读请求切至新结构,并停止向旧结构写入
- 清理 — 冷却期后删除旧结构
迁移测试
使用类生产数据进行测试
- 切勿仅在空数据或合成数据上测试
- 使用脱敏后的生产快照数据
- 匹配真实数据量 — 在 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 / 类型定义已同步更新
- 已在冷却期后清理弃用结构
- 迁移过程已记录至团队运行手册
绝对禁止事项
- 绝对禁止 在生产环境直接运行未经测试的迁移
- 绝对禁止 在未先移除所有应用层引用并完成部署前,直接删除列
- 绝对禁止 在大表上单条语句中添加无默认值的
NOT NULL 列
- 绝对禁止 在同一迁移文件中混用 Schema DDL 与数据变更操作
- 绝对禁止 在线上系统中重命名列时跳过双写阶段
- 绝对禁止 认为迁移是瞬时操作 — 必须始终在生产规模数据上进行基准测试
- 绝对禁止 为“加速”迁移而在生产环境中禁用外键检查
- 绝对禁止 在迁移尚未完成前,部署依赖该 Schema 变更的应用代码
相关专题
更多
热门下载
更多
相关下载
更多
精品课程
更多
热门推荐 /
最新课程
phpStudy极速入门视频教程
共6课时 | 54.7万人学习
独孤九贱(4)_PHP视频教程
共89课时 | 134.1万人学习
PHP实战天龙八部之仿爱奇艺电影网站
共49课时 | 82.6万人学习
最新文章
更多