使用pg_restore恢复数据库时遇unexpected data offset flag 137错误求助
PostgreSQL恢复报错
unexpected data offset flag 137的解决思路 先确认备份文件完整性
虽然用scp传输了大文件,但仍可能出现隐式损坏。在源Ubuntu服务器和本地macOS分别计算文件哈希值对比:- 服务器端执行:
md5sum backupfile.dump - 本地执行:
md5 backupfile.dump
如果哈希值不一致,重新用rsync传输更可靠:rsync -avz user@remote:/path/backupfile.dump ./,避免scp的潜在传输问题。
- 服务器端执行:
验证版本兼容问题
PostgreSQL原则是低版本备份可被高版本恢复,但小版本跨版本也可能有格式细节差异,可尝试两种方式:- 本地安装PostgreSQL 13的pg_restore工具(macOS用brew:
brew install postgresql@13),用该版本工具执行恢复命令,匹配备份时的版本。 - 在源服务器重新导出为纯SQL格式:
pg_dump -h localhost -U username -d dbname -f backupfile.sql,将.sql文件传到本地后用psql恢复:psql -h localhost -U username -d dbname -f backupfile.sql,纯SQL格式兼容性更强,适合跨版本恢复大库。
- 本地安装PostgreSQL 13的pg_restore工具(macOS用brew:
简化恢复命令排查参数问题
先去掉非必要参数,用最简命令尝试:pg_restore -h localhost -U username -d dbname backupfile.dump,排除--clean、--no-acl等参数组合可能引发的异常。同时确认备份文件是自定义格式(备份时用了-Fc),如果是目录格式备份,恢复命令需要对应调整为指定目录路径。排查本地环境问题
- 检查本地磁盘空间,14G数据库恢复至少需要预留2倍以上的可用空间。
- 查看本地PostgreSQL 14日志(brew安装路径一般为
/usr/local/var/log/postgres.log),获取更详细的报错细节,比如权限不足、服务异常等。 - 确保本地目标数据库
dbname已创建,且执行恢复的用户username拥有超级用户权限。
内容的提问来源于stack exchange,提问作者ipin
相关产品推荐
相关产品推荐

