使用pg_restore向Heroku恢复1.1GB数据库时遇PQputCopyData连接错误
解决Heroku PostgreSQL恢复大dump文件时连接中断的问题
问题核心
1.1GB的本地PostgreSQL dump文件恢复到Heroku时,执行pg_restore命令后网络变慢,数分钟后触发连接意外关闭错误,且始终卡在public.stock_app_stock表,调整命令或dump生成配置均无效。本质是大表批量导入触发Heroku PostgreSQL连接超时,或是网络传输数据量过大导致中断。
可行解决方法
1. 分表拆分恢复
针对卡住的大表单独处理,拆分恢复流程:
- 单独导出
public.stock_app_stock表:pg_dump -t public.stock_app_stock -F c -f stock_table.dump 你的本地数据库名 - 先恢复其他所有表(排除大表):
pg_restore --verbose --clean --no-acl --no-owner -h heroku-host -U db-heroku-username -d db-name --exclude-table=public.stock_app_stock dumpfile - 最后单独恢复大表,添加
--batch参数分批次提交数据,避免长时间连接:pg_restore --verbose --no-acl --no-owner --batch -h heroku-host -U db-heroku-username -d db-name stock_table.dump
2. 压缩dump减少传输量
未压缩的1.1GB文件传输耗时过长,容易触发超时,先压缩再传输:
- 生成压缩dump:
pg_dump -F c 你的本地数据库名 | gzip > dumpfile.gz - 恢复时直接解压流式传输:
gunzip -c dumpfile.gz | pg_restore --verbose --clean --no-acl --no-owner -h heroku-host -U db-heroku-username -d db-name
3. 调整pg_restore参数优化连接
延长连接超时时间,跳过不必要的磁盘同步步骤:
pg_restore --verbose --clean --no-acl --no-owner --connect-timeout=300 --no-sync -h heroku-host -U db-heroku-username -d db-name dumpfile
4. 使用Heroku官方导入工具
Heroku的pg:backups:restore专门优化了大文件导入,自动处理分片和超时问题:
- 将dump文件上传至临时可访问地址(如本地用ngrok暴露,或S3临时链接),然后执行:
heroku pg:backups:restore '你的dump文件访问链接' DATABASE_URL --app 你的Heroku应用名
5. 检查Heroku数据库资源限制
若使用免费/入门级数据库实例,可能因内存、连接数或磁盘限制无法处理大表导入,可临时升级实例规格,恢复完成后再降级。
内容的提问来源于stack exchange,提问作者Stefan Vukovic
相关产品推荐
相关产品推荐

