pg_restore:文件头文件中的[存档]不支持的版本(1.14)

时间:2019-12-23 12:57:11

标签: postgresql ubuntu pg-dump pg-restore

我有一个实时服务器和开发箱,分别称它们为live和dev都运行postgresql。我可以看到这两者,并且可以使用pgadmin4进行管理,而没有任何麻烦,当我在开发工具箱上以调试模式通过网站运行网站时,两者都可以正常运行,并且可以正常运行。相当普通的设置。

多年来,我一直在运行与我编写的相同的bash脚本,该脚本转储实时数据库,然后将其还原到dev框,以便我可以使用最新的实时快照。

今天这使我失败,并显示标题消息:

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版本(这只有在我的开发盒上的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)

略带鱼,但又不是明显原因或相关原因:

  1. 我正在使用pg_dump而不是psql
  2. 我只使用dev box pg工具,而不使用live box(它们应该是无关紧要的,理论上,整个数据都是通过live box上的端口5432传输的,这会将数据库转储传递到我的dev box上的pg_dump。

这是爱盒上的群集,它位于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的两个路径的方式和位置分散不兼容的版本路径。

更新

我发现了一个进一步的线索,它可以使我变通,但仅加深了神秘感,如下所示:

$ 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 test.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)

这令人难以置信。唯一可能的解释:

  1. 尽管报告的版本号相同,但是两个pg_dumps是不同的。我认为这是不可思议的。
  2. 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错误,尽管可能值得商de,但恕我直言。这是它的作用:

如果提供了--host,则它将使用最新版本的postgresql(在我的情况下为12,这是针对pg_dump的,因此pg_dump 12将创建转储)

如果未提供--host,则它将查询用户配置(在我的情况下为10,这是针对pg_restore的,因此pg_restore 10运行并且无法读取pg_dump 12创建的文件)。 / p>

那这为什么是bug?因为我有一个use config,所以我希望它尊重我是否在与远程主机通信。更重要的是,如果我指定主机,我当然不会忽略本地配置而使用最新的本地版本。我希望要么尊重本地配置(如未指定远程主机的情况),要么尝试匹配rmeote主机版本。恕我直言,任意依赖最新安装的版本是很可疑的。

但是事实证明,有一种可行的解决方法。本质上代替:

sudo -u postgres pg_restore -l test.backup

这有效:

sudo -u postgres pg_restore --host=localhost -l test.backup

具有讽刺意味的是,通过指定主机,我们强制其忽略本地配置,并使用最新版本的pg_restore,似乎可以很好地还原到PG 10集群。

5 个答案:

答案 0 :(得分:5)

ubuntu家伙:您的pg_restore很可能已过时。只需use postgres doc并安装最新版本的postgres:

  1. 创建文件/etc/apt/sources.list.d/pgdg.list并为存储库添加一行:deb http://apt.postgresql.org/pub/repos/apt/ YOUR_UBUNTU_VERSION_HERE-pgdg main,其中ubuntu版本为:

    • 04.04-焦点
    • 18.04-仿生
    • 16.04-xenial
  2. 添加密钥:wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

  3. sudo apt-get update && sudo apt-get upgrade

对我有用!

答案 1 :(得分:2)

这是另一回事,但请首先注意,这是Windows机箱。 如果您只喜欢Linux,请不要继续阅读。 此处给出的所有建议都无济于事,最终导致IMC的原因更简单,并且与pgAdmin的使用有关。由于较新版本的重复设置,我的习惯是单独安装pgAdmin(不使用stackbuilder)。 在这种情况下(至少),pgAdmin拥有自己的实用程序缓存,除非您有不同的说法,否则它将使用它们。我的pg实例仍然是版本11(.6),但是最新的pgAdmin可能具有V12实用程序。这很可能会导致版本差异。 在完成从主机到笔记本电脑的多次成功传输后,这种情况逐渐蔓延到我身上。因此,在pgAdmin中,执行(菜单)File-> preferences-> Paths并设置与您的postgres安装IMC C:\ Program Files \ PostgreSQL \ 11 \ bin相对应的Binary Paths。 做到了。

答案 2 :(得分:2)

检查并查看您的pgadmin是否为最新版本,我遇到了这个问题,并通过更新进行了解决

答案 3 :(得分:1)

此错误是由用于创建备份文件的pg_dump版本和用于尝试还原的pg_restore版本之间的版本不匹配引起的。

更新PostgreSQL解决了问题

答案 4 :(得分:1)

所以我在这里的经历与OP有点相似,但并不完全相同。

我安装了9.4、9.5、11和12版本,所有pg_ *工具都指向9.4版本。我试图pg_restore由版本12在不同主机上创建的转储,但该主机无法使用9.4工具(不兼容(与发布的错误相同)),因此无法正常工作。

所以,这是我的调试流程:

  • which pg_restore
    • / usr / bin / pg_restore
  • ls -l /usr/bin/pg_restore
    • / usr / bin / pg_restore-> ../ share / postgresql-common / pg_wrapper
  • vim /usr/share/postgresql-common/pg_wrapper
    • 了解有关如何确定版本的信息。只需阅读前20行左右

显然,有一个--cluster选项,对解决版本很有帮助。因此,我只是在--cluster 12/main通话中添加了pg_restore,一切都恢复了预期状态