本技能提供生产系统安全、可回滚的数据库模式变更模式,在创建或修改表、列、索引,运行数据迁移(回填、转换),规划零停机模式变更,为新项目搭建迁移工具,或用户提到“migration”“schema change”“database change”时激活。
核心原则:每次变更都是迁移,禁止手动改生产库,始终使用带版本的迁移文件;生产环境迁移只向前,回滚靠新的前进迁移而非修改旧文件;模式迁移与数据迁移分开,不把 DDL 与大量 DML 混在一个迁移中;需用生产规模数据测试;迁移一旦部署即不可变,只能新增迁移。
安全清单:迁移须含 UP 与 DOWN(或明确标注不可逆);大表避免全表锁,尽量用并发操作;新列要有默认值或可空,不要在已有表上直接加无默认的 NOT NULL;大表索引并发创建,如 PostgreSQL 的 CREATE INDEX CONCURRENTLY;数据回填与模式变更分离;对生产数据副本或预发环境测试;记录回滚方案。
文档给出 PostgreSQL 模式示例,如安全加可空列、Postgres 11+ 加带默认列、并发建索引,以及通过 expand→migrate→contract 三步安全重命名列,安全删列需先移除代码引用再删列,大批量数据迁移用 SKIP LOCKED 分批提交。
工具工作流覆盖 Prisma(prisma migrate dev/deploy/reset/generate,可用 --create-only 后手工改并发索引 SQL)、Drizzle(drizzle-kit generate/migrate/push)、Django(makemigrations/migrate/showmigrations,及 RunPython 数据迁移示例)、golang-migrate(create/up/down)。
零停机策略分三阶段:EXPAND 加新列或表并双写、回填;MIGRATE 改读新列仍双写并验证;CONTRACT 只用新列后删除旧列。
反模式包括生产手动 SQL、修改已部署迁移、已有表加无默认 NOT NULL、大表内联建索引、模式与大数据混一迁移、先删列后删代码。工作流程为选方案、建迁移、测试、记录、部署;输出为符合项目结构的迁移文件及变更、回滚、手动步骤摘要,并标注不可逆迁移。