无法在heroku上恢复postgres转储
Posted
技术标签:
【中文标题】无法在heroku上恢复postgres转储【英文标题】:Cannot restore postgres dump on heroku 【发布时间】:2020-07-23 20:30:32 【问题描述】:我正在使用此命令在本地创建转储
PGPASSWORD=admin pg_dump -h 127.0.0.1 -p 5432 -U postgres --no-owner --no-acl -f database.dump
和我的创建成功。
然后将此转储上传到保管箱并通过此链接将其公开 http://www.dropbox.com/s/rsqeiuqzusejz5x/database.dump?dl=1
注意我已将 https
更改为 http
和 dl=0
更改为 dl=1
(dl=1 使其可下载)
然后在我的终端上运行这个命令heroku pg:backups:restore "http://www.dropbox.com/s/38prh2y7pdwhqqj/database.dump?dl=1" --confirm tranquil-anchorage-39635
但我收到此错误
! An error occurred and the backup did not finish.
!
! pg_restore: error: did not find magic string in file header
! waiting for restore to complete
! pg_restore finished with errors
! waiting for download to complete
! download finished successfully
!
! Run heroku pg:backups:info r010 for more details.
我已经尝试了所有官方文档和各种答案,但似乎没有任何效果。
【问题讨论】:
【参考方案1】:在进行进一步研究时,我发现pg_restore
命令在恢复转储文件时需要在创建转储文件时必须提及的某种格式。这就是为什么出现错误pg_restore: error: did not find magic string in file header
。
pg_dump -h <localhost> -p <port> -U <username> --format=c <database_name> > daman.dump
运行此命令后,系统会提示您输入用户密码。
请注意上述命令中的--format=c
。这将创建一个可以由pg_restore
恢复的格式的转储文件,我还应该提到,以这种方式创建的转储文件对于像记事本或 vscode 这样的文本编辑器来说是不可读的,这与--format=c
的情况不同未使用。
有关更多详细信息,请参阅文档here
【讨论】:
请注意,-Fc 与 --format=c 完全相同。见postgresql.org/docs/9.6/app-pgdump.html 是的,我同意,但出于某种奇怪的原因,-Fc
似乎不起作用。我尝试了很多方法,但这不起作用【参考方案2】:
我发现即使使用正确的文件格式,只有某些文件主机可以工作。我尝试了 file.io 和 filetransfer.io,但似乎都没有与 Heroku 一起工作。这三个中只有 Amazon S3 可以正常工作。
即使您拥有正确的文件格式,如果您尝试在某些位置托管文件,也会收到此错误。
【讨论】:
【参考方案3】:尝试使用 -Fc 选项运行 pg_dump(自定义格式 ) 如https://devcenter.heroku.com/articles/heroku-postgres-import-export 中所述:
pg_dump -Fc --no-acl --no-owner -h localhost -U myuser mydb > mydb.dump
【讨论】:
不,这也没有帮助。但是我已经找到了发布答案的问题的根本原因和解决方案以上是关于无法在heroku上恢复postgres转储的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Postgres Heroku 上的先前备份中恢复特定数据? (例如,意外删除的行)
Postgres本地恢复Heroku备份将日期时间字段提前4小时
如何让我在 Heroku 上的 Laravel 项目使用 Heroku Postgres?
IntegrityError:postgres 从转储恢复后,所有具有 ForeignKey 的模型/字段的“id”列中的空值