PostgreSQL 跨版本数据迁移:解决「unsupported version in file header」报错全记录
目录
关键字
PostgreSQL、pg_restore、版本兼容性、数据库迁移、pg_dump、备份恢复、unsupported version in file header
背景环境
系统配置
环境类型 | 操作系统 | PostgreSQL 版本 | 内存 | 工具链 |
---|---|---|---|---|
测试环境 | Windows 11 | 16 | 16GB | Navicat/PgAdmin |
生产环境 | Windows Server 2012 R2 | 12 | 8GB | PgAdmin/命令行工具 |
查看 pgsql 官网安装包版本信息:https://postgres.ac.cn/download/windows/,选择 Windows Server 2012 R2 支持的 pg 最高版本。
问题场景
- 备份导出(测试环境)
psql.exe -d postgres -h localhost -p 5432 -U postgres -f D:/pgsql/data.dmp
- 恢复导入(生产环境)
pg_restore.exe -d postgres -h localhost -p 5432 -U postgres D:/pgsql/data.dmp
- 触发报错(生产环境)
pg_restore: [archiver] unsupported version (1.16) in file header
原因分析
核心矛盾:版本兼容性
-
二进制格式的版本锁 PostgreSQL 的 pg_dump -Fc 生成的自定义二进制文件(.dmp)会记录格式版本号(如 1.16),要求 pg_restore 必须使用匹配版本解析。
-
高低版本限制规则
✅ 允许从低版本向高版本恢复(如 12→16)
❌ 禁止从高版本向低版本恢复(如 16→12)
- 工具链的隐藏陷阱
Navicat 导出的 SQL 文件可能包含高版本语法糖(如 GENERATED ALWAYS AS)
PgAdmin 的 GUI 工具存在版本依赖,需与数据库版本严格匹配
解决过程
试错路径记录
尝试方案 | 操作步骤 | 结果状态 | 根本原因分析 |
---|---|---|---|
Navicat SQL 导出 | 通过客户端导出 SQL 文件 → 生产环境导入 | 报错:语法错误 | SQL 文件包含高版本专属语法 |
PgAdmin 二进制迁移 | 测试环境导出.dmp → 生产环境安装 PgAdmin → GUI 导入 | 工具版本不兼容 | PgAdmin 版本与 PostgreSQL 版本强绑定 |
命令行直接恢复 | pg_restore 加载.dmp 文件 | 报错:版本头不匹配 | 二进制文件版本锁机制触发 |
最终解决
标准化迁移流程
- 步骤一:生成版本无关 SQL 文件
# 在PostgreSQL 16测试环境执行(注意未使用-Fc参数!)
pg_dump -h localhost -U postgres postgres > db_250217.sql
- 步骤二:执行全量 SQL 导入
# 在PostgreSQL 12生产环境执行
psql -U postgres -d postgres < D:\data\backup\db_250217.sql
- 关键参数说明 无-Fc,强制生成纯 SQL 文本格式(无版本限制),避免使用二进制格式跨版本迁移。