この記事について
Ubuntu環境でPostgreSQLのクラスタ(≒インスタンス)作成時にはまった箇所がありますので、対処法を記録に残したいと思います。
クラスタとは、データベースを区分けする単位のことで、今回、複数サービスを1サーバで起動する運用を考えているため、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にPostgreSQLをインストールします。
$ 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ポート上でクラスタが起動している(online)ことが確認できます。
$ 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
ディレクトリをhostnameとして指定する必要があるようです。
ローカル接続用に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用コマンド