运行pg_restore时出现“[archiver] unsupported version (1.13) in file header”的错误提示

172

我刚刚在Mac OS上升级到了Postgres 10.2版本,这与Heroku上的版本相匹配。我现在想要下载数据库的副本并将其恢复到本地。在升级之前,这个操作是可以正常工作的。

我运行以下命令:

pg_restore --verbose --clean --no-acl --no-owner -h localhost -d database_name backup.dump

但我遇到了这个错误:

pg_restore:[archiver]文件头中的版本(1.13)不受支持

数据库似乎正常工作。这是一个Rails应用程序,我升级了pg宝石。我可以顺利运行rake db:createdb:migrate

14个回答

199
您需要升级本地的Postgres,以获得2018年3月1日的最新安全补丁,就像Heroku在3月1日做的那样。您需要其中一个最新版本的10.3、9.6.8、9.5.12、9.4.17和9.3.22。
安全补丁可以在此处找到:https://www.postgresql.org/about/news/1834/
似乎该补丁修改了pg_dump,这可能是为什么我们不能再使用未应用该补丁的pg_restore还原Heroku的转储文件。

89
brew upgrade postgresql 翻译为:升级 PostgreSQL,意思是使用 Homebrew 工具更新安装的 PostgreSQL 数据库软件版本。brew postgresql-upgrade-database 翻译为:升级 PostgreSQL 数据库,意思是在升级完 PostgreSQL 软件版本后,使用 Homebrew 工具来升级数据库到新版本。 - gerry3
2
在使用Linux Mint时,我的版本是9.5.11,并且显示已经是最新的版本。我该如何通过apt-get命令强制使用最新版本? - Kritz
6
@gerry3的评论包含两个不同的命令,请小心复制粘贴! - Joe Masilotti
4
提醒一下,执行命令 brew upgrade postgresql && brew postgresql-upgrade-database 确实可以解决问题,但在此过程中我的本地数据库被删除了,如果您有重要数据,请备份!请注意保护好数据。 - Jarvis Johnson
如果我升级到9.6.11并从数据库中转储后仍然收到此消息,会出现什么问题? - spankmaster79
显示剩余6条评论

19
今天我遇到了同样的问题,我不知道Heroku那边是否有什么变化,因为本地我运行的是9.6版本,但我在Heroku上的数据库是9.4版本,所以似乎与版本差异无关(直到今天它都能工作)。如果您正在Mac上使用Postgres.app(https://postgresapp.com/),请确保您正在运行v2.1.3版本(截至本篇写作时,这是最新版本)。当您升级Postgres.app时,您将获得最新的Postgres补丁发行版(这很可能导致您当前遇到的不匹配问题- Heroku已经升级为最新的安全补丁,而您的本地机器可能没有)。我不得不将Postgres.app从2.1.0升级到2.1.3,问题就解决了。

13

这是我第一次遇到这个问题,以下是我如何将Heroku数据库恢复到本地的方法:

$ rails db:drop
$ heroku pg:pull DATABASE_URL <insert local DB name> --app <app-name>

不错的解决方法,我之前不知道 heroku pg:pull。但这并不是一个合适的修复方式,因为你仍然无法在本地还原以前的 heroku dump,而且我猜这会在拉取时利用实时数据库资源。 - demental
1
不确定为什么会有负评。楼主明确地问道:“我想下载数据库的副本并在本地恢复它”,而我正在回答这个具体问题。 - Jim Padilla

12

自从昨天(03/01/2018)起,我们在恢复运行在PostgreSQL 9.5上的Heroku备份时也遇到了问题:

pg_restore: [archiver] unsupported version (1.13) in file header

将我们的PostgreSQL版本从9.5.11升级到9.5.12解决了这个问题。


7

如果您正在尝试在Ubuntu中升级postgresql,但一直没有成功(就像Johan在评论中所说的),请使用PostgreSQL apt存储库,如官方PostgreSQL下载说明所述:https://www.postgresql.org/download/linux/ubuntu/

deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update

6
我的解决方法是同时更新Postgres.app和本地homebrew PostgreSQL。
通过Canuk的回答更新我的Postgres.app:

打开Postgres.app > 检查更新...

通过被接受的答案上gerry3的评论,更新我的本地homebrew PostgreSQL: brew upgrade postgresql brew postgresql-upgrade-database

我不需要更新我的Homebrew PostgreSQL。只需将Postgres.app更新到最新版本即可。 - mineralwasser
更新Postgres.app解决了我的问题。 - FutoRicky

6

我在Windows上使用pgAdmin 3时遇到了这个问题。

升级到pgAdmin 4解决了我的问题。

如果您使用像PgAdmin这样的第三方工具来恢复提供的转储文件,则即使已安装的Postgres版本是最新的,恢复也可能失败。这是因为第三方工具通常捆绑其自己的版本的pg_restore二进制文件,可能不是最新的。 https://help.heroku.com/YNH1ZJUS/why-am-i-getting-pg_restore-archiver-unsupported-version-1-13-in-file-header-error-with-pg_restore


谢谢,这对我很有帮助。我使用的是PostgreSQL 9.5.12,并且我正在使用pgAdmin 3。pgAdmin 4能够成功执行pg_restore - Alexander

5

我在使用pgadmin III时遇到了这个问题,通过更改二进制文件的位置,我成功解决了它:

在菜单中选择 文件 > 选项 > 二进制文件路径,然后将 "PG bin path" 更改为 postgresql/9.x/bin 而不是 ProgramFiles/pgadmin。恢复后工作正常。


5
我不建议在本地升级数据库到新的主版本(要应用安全补丁),只是为了解决这个问题,因为你希望它与你在生产环境中使用的版本相匹配。
这个方法适用于Ubuntu 16.04,在从Heroku数据库进行还原时解决了问题。首先,请确保像diego所提到的那样拥有postgresql repo。然后安装升级后的客户端。
sudo apt-get update && sudo apt-get install postgresql-client-10
如果你使用的是Ubuntu 17.04或17.10,请注意PostgreSQL的zesty repo没有你需要的更新的客户端,你需要使用xenial Postgres repo。

我建议升级数据库,因为这是一个安全补丁,如果您的数据库运行来自不受信任的用户的查询,那么这非常重要:https://wiki.postgresql.org/wiki/A_Guide_to_CVE-2018-1058:_Protect_Your_Search_Path发布的目的是解决CVE-2018-1058,该漏洞描述了如何创建具有相同名称但位于不同模式中的对象,这些对象可以更改其他用户查询的行为并导致意外或恶意行为,也称为“木马”攻击。 - RobM
当我执行此操作时,我会收到“无法找到软件包postgresql-client-10”的错误提示。 - Doug
@RobM 同意。我所说的“不建议升级...”是指不要升级到你在生产中没有使用过的主要版本。当然,在同一主要版本内本地和生产环境中升级到最新的安全补丁是明智的。我会调整我的回答措辞,以更好地反映我的意思。 - Ivan
1
@Doug 别忘了先添加适当的Postgres仓库,就像这个评论中所描述的那样。https://dev59.com/F1UM5IYBdhLWcg3wSOqn#49116272 - Ivan

4

以下是我在 Ubuntu (16.04 LTS) 上如何解决 pg_restore/pg_dump 给我提供的旧版本问题的步骤,这些步骤来自于 psql。

$ pg_restore --version
pg_restore (PostgreSQL) 9.4.8

$ psql --version
psql (PostgreSQL) 9.5.14

问题在于我安装了多个pg版本,而pg_restore指向的是早期版本。
$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory               Log file
9.4 main    5432 online postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log
9.5 main    5433 online postgres /var/lib/postgresql/9.5/main /var/log/postgresql/postgresql-9.5-main.log

解决方法是创建一个~/.postgresqlrc文件,将其指向正确的版本。
$ cat ~/.postgresqlrc

9.5 main *

一旦完成了这个步骤,pg_restore就指向了正确的版本,然后命令执行完成。

详细信息请参考:https://serverfault.com/questions/610777/wrong-version-of-pg-dump-on-ubuntu


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接