我在 Ubuntu 14.04 的同一主机上安装了 PostgreSQL 9.4 和 9.5。我的问题是:
- 当我运行时
service postgresql start|stop
,两个版本都会启动/停止。但我想控制做哪一个。 - 当我使用
psql
连接到 PostgreSQL 时,它总是连接到 9.4。但我想控制要执行哪个服务器。我知道我可以通过不同的端口连接,9.4 的 5432 和 9.5 的 5433。但我想通过对等身份验证进行连接,即通过 Unix 套接字。
我设法分别为上述两个问题找到了这些线索,但还没有解决我的问题:
- 我发现一个命令
pg_ctlcluster
可以完成这项工作,但我不知道如何指定正确的参数,比如 cluster-name。我怎么能弄明白?还是你有别的办法? - Unix 套接字可以通过
unix_socket_directories = '/var/run/postgresql'
. 但是两个版本都有相同的配置目录,其中有不同版本的子目录9.4-main.pg_stat_tmp 9.4-main.pid 9.5-main.pg_stat_tmp 9.5-main.pid
。当我这样做时psql -h /var/run/postgresql
,它只是连接到旧的 9.4 版本。
有人可以帮忙吗?谢谢!
好吧,经过一番努力,我自己得到了答案:
pg_ctlcluster
一系列pg_xxxcluster
命令来管理同一主机上的多个 PostgreSQL 版本/实例。要找出版本和集群名称,只需执行pg_lscluster
,其输出如下9.4 main 5432 online postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log 9.5 main 5433 online postgres /var/lib/postgresql/9.5/main /var/log/postgresql/postgresql-9.5-main.log
例如,要停止 9.4,请使用pg_ctlcluster stop 9.4 main
. 顺便说一句,要禁用自动启动 9.4,edit /etc/postgresql/9.4/main/start.conf
psql
需要一个--port, -p
选项来知道要连接哪个实例,即使是通过 Unix Socket 进行对等身份验证,因为所有版本都具有相同的unix_socket_directories
. 例如,psql -p 5433 dbname
可以通过 Unix Socket 连接到使用端口 5433 运行的 9.5 版本,而默认psql dbname
连接到默认端口 5432,属于我的旧 9.4 版本。而已!
在 Ubuntu 等基于 Debian 的发行版上,
psql
(和一些其他 PostgreSQL 命令)是指向 的符号链接pg_wrapper
,它提供了--cluster
选项。详情请参阅man pg_wrapper
。对于本地连接,您可以使用
要查看您的版本、集群和端口,请使用
pg_lsclusters
. 样本输出:要设置默认值,您可以将首选版本设置为在 5432 中使用端口
/etc/postgresql/*/main/postgresql.conf
,并将其他版本设置为其他端口。(这也在这里得到了回答:在同一个 Ubuntu 服务器上运行多个版本的 PostgreSQL)