用途:为生产系统提供安全、可回滚的数据库 schema 变更与数据迁移实践,适用于建表改表、增删列或索引、数据回填与转换、零停机变更规划,以及为新项目搭建迁移工具。
核心原则:所有变更都通过迁移完成,禁止手工改生产库;生产迁移只向前,回滚用新的前向迁移;schema 迁移与数据迁移分离,不在一个迁移里混用 DDL 与 DML;用接近生产规模的数据测试;已部署的迁移不可再编辑。
安全清单:迁移需有 UP 与 DOWN(或明确标记不可逆);大表避免全表锁,使用并发操作;新列需有默认值或可空,不要无默认值加 NOT NULL;索引并发创建;数据回填单独成迁移;用生产数据副本测试;记录回滚方案。
PostgreSQL 要点:可空列或带默认值加列(Postgres 11+ 即时完成);用 CREATE INDEX CONCURRENTLY 避免阻塞写入,注意它不能在事务块内运行;重命名列用 expand-contract 模式(加新列、回填、双写、切换读取、再删旧列);大表更新用 FOR UPDATE SKIP LOCKED 分批提交。
工具用法:Prisma 用 npx prisma migrate dev --name、npx prisma migrate deploy、npx prisma generate,复杂 SQL 用 --create-only 手写;Drizzle 用 npx drizzle-kit generate/migrate/push;Kysely 用 kysely migrate make/latest/down/list,迁移中固定使用 Kysely<any>;Django 用 makemigrations/migrate,数据迁移用 RunPython,删列可用 SeparateDatabaseAndState;golang-migrate 用 migrate create、up、down 1、force。
零停机策略:分 EXPAND(加列、双写、回填)、MIGRATE(读新列、双写、校验)、CONTRACT(只用新列、单独迁移删旧列)三阶段推进。
限制:资料未提供具体收费、平台支持范围与效果数据;示例以 PostgreSQL 为主,MySQL 细节暂未提供。