我一直在编写一个 Ansible 脚本,用于定义我们公司服务器的标准模板。由于一些历史原因,尽管我们使用的是 Ubuntu 18.04(附带 PostgreSQL 11),但我们仍选择继续使用 PostgreSQL 9.6。我们打算在几个月的过渡期后赶上最新版本。
我们使用的 AWS 18.04 镜像的 PG 版本是 11。在我们的测试服务器上卸载版本 11 并安装 9.6 后,结果psql --version
仍然是:
psql (PostgreSQL) 11.1 (Ubuntu 11.1-3.pgdg18.04+1)
然而,apt-cache policy postgresql-11
给了我:
postgresql-11:
Installed: (none)
Candidate: 11.1-3.pgdg18.04+1
Version table:
11.1-3.pgdg18.04+1 500
500 http://apt.postgresql.org/pub/repos/apt bionic-pgdg/main amd64 Packages
pg_lsclusters
产量:
Ver Cluster Port Status Owner Data directory Log file
9.6 main 5432 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log
我发现所有这些都具有误导性,即使考虑到psql
将与在 5432 上监听的服务器对话的事实。我宁愿让事情保持在一致且明确的状态,而不要冒脚本中出现某些兼容性问题的风险。
我的问题是:是否可以修复 psql 报告的版本,以便它可以报告实际存在的版本?
我觉得删除版本 11 留下了一些对我来说似乎不想要的残余,尽管任务指定了清除和自动删除。
[编辑 2019-02-10]
@steeldriver 的评论让我走上了正确的轨道。我的 Ansible 角色是安装postgresql-9.6
和postgresql-contrib
,这没有意义,因为据我所知,如果没有指定9.6
作为版本的 ,postgresql-contrib
它将代表其当前最新的软件包,即postgresql-contrib-11
,而它又具有postgresql-11
作为依赖项。
我最终选择了 9.6 和 11 版本,并错误地认为 Amazon 镜像中有 postgresql-11。 我错了。
当我删除postgresql-11
(使用自动删除)时,卸载仍然留下了/var/lib/postgresql/11/bin
文件夹,其中psql
保留了一个二进制文件。启动 PostgreSQL 二进制文件的包装器会枚举版本,/var/lib/postgresql
并针对每个版本检查psql
二进制文件是否在文件系统上。如果在,则使用最新版本。
通过评论和回答,我现在明白,这肯定是因为要删除的包是 的一种风格,postgresql-client-common
而不仅仅是postgresql-11
。
答案1
评论这里完全准确。你可以利用可惜未得到充分利用的Ubuntu 软件包搜索对于 18.04 版本,报告称 psql 属于 postgresql-客户端通用
psql
报告安装的 psql 版本符合预期。
如果您想查看已安装的软件包的版本,dpkg -l packagename
这很有用。