数据库迁移分两类:
- Schema 迁移:改表结构、加列、加索引、加约束
- 版本迁移:PostgreSQL 15 升 16、16 升 18 这种
先说 Schema 迁移。
生产里最稳的套路通常是:
1. 先做兼容性变更
2. 回填历史数据
3. 应用切换读写逻辑
4. 再加严格约束
5. 最后清理旧结构比如要给 citizens 增加 email:
ALTER TABLE citizens ADD COLUMN email text;
UPDATE citizens
SET email = lower(national_id) || '@example.com'
WHERE email IS NULL;
ALTER TABLE citizens
ALTER COLUMN email SET NOT NULL;如果是大表,加索引尽量考虑并发方式:
CREATE INDEX CONCURRENTLY idx_citizens_email
ON citizens(email);再说 PostgreSQL 版本迁移。
官方文档与 Versioning Policy 的结论可以概括成:
- 小版本升级:通常不需要 dump/restore,停库、替换二进制、重启
- 大版本升级:需要
pg_upgrade、逻辑导出导入,或复制迁移
最常见的大版本升级工具是:
pg_upgrade --check \
-b /path/to/old/bin \
-B /path/to/new/bin \
-d /path/to/old/data \
-D /path/to/new/datapg_upgrade 的特点是快,因为它尽量复用原有数据文件,而不是全量逻辑重灌。
如果你要做跨环境、跨架构、顺便重组对象,也可能更适合:
pg_dumppg_dumpall- 逻辑复制
一句话记忆:
应用迁移讲“兼容节奏”, 数据库迁移讲“锁影响、回填成本、回滚方案”。