【问题标题】:Getting "[archiver] unsupported version (1.13) in file header" when running pg_restore运行 pg_restore 时获取“[archiver] 文件头中不支持的版本 (1.13)”
【发布时间】:2018-08-10 09:04:34
【问题描述】:

我刚刚在 mac os 上升级到 postgres 10.2,它与 heroku 上的 10.2 匹配。我正在尝试下载数据库的副本并将其还原到本地。在升级之前,还原可以正常工作。

我跑

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

但我收到此错误:

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

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

【问题讨论】:

    标签: postgresql heroku pg-restore


    【解决方案1】:

    您需要升级您的本地 postgres 以获取 2018-03-01 的最后一个安全补丁,就像 Heroku 在 3 月 1 日所做的那样。您需要最新版本之一 10.39.6.89.5.129.4.179.3.22

    安全补丁可以在这里找到https://www.postgresql.org/about/news/1834/

    似乎补丁修改了 pg_dump,这可能就是为什么没有那个补丁我们不能再使用 pg_restore 来转储 Heroku(应用了补丁)。

    【讨论】:

    • brew upgrade postgresql brew postgresql-upgrade-database
    • 使用 Linux Mint 我的版本是 9.5.11,它说它是最新的。如何使用 apt-get 强制它使用最新版本?
    • Postgresql 9.5.12 现在在官方 Ubuntu 16.04 xenial repo packages.ubuntu.com/xenial/postgresql-9.5
    • @gerry3 的评论是两个单独的命令。当心复制粘贴!
    • 提示brew upgrade postgresql && brew postgresql-upgrade-database 这两个命令确实可以解决问题,但我的本地数据库在此过程中被丢弃了。如果您有关键数据,请备份它们!
    【解决方案2】:

    我今天遇到了同样的问题,我不知道 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,它解决了问题。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 不错的解决方法,我不知道heroku pg:pull。但这不是一个合适的修复方法,因为您仍然无法在本地恢复以前的 heroku 转储,而且我猜这在拉取时会利用实时数据库资源。
      • 不确定反对票的用途。 OP 实际上是在问“我正在尝试下载数据库的副本并在本地恢复它”,我正在回答那个特定的问题。
      【解决方案4】:

      从昨天(2018 年 3 月 1 日)开始,我们在从运行 PostgreSQL 9.5 的 Heroku 恢复备份时也遇到了问题:

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

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

      【讨论】:

        【解决方案5】:

        对于那些尝试在 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 和更新我的本地自制 PostgreSQL。

          通过 Canuk 的回答更新我的 Postgres.app:

          Open Postgres.app > Check for updates...

          通过 gerry3 对已接受答案的评论更新我的本地自制 PostgreSQL:

          brew upgrade postgresqlbrew postgresql-upgrade-database

          【讨论】:

          • 我不必更新我的自制 PostgreSQL。只需将 Postgres.app 更新到最新版本就足够了。
          • 从 postgres.app 更新修复了我的问题
          【解决方案7】:

          使用 pgAdmin 3 在 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
          【解决方案8】:

          我不建议将您的数据库升级到本地新的主要版本(应用安全补丁)只是为了解决这个问题,因为您希望它与您在生产中拥有的任何版本相匹配。

          这在 Ubuntu 16.04 上修复了它,从 Heroku 数据库恢复。

          首先,确保您拥有如 diego 所述的 postgresql 存储库。然后安装升级后的客户端。

          sudo apt-get update &amp;&amp; sudo apt-get install postgresql-client-10

          如果您是 Ubuntu 17.04 或 17.10,请注意 PostgreSQL 的 zesty 存储库没有有您需要的更新客户端。您将需要改用 xenial Postgres 存储库。

          【讨论】:

          • 我确实建议升级数据库,因为如果您的数据库运行来自不受信任用户的查询,它是一个非常重要的安全补丁:wiki.postgresql.org/wiki/…“发布的目的是解决 CVE-2018-1058,它描述了用户如何在不同的模式中创建名称相似的对象,这些对象可以改变其他用户的查询行为并导致意外或恶意行为,也称为“特洛伊木马”攻击。”
          • 当我这样做时我得到Unable to locate package postgresql-client-10
          • @RobM 同意。 “不建议升级......”我指的是不升级到您未在生产中使用的主要版本。在本地升级到主要版本中的最新安全补丁当然是明智的,当然在生产中也是如此。我将调整答案中的措辞以更好地反映我的意思。
          • @Doug 不要忘记先添加适当的 postgres 存储库。类似于此评论中描述的内容。 stackoverflow.com/a/49116272/3975541
          【解决方案9】:

          这是我在 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

          【讨论】:

            【解决方案10】:

            我在 pgadmin III 上遇到了这个问题,并且能够通过切换二进制文件位置来解决它:

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

            【讨论】:

              【解决方案11】:

              您正在使用旧版本的 pg_restore 二进制文件,它不支持恢复提供的转储文件。请确保您使用最新的 Postgres 版本,该版本必须高于以下版本:https://www.postgresql.org/about/news/1834/(10.3、9.6.8、9.5.12、9.4.17 和 9.3.22)。

              您可以通过运行 pg_restore --version 检查您正在使用的 pg_restore 版本。

              如果您使用第三方工具(例如 PgAdmin)来恢复提供的转储文件,即使安装的 Postgres 版本是最新的,恢复也可能不会成功。这是因为第三方工具经常捆绑他们自己的 pg_restore 二进制版本,这可能不是最新的。

              【讨论】:

                【解决方案12】:

                我遇到了同样的错误。我在本地更新到 postgresql 10.3,这解决了我的问题。

                【讨论】:

                  【解决方案13】:

                  对于 Windows:

                  打开命令提示符 (cmd),然后转到位置 C:\Program Files\PostgreSQL\9.6\bin 并运行以下命令:

                  pg_restore -U username -d dbname -1 filename.dump
                  pg_restore -U postgres -d app -1 G:\app09-07-2019.backup
                  

                  希望对你有帮助

                  【讨论】:

                    【解决方案14】:

                    我在 10 分钟前遇到了同样的问题,发现了 2005 年的这个帖子: https://www.postgresql.org/message-id/1106163722.780395.266900%40z14g2000cwz.googlegroups.com

                    基本上这家伙说转储文件已损坏。

                    【讨论】:

                    • 奇怪。我从heroku创建了一个转储文件,我遇到了同样的问题。这是以前从未发生过的。我尝试将 postgresql 从 9.6 升级到 10,但没有成功。
                    • 您使用的是 10.2 还是 10.3?我相信你现在必须使用 10.3。
                    • 该邮件列表线程来自 2005 年。这里最近发生了一些变化,与该线程中的问题不同。
                    猜你喜欢
                    • 2018-08-28
                    • 2019-08-09
                    • 2019-11-23
                    • 2022-11-22
                    • 2016-07-27
                    • 1970-01-01
                    • 2020-10-06
                    • 1970-01-01
                    • 2019-12-15
                    相关资源
                    最近更新 更多