SuperAPI AI 工具集

database-migration

数据与分析

查看项目

更新于 10-15 08:58

技能介绍

用途

该技能面向在生产环境中演进数据库架构的场景,提供安全的迁移模式、决策树与故障排查指导,帮助开发者在修改数据库结构时避免停机、数据丢失或破坏现有代码。

迁移原则

资料中列出的核心原则包括:

  • 向后兼容:新代码能在旧架构上运行。
  • 可回滚:必要时可以撤销变更。
  • 经过测试:在生产前于 staging 环境验证。
  • 增量式:小步变更,而非一次性大改。
  • 零停机:不中断服务。

安全迁移模式(分阶段)

资料给出一个四阶段示例,用于为 users 表添加 full_name 列:

阶段 1:添加新列(可空),并部署同时写入新旧字段的代码。

ALTER TABLE users ADD COLUMN full_name VARCHAR(255) NULL;
UPDATE users SET full_name = CONCAT(first_name, ' ', last_name);

阶段 2:回填已有数据。

UPDATE users
SET full_name = CONCAT(first_name, ' ', last_name)
WHERE full_name IS NULL;

阶段 3:将列设为必填。

ALTER TABLE users ALTER COLUMN full_name SET NOT NULL;

阶段 4:在新代码部署后移除旧列。

ALTER TABLE users DROP COLUMN first_name;
ALTER TABLE users DROP COLUMN last_name;

常见迁移场景

资料列举了以下常见迁移及其示例:

  • 添加索引:PostgreSQL 使用 CREATE INDEX CONCURRENTLY idx_users_email ON users(email);。
  • 重命名列:先添加新列,再复制数据,最后在新代码部署后删除旧列。
  • 修改列类型:先添加新类型列,迁移数据,再删除旧列并重命名新列。
  • 添加外键:先添加可空列,填充数据,再添加外键约束。

迁移工具

资料提供了三种工具的常用命令:

Python(Alembic):

alembic revision --autogenerate -m "add user full_name"
alembic upgrade head
alembic downgrade -1

JavaScript(Knex):

knex migrate:make add_full_name
knex migrate:latest
knex migrate:rollback

Rails:

rails generate migration AddFullNameToUsers full_name:string
rails db:migrate
rails db:rollback

迁移测试

资料给出一个前向与回滚测试示例:应用迁移后验证列存在,回滚后验证列不存在。

def test_migration_forward_backward():
    apply_migration("add_full_name")
    assert column_exists("users", "full_name")
    rollback_migration()
    assert not column_exists("users", "full_name")

危险操作与安全替代

资料指出应避免在生产环境执行的操作,包括:添加 NOT NULL 列(长时间锁表)、DROP TABLE(无法回滚)、立即 DROP COLUMN(破坏现有代码)。

对应的安全替代方案:先添加可空列;用重命名代替删除;保留旧列直到新代码部署完成(多阶段方式)。

回滚策略

每个迁移都需要提供 DOWN 操作。示例:

-- UP
ALTER TABLE users ADD COLUMN full_name VARCHAR(255);

-- DOWN
ALTER TABLE users DROP COLUMN full_name;

决策支持

资料提供快速决策指南,涵盖:

  • 是否属于破坏性变更:破坏性变更采用多阶段迁移(expand-contract),增量变更采用单阶段迁移;大表索引使用 CONCURRENTLY。
  • 是否需要零停机:架构变更采用 expand-contract 五阶段模式;小于 1 万行的数据迁移可同步进行;超过 100 万行的数据迁移采用后台 worker 模式。
  • 回滚规划:仅新增架构用简单 DOWN 迁移;修改或删除架构用多阶段回滚或 fix forward;不能丢数据时使用时间点恢复(PITR)。
  • 迁移工具选择:Python/Django 用 Django Migrations;Python/SQLAlchemy 用 Alembic;Node.js/TypeScript 用 Prisma Migrate 或 Knex.js;企业/多语言用 Flyway 或 Liquibase。

更多决策框架见 references/decision-trees.md。

故障排查

资料列出常见问题及快速参考:

  • 迁移中途失败:检查数据库状态,用修复迁移 fix forward。
  • 检测到架构漂移:用 autogenerate 生成对账迁移。
  • 无法回滚(无 downgrade):创建反向迁移或 fix forward。
  • 外键冲突:添加约束前清理数据,或以 NOT VALID 方式添加。
  • 迁移锁表过久:使用 CONCURRENTLY、分阶段添加列、批量更新。
  • 循环依赖:创建合并迁移或调整依赖顺序。

详细解决方案见 references/troubleshooting.md。

参考导航

  • 决策树(references/decision-trees.md):架构迁移策略、零停机模式、回滚策略、迁移工具选择、数据迁移方法。规划迁移或选择策略时加载。
  • 故障排查(references/troubleshooting.md):迁移失败恢复、架构漂移检测、迁移冲突、回滚失败、数据完整性问题、性能问题。调试迁移问题时加载。

要点提醒

资料最后强调:在生产的副本数据上测试迁移;准备好回滚方案;部署期间进行监控;与团队沟通架构变更;保持迁移小而聚焦。

限制

资料未提供该技能的具体安装方式、收费模式、支持平台或版本要求,这些信息暂未提供。