CentOS8にPostgreSQL14をインストールする手順

**PostgreSQL14**を**CentOS8**にインストールしたので、その時の手順を紹介します。

# 環境

+ OS：CentOS Linux release 8.5.2111

```
[root@centos8 ~]# cat /etc/redhat-release
CentOS Linux release 8.5.2111
[root@centos8 ~]#
```

# 1. インストール手順

### 1.1. 概要
インストールの方法は「[PostgreSQL: Downloads](https://www.postgresql.org/download/ "PostgreSQL: Downloads")」のページから調べることができます。
「[PostgreSQL: Downloads](https://www.postgresql.org/download/ "PostgreSQL: Downloads")」のページを開き、「Linux」をクリックします。
![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/089882f8-ecff-85a3-b877-97150c8a4cc6.png)

「Red Hat/Rocky/CentOS」をクリックします。
![1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/ccd00e4c-0af5-5de6-6001-cfa63960c0f5.png)

「1. Select version:」で「14」を選択
「2. Select platform:」で「Red Hat Enterprise, Rocky, or Oracle Version 8」を選択
「3. Select architecture:」で「x86_64」を選択します。
すると、「4. Copy, paste and run the relevant parts of the setup script:」にインストールコマンドが表示されます。
![1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/7ccbdc42-69f2-104a-a6c8-679680a39156.png)

```console:4. Copy, paste and run the relevant parts of the setup script
# Install the repository RPM:
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# Disable the built-in PostgreSQL module:
sudo dnf -qy module disable postgresql

# Install PostgreSQL:
sudo dnf install -y postgresql14-server

# Optionally initialize the database and enable automatic start:
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
sudo systemctl enable postgresql-14
sudo systemctl start postgresql-14
```

### 1.2. PostgreSQLのリポジトリRPMのインストール

以下のコマンドでPostgreSQLのリポジトリRPMをインストールします。

`dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm`

```console:実行結果
[root@centos8 ~]# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
メタデータの期限切れの最終確認: 0:20:54 時間前の 2022年05月27日 23時10分13秒 に実施しました。
pgdg-redhat-repo-latest.noarch.rpm                                                                                      10 kB/s |  13 kB     00:01
依存関係が解決しました。
=======================================================================================================================================================
 パッケージ                               アーキテクチャー               バージョン                         リポジトリー                         サイズ
=======================================================================================================================================================
インストール:
 pgdg-redhat-repo                         noarch                         42.0-24                            @commandline                          13 k

トランザクションの概要
=======================================================================================================================================================
インストール  1 パッケージ

合計サイズ: 13 k
インストール後のサイズ: 12 k
パッケージのダウンロード:
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                                               1/1
  インストール中   : pgdg-redhat-repo-42.0-24.noarch                                                                                               1/1
  検証             : pgdg-redhat-repo-42.0-24.noarch                                                                                               1/1

インストール済み:
  pgdg-redhat-repo-42.0-24.noarch

完了しました!
[root@centos8 ~]#
```

### 1.3. 組み込みPostgreSQLモジュールを無効化

以下のコマンドで、CentOS標準の組み込みのPostgreSQLモジュールを無効化します。

`dnf -qy module disable postgresql`

```console:実行結果
[root@centos8 ~]# dnf -y module disable postgresql
PostgreSQL common RPMs for RHEL / Rocky 8 - x86_64                                                                      85  B/s | 195  B     00:02
PostgreSQL common RPMs for RHEL / Rocky 8 - x86_64                                                                     1.6 MB/s | 1.7 kB     00:00
GPG 鍵 0x442DF0F8 をインポート中:
 Userid     : "PostgreSQL RPM Building Project <pgsql-pkg-yum@postgresql.org>"
 Fingerprint: 68C9 E2B9 1A37 D136 FE74 D176 1F16 D2E1 442D F0F8
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
PostgreSQL common RPMs for RHEL / Rocky 8 - x86_64                                                                     148 kB/s | 621 kB     00:04
PostgreSQL 14 for RHEL / Rocky 8 - x86_64                                                                               95  B/s | 195  B     00:02
PostgreSQL 14 for RHEL / Rocky 8 - x86_64                                                                              1.6 MB/s | 1.7 kB     00:00
GPG 鍵 0x442DF0F8 をインポート中:
 Userid     : "PostgreSQL RPM Building Project <pgsql-pkg-yum@postgresql.org>"
 Fingerprint: 68C9 E2B9 1A37 D136 FE74 D176 1F16 D2E1 442D F0F8
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
PostgreSQL 14 for RHEL / Rocky 8 - x86_64                                                                               69 kB/s | 278 kB     00:04
PostgreSQL 13 for RHEL / Rocky 8 - x86_64                                                                               94  B/s | 195  B     00:02
PostgreSQL 13 for RHEL / Rocky 8 - x86_64                                                                              1.6 MB/s | 1.7 kB     00:00
GPG 鍵 0x442DF0F8 をインポート中:
 Userid     : "PostgreSQL RPM Building Project <pgsql-pkg-yum@postgresql.org>"
 Fingerprint: 68C9 E2B9 1A37 D136 FE74 D176 1F16 D2E1 442D F0F8
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
PostgreSQL 13 for RHEL / Rocky 8 - x86_64                                                                              139 kB/s | 593 kB     00:04
PostgreSQL 12 for RHEL / Rocky 8 - x86_64                                                                               94  B/s | 195  B     00:02
PostgreSQL 12 for RHEL / Rocky 8 - x86_64                                                                              1.6 MB/s | 1.7 kB     00:00
GPG 鍵 0x442DF0F8 をインポート中:
 Userid     : "PostgreSQL RPM Building Project <pgsql-pkg-yum@postgresql.org>"
 Fingerprint: 68C9 E2B9 1A37 D136 FE74 D176 1F16 D2E1 442D F0F8
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
PostgreSQL 12 for RHEL / Rocky 8 - x86_64                                                                              178 kB/s | 757 kB     00:04
PostgreSQL 11 for RHEL / Rocky 8 - x86_64                                                                               94  B/s | 195  B     00:02
PostgreSQL 11 for RHEL / Rocky 8 - x86_64                                                                              1.6 MB/s | 1.7 kB     00:00
GPG 鍵 0x442DF0F8 をインポート中:
 Userid     : "PostgreSQL RPM Building Project <pgsql-pkg-yum@postgresql.org>"
 Fingerprint: 68C9 E2B9 1A37 D136 FE74 D176 1F16 D2E1 442D F0F8
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
PostgreSQL 11 for RHEL / Rocky 8 - x86_64                                                                              211 kB/s | 952 kB     00:04
PostgreSQL 10 for RHEL / Rocky 8 - x86_64                                                                               92  B/s | 195  B     00:02
PostgreSQL 10 for RHEL / Rocky 8 - x86_64                                                                              1.6 MB/s | 1.7 kB     00:00
GPG 鍵 0x442DF0F8 をインポート中:
 Userid     : "PostgreSQL RPM Building Project <pgsql-pkg-yum@postgresql.org>"
 Fingerprint: 68C9 E2B9 1A37 D136 FE74 D176 1F16 D2E1 442D F0F8
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
PostgreSQL 10 for RHEL / Rocky 8 - x86_64                                                                              149 kB/s | 631 kB     00:04
依存関係が解決しました。
=======================================================================================================================================================
 パッケージ                          アーキテクチャー                   バージョン                           リポジトリー                        サイズ
=======================================================================================================================================================
モジュールの無効化:
 postgresql

トランザクションの概要
=======================================================================================================================================================

完了しました!
[root@centos8 ~]#
```

以下のコマンドでインストールしたPostgreSQLのリポジトリを確認します。

`dnf search postgresql*-server`

```console:実行結果
[root@centos8 ~]# dnf search postgresql*-server
メタデータの期限切れの最終確認: 0:03:07 時間前の 2022年05月27日 23時33分37秒 に実施しました。
============================================================ 名前 一致: postgresql*-server ============================================================
postgresql10-server.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql11-server.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql12-server.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql13-server.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql14-server.x86_64 : The programs needed to create and run a PostgreSQL server
[root@centos8 ~]#
```

PostgreSQLのバージョン**10, 11, 12, 13, 14**が含まれています。

### 1.4. PostgreSQL 14をインストール

以下のコマンドで**PostgreSQL 14**をインストールします。

`dnf install -y postgresql14-server`

```console:実行結果
[root@centos8 ~]# dnf install -y postgresql14-server
メタデータの期限切れの最終確認: 0:04:53 時間前の 2022年05月27日 23時33分37秒 に実施しました。
依存関係が解決しました。
=======================================================================================================================================================
 パッケージ                                 アーキテクチャー              バージョン                               リポジトリー                  サイズ
=======================================================================================================================================================
インストール:
 postgresql14-server                        x86_64                        14.3-1PGDG.rhel8                         pgdg14                        5.7 M
依存関係のインストール:
 postgresql14                               x86_64                        14.3-1PGDG.rhel8                         pgdg14                        1.5 M
 postgresql14-libs                          x86_64                        14.3-1PGDG.rhel8                         pgdg14                        276 k

トランザクションの概要
=======================================================================================================================================================
インストール  3 パッケージ

ダウンロードサイズの合計: 7.5 M
インストール後のサイズ: 31 M
パッケージのダウンロード:
(1/3): postgresql14-libs-14.3-1PGDG.rhel8.x86_64.rpm                                                                   141 kB/s | 276 kB     00:01
(2/3): postgresql14-14.3-1PGDG.rhel8.x86_64.rpm                                                                        576 kB/s | 1.5 MB     00:02
(3/3): postgresql14-server-14.3-1PGDG.rhel8.x86_64.rpm                                                                 1.1 MB/s | 5.7 MB     00:04
-------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                   1.5 MB/s | 7.5 MB     00:05
PostgreSQL 14 for RHEL / Rocky 8 - x86_64                                                                              1.6 MB/s | 1.7 kB     00:00
GPG 鍵 0x442DF0F8 をインポート中:
 Userid     : "PostgreSQL RPM Building Project <pgsql-pkg-yum@postgresql.org>"
 Fingerprint: 68C9 E2B9 1A37 D136 FE74 D176 1F16 D2E1 442D F0F8
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
鍵のインポートに成功しました
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                                               1/1
  インストール中   : postgresql14-libs-14.3-1PGDG.rhel8.x86_64                                                                                     1/3
  scriptletの実行中: postgresql14-libs-14.3-1PGDG.rhel8.x86_64                                                                                     1/3
  インストール中   : postgresql14-14.3-1PGDG.rhel8.x86_64                                                                                          2/3
  scriptletの実行中: postgresql14-14.3-1PGDG.rhel8.x86_64                                                                                          2/3
  scriptletの実行中: postgresql14-server-14.3-1PGDG.rhel8.x86_64                                                                                   3/3
  インストール中   : postgresql14-server-14.3-1PGDG.rhel8.x86_64                                                                                   3/3
  scriptletの実行中: postgresql14-server-14.3-1PGDG.rhel8.x86_64                                                                                   3/3
[/usr/lib/tmpfiles.d/pesign.conf:1] Line references path below legacy directory /var/run/, updating /var/run/pesign → /run/pesign; please update the tmpfiles.d/ drop-in file accordingly.

  検証             : postgresql14-14.3-1PGDG.rhel8.x86_64                                                                                          1/3
  検証             : postgresql14-libs-14.3-1PGDG.rhel8.x86_64                                                                                     2/3
  検証             : postgresql14-server-14.3-1PGDG.rhel8.x86_64                                                                                   3/3

インストール済み:
  postgresql14-14.3-1PGDG.rhel8.x86_64          postgresql14-libs-14.3-1PGDG.rhel8.x86_64          postgresql14-server-14.3-1PGDG.rhel8.x86_64

完了しました!
[root@centos8 ~]#
```

### 1.5. マニュアル参照を設定

`man`コマンドで **PostgreSQL** のマニュアルを参照できるように`/etc/man_db.conf`に以下を追加します。
`MANDATORY_MANPATH                       /usr/pgsql-14/share/man/`

```config:/etc/man_db.conf
～～ 省略 ～～
# every automatically generated MANPATH includes these fields
#
#MANDATORY_MANPATH                      /usr/src/pvm3/man
#
MANDATORY_MANPATH                       /usr/man
MANDATORY_MANPATH                       /usr/share/man
MANDATORY_MANPATH                       /usr/local/share/man
MANDATORY_MANPATH                       /usr/pgsql-14/share/man/
～～ 省略 ～～
```

これにより、`man psql`や`man initdb`のように、`man`コマンドで **PostgreSQL** のコマンドを参照できるようになります。


### 1.6. 環境変数の確認

`postgres`ユーザーにスイッチし、`PGDATA`の値を確認します。デフォルトでは`/var/lib/pgsql/14/data`になっています。

`su - postgres`
`env | grep PGDATA`

```:実行結果
[root@centos8 ~]# su - postgres
[postgres@centos8 ~]$ env | grep PGDATA
PGDATA=/var/lib/pgsql/14/data
[postgres@centos8 ~]$ exit
ログアウト
[root@centos8 ~]#
```

なお、`PGDATA`は`postgres`ユーザーのホームディレクトリ`/var/lib/pgsql`配下の`.bash_profile`に設定されています。

```bash:/var/lib/pgsql/.bash_profile
[ -f /etc/profile ] && source /etc/profile
PGDATA=/var/lib/pgsql/14/data
export PGDATA
# If you want to customize your settings,
# Use the file below. This is not overridden
# by the RPMS.
[ -f /var/lib/pgsql/.pgsql_profile ] && source /var/lib/pgsql/.pgsql_profile
```

### 1.7. データベースの初期化（データベースクラスタの作成）

以下のコマンドで、データベースの初期化（データベースクラスタの作成）を行います。
（`PGSETUP_INITDB_OPTIONS`の環境変数で、エンコーディングを「UTF-8」に、ロケールを「無し」に設定しています。）
なお、データベースクラスタは`PGDATA`で指定されているディレクトリに作成されます。

`PGSETUP_INITDB_OPTIONS='--encoding=UTF-8 --no-locale' /usr/pgsql-14/bin/postgresql-14-setup initdb`

```console:実行結果
[root@centos8 ~]# PGSETUP_INITDB_OPTIONS='--encoding=UTF-8 --no-locale' /usr/pgsql-14/bin/postgresql-14-setup initdb
Initializing database ... OK

[root@centos8 ~]#
```

`PGDATA`の`/var/lib/pgsql/14/data`を参照すると、以下の通りデータベースクラスタが作成されています。

```console:実行結果
[root@centos8 ~]# ls -l /var/lib/pgsql/14/data
合計 64
-rw------- 1 postgres postgres     3  5月 28 01:17 PG_VERSION
drwx------ 5 postgres postgres    41  5月 28 01:17 base
-rw------- 1 postgres postgres    30  5月 29 02:39 current_logfiles
drwx------ 2 postgres postgres  4096  5月 29 02:39 global
drwx------ 2 postgres postgres    58  5月 29 02:39 log
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_commit_ts
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_dynshmem
-rw------- 1 postgres postgres  4577  5月 28 01:17 pg_hba.conf
-rw------- 1 postgres postgres  1636  5月 28 01:17 pg_ident.conf
drwx------ 4 postgres postgres    68  5月 29 03:19 pg_logical
drwx------ 4 postgres postgres    36  5月 28 01:17 pg_multixact
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_notify
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_replslot
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_serial
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_snapshots
drwx------ 2 postgres postgres    63  5月 29 03:19 pg_stat
drwx------ 2 postgres postgres     6  5月 29 03:19 pg_stat_tmp
drwx------ 2 postgres postgres    18  5月 28 01:17 pg_subtrans
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_tblspc
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_twophase
drwx------ 3 postgres postgres    60  5月 28 01:17 pg_wal
drwx------ 2 postgres postgres    18  5月 28 01:17 pg_xact
-rw------- 1 postgres postgres    88  5月 28 01:17 postgresql.auto.conf
-rw------- 1 postgres postgres 28724  5月 28 01:17 postgresql.conf
-rw------- 1 postgres postgres    58  5月 29 02:39 postmaster.opts
[root@centos8 ~]#
```

# 2. PostgreSQLの起動、停止、自動起動有効化

PostgreSQLのサービスのユニット定義ファイルは`/usr/lib/systemd/system/postgresql-14.service`に作成されています。

```bash:/usr/lib/systemd/system/postgresql-14.service
# It's not recommended to modify this file in-place, because it will be
# overwritten during package upgrades.  It is recommended to use systemd
# "dropin" feature;  i.e. create file with suffix .conf under
# /etc/systemd/system/postgresql-14.service.d directory overriding the
# unit's defaults. You can also use "systemctl edit postgresql-14"
# Look at systemd.unit(5) manual page for more info.

# Note: changing PGDATA will typically require adjusting SELinux
# configuration as well.

# Note: do not use a PGDATA pathname containing spaces, or you will
# break postgresql-14-setup.
[Unit]
Description=PostgreSQL 14 database server
Documentation=https://www.postgresql.org/docs/14/static/
After=syslog.target
After=network.target

[Service]
Type=notify

User=postgres
Group=postgres

# Note: avoid inserting whitespace in these Environment= lines, or you may
# break postgresql-setup.

# Location of database directory
Environment=PGDATA=/var/lib/pgsql/14/data/

# Where to send early-startup messages from the server (before the logging
# options of postgresql.conf take effect)
# This is normally controlled by the global default set by systemd
# StandardOutput=syslog

# Disable OOM kill on the postmaster
OOMScoreAdjust=-1000
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0

ExecStartPre=/usr/pgsql-14/bin/postgresql-14-check-db-dir ${PGDATA}
ExecStart=/usr/pgsql-14/bin/postmaster -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT

# Do not set any timeout value, so that systemd will not kill postmaster
# during crash recovery.
TimeoutSec=0

# 0 is the same as infinity, but "infinity" needs systemd 229
TimeoutStartSec=0

TimeoutStopSec=1h

[Install]
WantedBy=multi-user.target
```
`Environment=PGDATA=/var/lib/pgsql/14/data/`と「PGDATA」には「/var/lib/pgsql/14/data/」が設定されています。
（「PGDATA」を変更している場合、上記のファイルも変更する必要があります。）

PostgreSQLの起動、停止、自動起動有効化は以下のコマンドとなります。

+ 起動
`systemctl start postgresql-14`

+ 停止
`systemctl stop postgresql-14`

+ 自動起動有効化
`systemctl enable postgresql-14`


# 3. 動作確認用DBの作成

### 3.1. PostgreSQL起動

`systemctl start postgresql-14`のコマンドでPostgreSQLを起動します。

```console:実行結果
[root@centos8 ~]# systemctl start postgresql-14
[root@centos8 ~]#
```

### 3.2. psqlで接続

`postgres`ユーザーにスイッチし、`psql`コマンドでデータベースに接続します。
`su - postgres`
`psql`

```console:実行結果
[root@centos8 ~]# su - postgres
[postgres@centos8 ~]$ psql
psql (14.3)
"help"でヘルプを表示します。

postgres=#
```

以下のSQLでバージョンを確認してみます。
`select version();`

```sql:実行結果
postgres=# select version();
                                                 version

--------------------------------------------------------------------------------
-------------------------
 PostgreSQL 14.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (R
ed Hat 8.5.0-10), 64-bit
(1 行)

postgres=#
```

### 3.3. ロールの作成

以下のSQLでロール（`test_role`）を作成します。
```sql
CREATE ROLE test_role WITH
  SUPERUSER
  CREATEDB
  CREATEROLE
  INHERIT
  LOGIN
  REPLICATION
  BYPASSRLS
  ENCRYPTED PASSWORD 'password';
```

```sql:実行結果
postgres=# CREATE ROLE test_role WITH
postgres-#   SUPERUSER
postgres-#   CREATEDB
postgres-#   CREATEROLE
postgres-#   INHERIT
postgres-#   LOGIN
postgres-#   REPLICATION
postgres-#   BYPASSRLS
postgres-#   ENCRYPTED PASSWORD 'password';
CREATE ROLE
postgres=#
```

`\du`コマンドでロールの一覧を参照し、ロール（`test_role`）が作成されていることを確認します。

```sql:実行結果
postgres=# \du
ロール一覧
-[ RECORD 1 ]+-----------------------------------------------------------------------------
ロール名     | postgres
属性         | スーパーユーザー, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス
所属グループ | {}
-[ RECORD 2 ]+-----------------------------------------------------------------------------
ロール名     | test_role
属性         | スーパーユーザー, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス
所属グループ | {}

postgres=#
```

### 3.4. テーブルスペース作成

`\q`コマンドで、一旦`psql`から抜けます。

```console:実行結果
postgres=# \q
[postgres@centos8 ~]$
```

以下のコマンドでテーブルスペース（`test_tbs`）で使用するディレクトリを作成します。
`mkdir /var/lib/pgsql/14/data/test_tbs`

```console:実行結果
[postgres@centos8 ~]$ mkdir /var/lib/pgsql/14/data/test_tbs
[postgres@centos8 ~]$ ls -l /var/lib/pgsql/14/data
合計 68
-rw------- 1 postgres postgres     3  5月 28 01:17 PG_VERSION
drwx------ 5 postgres postgres    41  5月 28 01:17 base
-rw------- 1 postgres postgres    30  6月 26 14:45 current_logfiles
drwx------ 2 postgres postgres  4096  6月 26 14:45 global
drwx------ 2 postgres postgres    58  5月 29 02:39 log
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_commit_ts
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_dynshmem
-rw------- 1 postgres postgres  4577  5月 28 01:17 pg_hba.conf
-rw------- 1 postgres postgres  1636  5月 28 01:17 pg_ident.conf
drwx------ 4 postgres postgres    68  6月 26 14:55 pg_logical
drwx------ 4 postgres postgres    36  5月 28 01:17 pg_multixact
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_notify
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_replslot
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_serial
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_snapshots
drwx------ 2 postgres postgres     6  6月 26 14:45 pg_stat
drwx------ 2 postgres postgres    63  6月 26 15:03 pg_stat_tmp
drwx------ 2 postgres postgres    18  5月 28 01:17 pg_subtrans
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_tblspc
drwx------ 2 postgres postgres     6  5月 28 01:17 pg_twophase
drwx------ 3 postgres postgres    60  5月 28 01:17 pg_wal
drwx------ 2 postgres postgres    18  5月 28 01:17 pg_xact
-rw------- 1 postgres postgres    88  5月 28 01:17 postgresql.auto.conf
-rw------- 1 postgres postgres 28724  5月 28 01:17 postgresql.conf
-rw------- 1 postgres postgres    58  6月 26 14:45 postmaster.opts
-rw------- 1 postgres postgres   103  6月 26 14:45 postmaster.pid
drwxr-xr-x 2 postgres postgres     6  6月 26 15:03 test_tbs
[postgres@centos8 ~]$
```

再度、`psql`コマンドでデータベースに接続します。

```console:実行結果
[postgres@centos8 ~]$ psql
psql (14.3)
"help"でヘルプを表示します。

postgres=#
```

以下のSQLで、テーブルスペース（`test_tbs`）を作成します。

```sql
CREATE TABLESPACE test_tbs
  OWNER test_role
  LOCATION '/var/lib/pgsql/14/data/test_tbs';
COMMENT ON TABLESPACE test_tbs IS 'テスト用テーブルスペース';
GRANT CREATE ON TABLESPACE test_tbs TO test_role;
```

```sql:実行結果
postgres=# CREATE TABLESPACE test_tbs
postgres-#   OWNER test_role
postgres-#   LOCATION '/var/lib/pgsql/14/data/test_tbs';
WARNING:  tablespace location should not be inside the data directory
CREATE TABLESPACE
postgres=# COMMENT ON TABLESPACE test_tbs IS 'テスト用テーブルスペース';
COMMENT
postgres=# GRANT CREATE ON TABLESPACE test_tbs TO test_role;
GRANT
postgres=#
```

`\db`でテーブルスペース（`test_tbs`）が作成されていることを確認します。

```sql:実行結果
postgres=# \db
                     テーブル空間一覧
    名前    |  所有者   |              場所
------------+-----------+---------------------------------
 pg_default | postgres  |
 pg_global  | postgres  |
 test_tbs   | test_role | /var/lib/pgsql/14/data/test_tbs
(3 行)

postgres=#
```

### 3.5. データベース作成

以下のSQLでデーターベース（`test_db`）を作成します。

```sql
CREATE DATABASE test_db
    WITH 
    OWNER = test_role
    ENCODING = 'UTF8'
    LC_COLLATE = 'C'
    LC_CTYPE = 'C'
    TABLESPACE = test_tbs
    ALLOW_CONNECTIONS = true
    CONNECTION LIMIT = -1;
COMMENT ON DATABASE test_db IS 'テスト用データベース';
```

```sql:実行結果
postgres=# CREATE DATABASE test_db
postgres-#     WITH
postgres-#     OWNER = test_role
postgres-#     ENCODING = 'UTF8'
postgres-#     LC_COLLATE = 'C'
postgres-#     LC_CTYPE = 'C'
postgres-#     TABLESPACE = test_tbs
postgres-#     ALLOW_CONNECTIONS = true
postgres-#     CONNECTION LIMIT = -1;
CREATE DATABASE
postgres=# COMMENT ON DATABASE test_db IS 'テスト用データベース';
COMMENT
postgres=#
```

`\l`コマンドでデーターベースの一覧を参照し、データベース（`test_db`）が作成されていることを確認します。

```sql:実行結果
postgres=# \l
                                        データベース一覧
   名前    |  所有者   | エンコーディング | 照合順序 | Ctype(変換演算子) |     アクセス権限
-----------+-----------+------------------+----------+-------------------+-----------------------
 postgres  | postgres  | UTF8             | C        | C                 |
 template0 | postgres  | UTF8             | C        | C                 | =c/postgres          +
           |           |                  |          |                   | postgres=CTc/postgres
 template1 | postgres  | UTF8             | C        | C                 | =c/postgres          +
           |           |                  |          |                   | postgres=CTc/postgres
 test_db   | test_role | UTF8             | C        | C                 |
(4 行)

postgres=#
```

### 3.6. スキーマ作成

`\c test_db`コマンドで、`test_db`に切り替えます。

```sql:実行結果
postgres=# \c test_db
データベース"test_db"にユーザー"postgres"として接続しました。
test_db=#
```

以下のSQLで``test_db`に、スキーマ（`test_schema`）を作成します。

```sql
CREATE SCHEMA test_schema AUTHORIZATION test_role;
COMMENT ON SCHEMA test_schema IS 'テスト用スキーマ';
GRANT ALL ON SCHEMA test_schema TO test_role;
```

```sql:実行結果
test_db=# CREATE SCHEMA test_schema AUTHORIZATION test_role;
CREATE SCHEMA
test_db=# COMMENT ON SCHEMA test_schema IS 'テスト用スキーマ';
COMMENT
test_db=# GRANT ALL ON SCHEMA test_schema TO test_role;
GRANT
test_db=#
```

`\dn+`コマンドでスキーマの一覧を参照し、スキーマ（`test_schema`）が作成されていることを確認します。

```sql:実行結果
test_db=# \dn+
                               スキーマ一覧
    名前     |  所有者   |      アクセス権限      |          説明
-------------+-----------+------------------------+------------------------
 public      | postgres  | postgres=UC/postgres  +| standard public schema
             |           | =UC/postgres           |
 test_schema | test_role | test_role=UC/test_role | テスト用スキーマ
(2 行)

test_db=#
```
ここでは、スキーマとして`test_schema`を作成しましたが、`postgresql.conf`で`search_path`に`'"$user", public'`が設定されているため、スキーマはデフォルトの`public`を使用するか、ユーザー（ロール）と同じ名前にしたほうが使い勝手がよさそうです。

```console:設定確認
[postgres@centos8 ~]$ grep search_path /var/lib/pgsql/14/data/postgresql.conf
#search_path = '"$user", public'        # schema names
[postgres@centos8 ~]$
```

### 3.7. テーブルとインデックスの作成

以下のSQLで`test_db`の`test_schema`にテーブル（`test_table`）を作成します。

```sql
CREATE TABLE test_schema.test_table (
  test_id varchar(8), 
  test_name varchar(256),
  PRIMARY KEY (test_id)
) TABLESPACE test_tbs;
COMMENT ON TABLE test_table IS 'テスト用テーブル';
```

```sql:実行結果
test_db=# CREATE TABLE test_schema.test_table (
test_db(#   test_id varchar(8),
test_db(#   test_name varchar(256),
test_db(#   PRIMARY KEY (test_id)
test_db(# ) TABLESPACE test_tbs;
CREATE TABLE
test_db=# COMMENT ON TABLE test_table IS 'テスト用テーブル';
ERROR:  relation "test_table" does not exist
test_db=#
```

`\dt test_schema.*`コマンドで、テーブル（`test_table`）が作成されていることを確認します。

```sql:実行結果
test_db=# \dt test_schema.*
                リレーション一覧
  スキーマ   |    名前    |  タイプ  |  所有者
-------------+------------+----------+----------
 test_schema | test_table | テーブル | postgres
(1 行)

test_db=#
```

以下のSQLで`test_table`にデータを投入します。

```sql
INSERT INTO test_schema.test_table(test_id, test_name) VALUES('00000001', 'テスト名称１');
INSERT INTO test_schema.test_table(test_id, test_name) VALUES('00000002', 'テスト名称２');
```

```sql:実行結果
test_db=# INSERT INTO test_schema.test_table(test_id, test_name) VALUES('00000001', 'テスト名称１');
INSERT 0 1
test_db=# INSERT INTO test_schema.test_table(test_id, test_name) VALUES('00000002', 'テスト名称２');
INSERT 0 1
test_db=#
```

以下のSQLで`test_table`を参照します。
`select * from test_schema.test_table;`

```sql:実行結果
test_db=# select * from test_schema.test_table;
 test_id  |  test_name
----------+--------------
 00000001 | テスト名称１
 00000002 | テスト名称２
(2 行)

test_db=#
```

`\q`コマンドでpsqlから抜けます。

```sql:実行結果
test_db=# \q
[postgres@centos8 ~]$
```

# 4. ネットワーク設定（クライアント端末から接続のため）
### 4.1. postgresql.confの修正
`/var/lib/pgsql/14/data/postgresql.conf`の`listen_addresses`と`port`の項目を修正します。
`listen_addresses`には接続を受け付けるサーバー側のIPアドレスを設定します。（ここではPostgreSQLをインストールしたサーバーのIPアドレスの`192.168.1.10`）
`port`には接続を受け付けるサーバー側のポートを設定します。（PostgreSQLのポートである`5432`）

```bash:/var/lib/pgsql/14/data/postgresql.conf（変更前）
～～ 省略 ～～
#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
#port = 5432                            # (change requires restart)
～～ 省略 ～～
```

```bash:/var/lib/pgsql/14/data/postgresql.conf（変更後）
～～ 省略 ～～
listen_addresses = '192.168.0.10'       # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)
～～ 省略 ～～
```

### 4.2. pg_hba.confの修正
`/var/lib/pgsql/14/data/pg_hba.conf`に以下の設定を追加します。

+ TYPE: host
+ DATABASE: test_db
+ USER: test_role
+ ADDRESS: 192.168.0.0/24
+ METHOD: scram-sha-256

`192.168.0.0/24`はサーバーに接続するクライアントのネットワークアドレスです。

```bash:/var/lib/pgsql/14/data/pg_hba.conf（追加）
host    test_db         test_role       192.168.0.0/24          scram-sha-256
```

### 4.3. PostgreSQLの再起動

`su -`コマンドで`root`ユーザーにスイッチします。

```console:実行結果
[postgres@centos8 data]$ su -
パスワード:
[root@centos8 ~]#
```

`systemctl restart postgresql-14`コマンドでPostgreSQLを再起動します。

```console:実行結果
[root@centos8 ~]# systemctl restart postgresql-14
[root@centos8 ~]#
```

### 4.4. firewallの設定
`/usr/lib/firewalld/services/postgresql.xml`のファイルが存在することを確認します。

```xml:/usr/lib/firewalld/services/postgresql.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>PostgreSQL</short>
  <description>PostgreSQL Database Server</description>
  <port protocol="tcp" port="5432"/>
</service>
```

以下のコマンドでfirewall に`postgresql`のサービスを追加します。
`firewall-cmd --add-service=postgresql --permanent --zone=public`

```console:実行結果
[root@centos8 ~]# firewall-cmd --add-service=postgresql --permanent --zone=public
success
[root@centos8 ~]#
```

以下のコマンドで firewall を再起動します。
`systemctl restart firewalld.service`

```console:実行結果
[root@centos8 ~]# systemctl restart firewalld.service
[root@centos8 ~]#
```

以下のコマンドで、firewall に`postgresql`が追加されていることを確認します。
`firewall-cmd --list-services --zone=public`

```console:実行結果
[root@centos8 ~]# firewall-cmd --list-services --zone=public
cockpit dhcpv6-client postgresql ssh
[root@centos8 ~]#
```

# 5. A5M2.exe で接続確認
クライアント端末（ここではWindowsPC）で **A5M2.exe** を起動します。
**A5M2.exe** は「[A5:SQL Mk-2 - フリーのSQLクライアント/ER図作成ソフト (松原正和)](https://a5m2.mmatsubara.com/ "A5:SQL Mk-2 - フリーのSQLクライアント/ER図作成ソフト (松原正和)")」からダウンロードできます。

メニューから「データベース」－「データベースの追加と削除」を選択します。
![5-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/db7cf454-bb45-8cd6-9a99-4ab97bd320b6.png)

「追加」をクリックします。
![5-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/3d202a9e-e0a8-4865-f648-3acc6048e912.png)

「PostgreSQL（直接接続）」をクリックします。
![5-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/00a0fc14-0897-2f9e-539a-c8bd56037425.png)

以下を入力し、「OK」をクリックします。
+ サーバー名: サーバのIPアドレス（ここでは`192.168.0.10`）
+ データベース名: test_db
+ ユーザーID: test_role
+ パスワード: password
+ パスワードを保存する: チェック
![5-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/0c1e4b41-b55e-673f-e48b-7d9134591446.png)

そのまま「OK」をクリックします。
![5-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/8c508cbc-64ed-6046-4e13-f9471dec94bc.png)

「閉じる」をクリックします。
![5-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/fb557ebd-6a52-e487-a24e-65f55726ff01.png)

「test_db」をクリックします。
![5-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/706d3693-dec4-69cf-eefe-7ee7cbc51f64.png)

「接続」をクリックします。
![5-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/4f684384-c6c3-2da3-e635-9d751bb06523.png)

「test_db」－「test_schema」－「test_table」を選択し、テーブルが参照できることを確認できました。
![5-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/381f83a6-d8b0-e55b-eae8-ad6df78b7937.png)


# 参考
+ [PostgreSQL日本語ドキュメント](https://www.postgresql.jp/document/ "PostgreSQL日本語ドキュメント")
+ [PostgreSQL: Downloads](https://www.postgresql.org/download/ "PostgreSQL: Downloads")
+ [Repo RPMs - PostgreSQL YUM Repository](https://yum.postgresql.org/repopackages/ "Repo RPMs - PostgreSQL YUM Repository")
+ [A5:SQL Mk-2 - フリーのSQLクライアント/ER図作成ソフト (松原正和)](https://a5m2.mmatsubara.com/ "A5:SQL Mk-2 - フリーのSQLクライアント/ER図作成ソフト (松原正和)")