You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Heroku迁移PostgreSQL数据至第三方VPS时索引创建失败求助

解决Heroku PostgreSQL备份恢复到VPS的错误问题

让我们一步步排查你遇到的问题,先抓几个关键的错误点:

1. 备份命令的执行方式有误

你把两个Heroku备份命令写在了同一行:

heroku pg:backups:capture heroku pg:backups:download

这会导致pg:backups:download在pg:backups:capture还没完成备份就启动,大概率下载到的是旧备份或者不完整的文件。正确做法是分开执行,等第一个命令完成后再跑第二个:

# 先创建备份,等待Heroku提示备份完成(会显示备份ID和状态)
heroku pg:backups:capture
# 再下载最新生成的备份
heroku pg:backups:download

执行完后可以检查latest.dump的大小,如果只有几KB,说明备份没正确生成,得重新执行备份步骤。

2. 恢复命令的参数顺序错误

你的pg_restore命令里,备份文件latest.dump的位置不对——pg_restore要求输入文件必须放在所有选项的最后面,而你把它放在了中间,导致后面的--no-owner -x没有被正确解析成选项,反而被当作额外的输入文件。这会彻底打乱恢复逻辑,出现“表还没创建就尝试建索引”的错误(也就是你看到的relation 'public.partners_address' does not exist)。

修正后的恢复命令应该是这样的:

pg_restore --verbose --clean --no-acl --no-owner -x -h localhost -p 5444 -d databasename -U databaseuser latest.dump

3. 额外排查点(如果修正后仍有错误)

  • 版本兼容性:确保VPS上的PostgreSQL版本和Heroku上的版本尽量接近(最好VPS版本 ≥ Heroku版本)。用heroku pg:info查看Heroku的PG版本,VPS上用psql --version查本地版本,版本差异过大可能导致语法或特性不兼容。
  • 数据库连接正确性:先测试能否正常连接到VPS上的目标数据库:
    psql -h localhost -p 5444 -U databaseuser -d databasename
    
    如果连不上,说明端口、用户名或数据库名有误,先解决连接问题再做恢复。
  • 备份文件完整性:用以下命令查看备份里的对象列表,确认public.partners_address表存在:
    pg_restore --list latest.dump | grep partners_address
    
    如果找不到这个表,说明备份文件本身有问题,需要重新从Heroku下载。

按照这些步骤调整后,应该能顺利完成数据恢复。

内容的提问来源于stack exchange,提问作者Maverick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:59:12