使用Ubuntu操作系统和PostgreSQL的时候,在除postgres用户之外的用户下创建并启动数据库集群

关于这篇文章

由于在Ubuntu环境下创建PostgreSQL集群(≒实例)时遇到了问题,我想记录下解决方法。
集群是用来区分数据库的单位。考虑到本次情况需要在一台服务器上同时启动多个服务,因此我想将PostgreSQL按照每个服务划分为不同的集群,以便使用数据库。

目标读者

    • PostgreSQLでクラスタ分けしてデータベース管理を行いたい方

 

    サーバOSにUbuntu、データベースにPostgreSQLを使用している方

环境

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"

$ psql --version
psql (PostgreSQL) 12.11 (Ubuntu 12.11-0ubuntu0.20.04.1)

安装

参考Ubuntu 20.04快速入门中的步骤,安装PostgreSQL到Ubuntu系统。

$ sudo apt install postgresql postgresql-contrib

创建集群

由于在Ubuntu上无法使用initdb命令,我们可以参考Ubuntu特定的PostgreSQL命令,在pg_createcluster命令中创建PostgreSQL集群。
-p 参数是指定集群要使用的端口(默认为5432,在创建多个集群时,依次分配5432、5433、5434等)。

sudo pg_createcluster 12 sample_cluster -p 6000 -u クラスタの管理者となるユーザ -g クラスタの管理者となるユーザの主グループ

启动集群

$ sudo systemctl start postgresql@12-sample_cluster

可以通过以下命令确认集群是否已在6000端口上启动(在线):

$ pg_lsclusters
Ver Cluster           Port  Status Owner                   Data directory                           Log file
12  sample_cluster 6000 online クラスタの管理者となるユーザ /var/lib/postgresql/12/sample_cluster /var/log/postgresql/postgresql-12-sample_cluster.log

登录到启动的集群。

在这里遇到了困难,但要登录到上面创建的集群内部,需要在psql命令中加入 -h /tmp 选项。
根据资料編,Ubuntu特有的PostgreSQL命令中也有提到,如果将除了postgres用户以外的其他用户指定为集群管理员,则需要将 /tmp 目录作为主机名指定。

为了本地连接,可以明确设置postmaster(1)服务器存储Unix套接字的目录。默认情况下,对于由postgres用户拥有的集群,目录为/var/run/postgresql/,对于由其他用户拥有的数据库,目录为/tmp。

$ sudo -i -u クラスタの管理者となっているユーザ
$ psql -h /tmp -p 6000 -d 使用するデータベース名 -f 実行したいSQLファイルのパス

只需要一个选择:
在执行psql命令后以「集群管理员」身份登录到PostgreSQL并成功进入集群即可完成。

请参考

如何在Ubuntu 20.04上安装PostgreSQL [快速入门]
文档部分:用于Ubuntu特定的PostgreSQL命令