postgresql - pg_restore : [archiver] unsupported version (1. 14) 在文件头中

标签 postgresql ubuntu pg-dump pg-restore

我有一个实时服务器和开发盒,分别称它们为 live 和 dev,它们都运行 postgresql。我可以使用 pgadmin4 轻松查看和管理两者,并且当我在开发箱上以 Debug模式通过网站运行时,两者都功能齐全,一个是实时网站,另一个是。很普通的设定。

多年来,我一直在运行我编写的相同 bash 脚本,该脚本转储实时数据库,然后将其恢复到开发箱上,因此我可以使用最新的实时快照。

今天,这让我失望了标题消息:

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

我试图诊断出这个问题,并在网上进行了广泛的搜索,但我很困惑并且失败了,所以在这里我掌握了专业知识。

为了帮助我将分享以下内容:
$ pg_dump --version
pg_dump (PostgreSQL) 10.11 (Ubuntu 10.11-1.pgdg18.04+1)
$ pg_restore --version
pg_restore (PostgreSQL) 10.11 (Ubuntu 10.11-1.pgdg18.04+1)
$ pg_dump --host=live.lan --port=5432 --dbname=mydb --username=myuser --format=custom > test.backup
$ ls -l test.backup 
-rw-r--r-- 1 bernd bernd 2398358 Dec 23 23:40 test.backup
$ file test.backup 
test.backup: PostgreSQL custom database dump - v1.14-0
$ pg_restore --dbname=mydb test.backup 
pg_restore: [archiver] unsupported version (1.14) in file header

鉴于 pg_dump 和 pg_restore 是相同的版本,并且:
$ which pg_dump
/usr/bin/pg_dump
$ which pg_restore
/usr/bin/pg_restore
$ ls -l /usr/bin/pg_dump /usr/bin/pg_restore
lrwxrwxrwx 1 root root 37 Nov 14 23:23 /usr/bin/pg_dump -> ../share/postgresql-common/pg_wrapper
lrwxrwxrwx 1 root root 37 Nov 14 23:23 /usr/bin/pg_restore -> ../share/postgresql-common/pg_wrapper

我可以看到它们不仅仅是相同的版本,而是由相同的包装脚本运行(恰好是一个 perl 脚本 - 现在这是一种你不再看到的语言,我曾经广泛地编码)

所以我完全困惑了。认为直播机可能存在版本问题:
$ ssh live.lan
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-72-generic x86_64)
$ which pg_dump
/usr/bin/pg_dump
$ which pg_restore
/usr/bin/pg_restore
$ pg_dump --version
pg_dump (PostgreSQL) 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1)
$ pg_restore --version
pg_restore (PostgreSQL) 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1)

我可以看到 live box 确实有稍旧版本的 pg_dump(只有在我的 dev box 上的 pg_dump 以某种方式使用 RPC 到 live box 来运行它的 pg_dump 时才重要)。

现在可能有一个小线索,我的开发箱已经看到了一些 postgresql 升级,例如:
$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
10  main    5432 online postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
11  main    5433 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
12  main    5434 online postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log

空日志文件证明 11 和 12 集群仍未使用。我正在使用 10。但我确实注意到:
$ psql --version
psql (PostgreSQL) 12.1 (Ubuntu 12.1-1.pgdg18.04+1)
$ ssh live.lan
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-72-generic x86_64)
$ psql --version
psql (PostgreSQL) 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1)

这有点可疑,但又不是明显的原因或相关:
  • 我使用的是 pg_dump 而不是 psql
  • 我只使用开发盒 pg 工具而不是实时盒(它们应该无关紧要,理论上整个数据通过实时盒上的端口 5432 传输,它将数据库转储到我的开发盒上的 pg_dump。

  • 这是 love box 上的集群,它位于 live.lan 上的端口 5432 上,我正在运行 pg_dump!
    $ pg_lsclusters 
    Ver Cluster Port Status Owner    Data directory           Log file
    10  main    5432 online postgres /data/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
    

    我目前对此深感困惑和束手无策。将深深地感谢向前移动的线索。如果我被迫在黑暗中钓鱼,我可能会再次卸载 postgres 11 和 12,看看是否有帮助,否则我最终将不得不跟踪 /usr/share/postgresql-common/pg_wrapper查看 pg_dump 和 pg_restore 的两条路径如何以及在哪里 fork 到不兼容的版本路径。

    更新:

    我发现的另一条线索允许我解决问题,但只是加深了谜团如下:
    $ sudo -u postgres pg_dump --host=live.lan --port=5432 --dbname=mydb --username=myuser --format=custom > test.backup
    $ sudo -u postgres /usr/lib/postgresql/10/bin/pg_dump --host=live.lan --port=5432 --dbname=mydb --username=myuser --format=custom > test2.backup
    $ sudo -u postgres pg_restore -l test.backup
    pg_restore: [archiver] unsupported version (1.14) in file header
    $ sudo -u postgres pg_restore -l test2.backup
    ... produces listing of contents ...
    $ sudo -u postgres pg_dump --version
    pg_dump (PostgreSQL) 10.11 (Ubuntu 10.11-1.pgdg18.04+1)
    $ sudo -u postgres /usr/lib/postgresql/10/bin/pg_dump --version
    pg_dump (PostgreSQL) 10.11 (Ubuntu 10.11-1.pgdg18.04+1)
    

    这是令人难以置信的令人困惑。唯一可能的解释:
  • 尽管报告的版本号相同,但两个 pg_dump 是不同的。我会认为这是难以置信的。
  • pg_dump 运行 pg_wrapper,它运行/usr/lib/postgresql/10/bin/pg_dump 并带有一些破坏它的神秘参数!

  • 第二个是合理的,需要我使用 pg_wrapper 进行诊断。

    更新 2:

    稍后对 pg_wrapper 进行一种检测。它最终导致 pg_dump 运行 pg_wrapper 运行 /usr/lib/postgresql/12/bin/pg_dump但它运行 /usr/lib/postgresql/10/bin/pg_restore ... 去搞清楚!开始认为这是一个 postgresql 版本的互操作性错误!

    更新 3:

    深入了解 pg_wrapper ,确定了原因,是的,我认为这是一种 pg_wrapper 错误,尽管它可能有争议,但恕我直言。这是它的作用:

    --host提供然后它使用安装的最新版本的postgresql(在我的例子中是12,这是用于pg_dump,所以pg_dump 12创建转储)

    --host未提供,然后它会咨询用户配置(在我的情况下为 10,这是针对 pg_restore,因此运行 pg_restore 10 并且它无法读取由 pg_dump 12 创建的文件)。

    那么为什么这是一个错误呢?因为我有一个使用配置,而且无论我是否在与远程主机交谈,我都希望它受到尊重。更重要的是,如果我指定一个主机,我当然不希望使用最新的本地版本而忽略本地配置。我希望要么尊重本地配置(就像没有指定远程主机的情况一样),要么尝试匹配 rmeote 主机版本。任意依赖最新安装的版本恕我直言,深表怀疑。

    但事实证明,有一种可行的解决方法。基本上代替:
    sudo -u postgres pg_restore -l test.backup
    

    这有效:
    sudo -u postgres pg_restore --host=localhost -l test.backup
    

    通过讽刺地指定主机,我们强制它忽略本地配置并使用最新版本的 pg_restore,它似乎可以很好地恢复到 PG 10 集群。

    最佳答案

    ubuntu 伙计们:很可能是你的 pg_restore已经过时了。刚刚use postgres doc并安装最新版本的 postgres:

  • 创建文件 /etc/apt/sources.list.d/pgdg.list并为存储库添加一行:deb http://apt.postgresql.org/pub/repos/apt/ YOUR_UBUNTU_VERSION_HERE-pgdg main ubuntu 版本在哪里:
  • 20.04 - 焦点
  • 18.04 - 仿生
  • 16.04 - xenial
  • 添加 key :wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
  • sudo apt-get update && sudo apt-get upgrade

  • 它对我有用!

    关于postgresql - pg_restore : [archiver] unsupported version (1. 14) 在文件头中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59455783/

    相关文章:

    entity-framework - PostgreSql EF,查询时导航属性始终为空

    database - 如果可能,如何嵌入 PostgreSQL?

    ubuntu - 使用 gstreamer-1.0 没有这样的元素 "v4l2src",但存在于 gstreamer-0.10 [UBUNTU 16.04.2 LTS]

    php - 在 Ubuntu Server 12.04 上编译 libvirt-php 时出错

    linux - 如何设置路径以在终端中运行 Gitea 命令而不考虑目录?

    database - 如何从 pg_dump 输出中删除注释和设置?

    postgresql - 如何将物化 View pg_dump 作为物化 View 而不是表?

    postgresql - 插入到只有一个元素的自定义类型的表列

    postgresql - 在 PostgreSQL 上创建数据库转储时出错

    java - PostgreSQL 多个 'WHERE' 条件(1000+)请求