为何本地PostgreSQL迁移至Heroku Postgres操作失败?
问题解决方法
一、heroku pg:backups:restore 报错修复
报错核心原因是Windows命令行环境下,URL的包裹符号和特殊字符处理逻辑和Linux/macOS不同,导致传给Heroku的预签名URL被截断,Heroku请求S3返回400错误,拿到的是空备份文件,触发pg_restore: could not read from input file: end of file报错。
修复步骤:
- 替换命令中的单引号为双引号:Windows的CMD、PowerShell均不识别单引号作为字符串包裹符,会把URL中的
&符号识别为命令分隔符,截断完整URL,正确命令格式如下:
heroku pg:backups:restore "RAW_SIGNED_URL" -a fivteam2 DATABASE_URL
- 如果替换双引号后仍报错,需对URL中的特殊字符转义:CMD中把
&替换为^&,PowerShell中把&替换为`&,再执行命令即可。 - 额外校验项:确认S3存储桶没有配置额外的IP访问限制、CORS规则允许GET请求即可,你本地可以正常下载预签名URL文件,说明预签名的权限、有效期配置均无问题。
二、heroku pg:push 报错修复
你遇到的报错有两个原因:
- 命令拼写错误:正确命令是
heroku pg:push,不是heroku pug:push - Windows下未临时配置PG相关环境变量,修复方法:
- 运行CMD的情况下,先执行临时变量配置命令:
set PGUSER=你的本地PostgreSQL用户名 set PGPASSWORD=你的本地PostgreSQL密码 set PGHOST=localhost
- 运行PowerShell的情况下,先执行临时变量配置命令:
$env:PGUSER = "你的本地PostgreSQL用户名" $env:PGPASSWORD = "你的本地PostgreSQL密码" $env:PGHOST = "localhost"
配置完成后,再执行heroku pg:push mydatabase DATABASE_URL -a myapp即可正常运行。
内容的提问来源于stack exchange,提问作者taurOan
相关产品推荐
相关产品推荐

