用途
该技能面向在生产环境中演进数据库架构的场景,提供安全的迁移模式、决策树与故障排查指导,帮助开发者在修改数据库结构时避免停机、数据丢失或破坏现有代码。
迁移原则
资料中列出的核心原则包括:
- 向后兼容:新代码能在旧架构上运行。
- 可回滚:必要时可以撤销变更。
- 经过测试:在生产前于 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):迁移失败恢复、架构漂移检测、迁移冲突、回滚失败、数据完整性问题、性能问题。调试迁移问题时加载。
要点提醒
资料最后强调:在生产的副本数据上测试迁移;准备好回滚方案;部署期间进行监控;与团队沟通架构变更;保持迁移小而聚焦。
限制
资料未提供该技能的具体安装方式、收费模式、支持平台或版本要求,这些信息暂未提供。