我有一个实时服务器和开发盒,分别称它们为 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)
这有点可疑,但又不是明显的原因或相关:
这是 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_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 版本在哪里: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/