全书目录

第八篇:PostgreSQL 完全指南 —— 时间档案馆宇宙

第十二章:迁移 —— 档案馆扩建,不是深夜拿锤子砸柜子

1 分钟 420 字 第 176 / 962 个阅读单元

数据库迁移分两类:

  • Schema 迁移:改表结构、加列、加索引、加约束
  • 版本迁移:PostgreSQL 15 升 16、16 升 18 这种

先说 Schema 迁移。

生产里最稳的套路通常是:

text
1. 先做兼容性变更
2. 回填历史数据
3. 应用切换读写逻辑
4. 再加严格约束
5. 最后清理旧结构

比如要给 citizens 增加 email

sql
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;

如果是大表,加索引尽量考虑并发方式:

sql
CREATE INDEX CONCURRENTLY idx_citizens_email
ON citizens(email);

再说 PostgreSQL 版本迁移。

官方文档与 Versioning Policy 的结论可以概括成:

  • 小版本升级:通常不需要 dump/restore,停库、替换二进制、重启
  • 大版本升级:需要 pg_upgrade、逻辑导出导入,或复制迁移

最常见的大版本升级工具是:

bash
pg_upgrade --check \
  -b /path/to/old/bin \
  -B /path/to/new/bin \
  -d /path/to/old/data \
  -D /path/to/new/data

pg_upgrade 的特点是快,因为它尽量复用原有数据文件,而不是全量逻辑重灌。

如果你要做跨环境、跨架构、顺便重组对象,也可能更适合:

  • pg_dump
  • pg_dumpall
  • 逻辑复制

一句话记忆

应用迁移讲“兼容节奏”, 数据库迁移讲“锁影响、回填成本、回滚方案”。