09 从别的数据库迁到 PostgreSQL: 评估、校验与上线切换

数据库迁移最大的误区,是把它当成一个“数据搬运项目”。真正复杂的从来不是导数据,而是识别差异、控制风险、验证结果、完成切换。只要这四步里有一步做得草率,迁移就会从工程问题变成运气问题。

迁移项目真正要管理的是什么

迁移项目的核心不是工具,而是不确定性。

这些不确定性通常来自四层:

  • 语法差异
  • 类型和对象模型差异
  • 事务与锁语义差异
  • 应用程序对原数据库的隐性依赖

如果团队只盯着“表有没有导过来”,几乎一定会漏掉后两层。

迁移前必须做的清单

1. 资产盘点

至少盘点清楚:

  • 表、索引、视图、函数、存储过程、触发器
  • 定时任务
  • 报表 SQL
  • 数据同步链路
  • 上下游应用

2. 差异分析

重点看:

  • 自增和序列
  • 空字符串与 null
  • 时间、时区、精度
  • 大小写和排序规则
  • 特殊函数和方言 SQL
  • 事务行为和锁习惯

3. 业务分级

不是所有表都同等重要。要明确:

  • 哪些是核心交易表
  • 哪些是配置和字典
  • 哪些是历史归档
  • 哪些是可延迟切换的边缘模块

这一步决定了后续切换策略。

数据校验不要只看总行数

总行数一致只能说明“看起来差不多”。真正靠谱的校验至少要有分层设计:

  • 表级行数校验
  • 主键范围校验
  • 关键字段聚合校验
  • 哈希抽样校验
  • 关键报表和关键接口结果校验
  • 增量追平校验

能不能把这套校验自动化,往往决定迁移项目最后稳不稳。

切换不是一个动作,而是一条时间线

成熟的切换 runbook 至少应包含:

  • 冻结哪些写流量
  • 最后一轮增量同步何时开始
  • 一致性确认由谁执行
  • 切换后观察哪些核心指标
  • 回滚条件是什么
  • 回滚后旧库是否还能安全承接

没有明确时间线的切换方案,通常在现场会非常混乱。

两个特别容易被忽略的问题

1. 序列和自增

很多迁移后第一波线上问题,不是查询错,而是插入冲突。原因往往就是序列值没有跟上数据。

2. 应用层假设

例如:

  • 某种默认排序行为
  • 某种隐式类型转换
  • 某种分页结果稳定性
  • 某种事务边界下的并发表现

这些在旧系统里“默认成立”的东西,在 PostgreSQL 里不一定还成立。

迁移项目最稳的思路

  • 先做差异收敛,不急着切
  • 先做自动校验,不急着上线
  • 先做影子验证,不急着替换
  • 把回滚路径想明白,再做正式切换

迁移本质上不是炫技,而是风险管理。一个高质量的 PostgreSQL 迁移项目,看起来可能并不花哨,但它一定有清晰的盘点、差异、校验和切换节奏。