09 从别的数据库迁到 PostgreSQL: 评估、校验与上线切换
数据库迁移最大的误区,是把它当成一个“数据搬运项目”。真正复杂的从来不是导数据,而是识别差异、控制风险、验证结果、完成切换。只要这四步里有一步做得草率,迁移就会从工程问题变成运气问题。
迁移项目真正要管理的是什么
迁移项目的核心不是工具,而是不确定性。
这些不确定性通常来自四层:
- 语法差异
- 类型和对象模型差异
- 事务与锁语义差异
- 应用程序对原数据库的隐性依赖
如果团队只盯着“表有没有导过来”,几乎一定会漏掉后两层。
迁移前必须做的清单
1. 资产盘点
至少盘点清楚:
- 表、索引、视图、函数、存储过程、触发器
- 定时任务
- 报表 SQL
- 数据同步链路
- 上下游应用
2. 差异分析
重点看:
- 自增和序列
- 空字符串与
null - 时间、时区、精度
- 大小写和排序规则
- 特殊函数和方言 SQL
- 事务行为和锁习惯
3. 业务分级
不是所有表都同等重要。要明确:
- 哪些是核心交易表
- 哪些是配置和字典
- 哪些是历史归档
- 哪些是可延迟切换的边缘模块
这一步决定了后续切换策略。
数据校验不要只看总行数
总行数一致只能说明“看起来差不多”。真正靠谱的校验至少要有分层设计:
- 表级行数校验
- 主键范围校验
- 关键字段聚合校验
- 哈希抽样校验
- 关键报表和关键接口结果校验
- 增量追平校验
能不能把这套校验自动化,往往决定迁移项目最后稳不稳。
切换不是一个动作,而是一条时间线
成熟的切换 runbook 至少应包含:
- 冻结哪些写流量
- 最后一轮增量同步何时开始
- 一致性确认由谁执行
- 切换后观察哪些核心指标
- 回滚条件是什么
- 回滚后旧库是否还能安全承接
没有明确时间线的切换方案,通常在现场会非常混乱。
两个特别容易被忽略的问题
1. 序列和自增
很多迁移后第一波线上问题,不是查询错,而是插入冲突。原因往往就是序列值没有跟上数据。
2. 应用层假设
例如:
- 某种默认排序行为
- 某种隐式类型转换
- 某种分页结果稳定性
- 某种事务边界下的并发表现
这些在旧系统里“默认成立”的东西,在 PostgreSQL 里不一定还成立。
迁移项目最稳的思路
- 先做差异收敛,不急着切
- 先做自动校验,不急着上线
- 先做影子验证,不急着替换
- 把回滚路径想明白,再做正式切换
迁移本质上不是炫技,而是风险管理。一个高质量的 PostgreSQL 迁移项目,看起来可能并不花哨,但它一定有清晰的盘点、差异、校验和切换节奏。