我有一个实时服务器和开发箱,分别称它们为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)
略带鱼,但又不是明显原因或相关原因:
这是爱盒上的群集,它位于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)
这令人难以置信。唯一可能的解释:
第二个是合理的,需要我用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集群。
答案 0 :(得分:5)
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版本为:
添加密钥:wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
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
ls -l /usr/bin/pg_restore
vim /usr/share/postgresql-common/pg_wrapper
显然,有一个--cluster
选项,对解决版本很有帮助。因此,我只是在--cluster 12/main
通话中添加了pg_restore
,一切都恢复了预期状态