无法在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 更改为 httpdl=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 上运行迁移 Postgres

在远程机器上恢复转储

如何让我在 Heroku 上的 Laravel 项目使用 Heroku Postgres?

IntegrityError:postgres 从转储恢复后,所有具有 ForeignKey 的模型/字段的“id”列中的空值