求助:使用pg:pull从Heroku拉取数据库至本地时数据处理阶段报错
报错关联逻辑
两个报错是先后触发的连锁反应,并非独立问题:
- 核心触发源是
pg_restore: error: unrecognized data block type (0) while searching archive:恢复进程在读取备份流的a1pavingco.account_emailaddress表数据时,识别不出备份块的结构类型,直接中断了恢复流程 - 后续的
Error: write EPIPE是连带影响:pg_restore进程提前退出后,原本和它建立的流式管道因为失去数据写入端,触发了Node.js层面的管道断开报错,不是本地数据库本身的读写故障
常见根因
- 本地与Heroku端的PostgreSQL大版本不匹配:Heroku侧通常运行较新的PG版本,旧版本的pg_restore无法识别新版pg_dump导出的自定义格式备份块,是这类报错最高发的原因
- 实时流式传输的备份文件损坏:
pg:pull默认走“Heroku导出→实时通过管道传入本地pg_restore”的链路,传输过程中出现网络丢包、字节错位时,就会出现备份块识别失败的问题 - 本地权限不足:当前本地数据库用户没有
a1pavingcoschema的写入权限,pg_restore提前退出反向导致管道报错,这类情况出现概率较低
可落地修复步骤
- 对齐两端PostgreSQL版本
- 先查询Heroku侧的PG版本:执行
heroku pg:info获取对应数据库的PG大版本号 - 查询本地当前pg_restore对应的版本:执行
pg_restore --version - 如果两边版本差超过1个大版本,安装和Heroku侧完全同大版本的pg_dump、pg_restore客户端,不要用旧版本工具解析新版导出的备份
- 先查询Heroku侧的PG版本:执行
- 绕开实时管道的不稳定传输,手动完成全流程备份恢复
- 先在Heroku端生成完整的静态备份文件:执行
heroku pg:backups:capture - 将备份文件完整下载到本地磁盘:执行
heroku pg:backups:download,等待文件完全写完后再做后续操作,不要边传边恢复 - 先校验本地下载的备份文件完整性:执行
pg_restore --list <本地备份文件路径>,如果能完整列出所有表、序列、约束的信息,说明文件没有传输损坏;如果校验阶段就报块识别错误,重新下载备份文件即可 - 清空当前本地已经拉了一半的不完整数据库,重建空库、创建
a1pavingcoschema,给当前本地用户授予该schema的全量操作权限后,执行恢复命令:pg_restore --no-owner --no-privileges -d <本地目标库名> <本地备份文件路径>
- 先在Heroku端生成完整的静态备份文件:执行
补充说明
当前本地库的表结构已经残留了一半的拉取结果,不要直接在现有库基础上补拉数据,重建空库后再恢复可以避免表结构残留导致的后续校验错误。
内容的提问来源于stack exchange,提问作者Alfred T
相关产品推荐
相关产品推荐

