PostgreSQL 10降级至9.5时pg_restore出现段错误问题求助
问题排查与解决
核心问题:错误处理二进制备份格式
你用pg_dump -Fc生成的是PostgreSQL自定义二进制备份格式,这种格式并非纯文本SQL,直接用cat+sed这类文本处理工具操作会彻底破坏二进制结构,导致pg_restore解析时触发段错误。
正确的跨版本降级备份&恢复流程
1. 重新生成兼容PG9.5的纯SQL备份
在PG10服务器上,导出纯文本格式备份,并指定目标兼容版本为9.5:
pg_dump -Z1 -Fp --no-owner --no-privileges --target-version=9.5 <db_name> | ssh <user>@s<server> "dd of=dump.sql"
-Fp:生成纯文本SQL格式,支持后续文本编辑--target-version=9.5:让pg_dump自动生成适配PG9.5的语法--no-owner/--no-privileges:避免恢复时因权限、用户不存在报错
2. 针对性处理兼容性语法(若需)
如果导出的SQL仍包含PG9.5不支持的语法(比如PG10新增的GENERATED AS IDENTITY),可以用sed精准替换:
sed -e 's/GENERATED ALWAYS AS IDENTITY//g' -e '/AS integer/d' dump.sql > downgraded_dump.sql
注意:不要盲目删除所有AS integer,只处理和IDENTITY相关的定义即可。
3. 恢复到PG9.5
纯文本SQL备份直接用psql执行更高效:
psql -d <db> -f downgraded_dump.sql
如果坚持用pg_restore,需确保备份是对应格式,纯文本格式也支持,但psql是更直接的选择。
额外排查点
- 检查PG9.5的
pg_restore完整性:执行pg_restore --version,确认程序未损坏 - 验证备份文件完整性:对比原服务器和目标服务器上备份文件的MD5值,确认传输过程无损坏
内容的提问来源于stack exchange,提问作者fueggit
相关产品推荐
相关产品推荐

