我有一个活动服务器和开发框,分别将它们称为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的pg_dump版本确实稍早一些(只有在我的开发框上的pg_dump以某种方式使用运行其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)
虽然有点可疑,但也没有明显的原因或关联:
这里是爱情盒上的集群,在live.lan上运行pg_dump的端口5432!
$ 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 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_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 bug,尽管它可能是有争议的,尽管它几乎不可能是IMHO。它的作用如下:
如果提供了--host
,那么它使用最新版本的postgresql (在我的例子中是12,这是针对pg_dump的,因此pg_dump 12创建转储)
如果没有提供--host
,那么它会参考用户配置(在我的例子中是10,这是针对pg_restore的,因此运行pg_restore 10,它无法读取由pg_dump 12创建的文件)。
那为什么这是个窃听器?因为我有一个使用配置,不管我是否在与远程主机交谈,我都希望它受到尊重。更重要的是,如果我指定一个主机,我当然不会期望使用最新的本地版本,忽略本地配置。我希望要么尊重本地配置(就像没有指定远程主机时那样),要么尝试匹配rmeote主机版本。任意依赖最新的安装版本是IMHO深为疑问的。
但事实证明,有一个解决办法是可行的。基本上不是:
sudo -u postgres pg_restore -l test.backup
这样做是可行的:
sudo -u postgres pg_restore --host=localhost -l test.backup
具有讽刺意味的是,通过指定主机,我们强迫它忽略本地信任,并使用最新版本的pg_restore,这似乎可以很好地恢复到PG 10集群。
发布于 2020-05-11 12:46:21
ubuntu :很可能你的pg_restore
已经过时了。只需安装使用postgres文档并安装最新版本的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 - focal
- 18.04 - bionic
- 16.04 - xenial
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update && sudo apt-get upgrade
对我起作用了!
发布于 2020-09-18 07:00:37
因此,我在这里的经验有点类似于OP,但并不完全。
我安装了9.4、9.5、11和12版本,所有的pg_*工具都指向9.4版本。我试图在另一台主机上使用版本12创建的转储文件,因为该主机使用了不兼容的9.4工具(与OP发布的错误相同),因此无法工作。
下面是我的调试流程:
which pg_restore
ls -l /usr/bin/pg_restore
vim /usr/share/postgresql-common/pg_wrapper
显然,有一个--cluster
选项,它有助于解决版本。因此,我简单地将--cluster 12/main
添加到pg_restore
调用中,一切都按预期工作。
发布于 2020-03-26 15:48:41
这是另一个转折,但请首先注意,这是一个窗口的情况。如果只是linux,就不要再读下去了。这里给出的所有建议对我都没有帮助,最终导致IMC变得更简单,并且与pgAdmin的使用有关。由于更新版本重复的nag,我的习惯是单独安装pgAdmin (不使用堆栈生成器)。(至少)在这种情况下,pgAdmin有自己的实用程序缓存,并将使用这些程序,除非您以不同的方式告诉它。我的pg实例仍然是version 11(.6),但是最新的pgAdmin可能会有V12实用程序。这很可能导致版本上的差异。在成功地从我的主机转到一台笔记本电脑之后,这件事让我心神不宁。因此,在pgAdmin do (菜单)File->preferences-> Paths和设置与postgres安装相对应的二进制路径时,IMC:\Program\PostgreSQL\11\bin。那就完成了任务。
https://stackoverflow.com/questions/59455783
复制相似问题