行き当たりばったり学習～PostgreSQL PGAdmin接続編(RHEL8)～

皆さんこんにちは！

医療業界から IT にチャレンジして2年目のharuです。

前回までは PostgreSQL をインストールして起動するところまで進めました。
本日はサーバー側の PosgreSQL に対してクライアントから接続し、
ネットワーク経由でデータベースを操作するための準備を行っていきます。

#### 事前準備

PGAdminを使用してクライアント接続を行う前に、必要な知識をものすごくざっくり学習していきます。

**クライアント接続**
データベースサーバーに対してネット経由で接続を行う。

**クライアントソフト**
クライアント接続を行う際に使用する接続元のソフト。

**PostgreSQL でクライアント接続を行う際の必須設定**

- pg_hba.conf 及び postgres.conf の設定
- OSファイアウォールポート設定  
- 設定の反映

#### 1.pg_hba.conf 及び postgres.conf の設定

**pg_hba.conf**

```
[postgres@postgreSQL ~]$ find / -name pg_hba.conf 2> /dev/null
/var/lib/pgsql/15/data/pg_hba.conf
[postgres@postgreSQL ~]$ vi /var/lib/pgsql/15/data/pg_hba.conf /* 抜粋 */
# TYPE  DATABASE        USER            ADDRESS                 METHOD
・・・
host    all             all             0.0.0.0/0               trust /* 今回はテストで無制限に許可しております */
```

**postgresql.conf**

```
[postgres@postgreSQL ~]$ find / -name postgresql.conf 2> /dev/null
/var/lib/pgsql/15/data/postgresql.conf

listen_addresses = '*'                  #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)
```

試しにここで PGAdmin から接続してみる。

すると以下のエラーメッセージが発生。

```
「connection to server at "***.**.**.***",port 5432 failed:timedout expired」
```

繋がらない。

#### 2.OSファイアウォールポート設定

**PostgreSQLを許可する**

```
[root@postgreSQL pgsql]# firewall-cmd --add-service=postgresql --permanent
success
```

**設定をリロード**

```
[root@postgreSQL pgsql]# firewall-cmd --reload
success
```

試しにここで PGAdmin から接続してみると。。。
```
サーバーに接続できません:connection to server at "***.**.**.***",
port 5432 failed: Connection refused(*********/*****)Is the server running
on that host and accepting TCP/IP connections?
```
またまたエラーメッセージが発生しました。
原因としては、ここまでの設定変更が反映されていないからです。

#### 3.設定の反映

**systemctlを実行**

```
[root@postgreSQL pgsql]# systemctl start postgresql-15.service
Job for postgresql-15.service failed because the control process exited with error code.
See "systemctl status postgresql-15.service" and "journalctl -xe" for details.

/* コマンドが失敗? */

[root@postgreSQL pgsql]# journalctl -xe
-- Subject: Unit failed
-- Defined-By: systemd
-- Support: https://access.redhat.com/support
--
-- The unit postgresql-15.service has entered the 'failed' state with result 'exit-code'.
10月 19 03:58:15 postgreSQL systemd[1]: Failed to start PostgreSQL 15 database server.
-- Subject: Unit postgresql-15.service has failed
-- Defined-By: systemd
-- Support: https://access.redhat.com/support
--
-- Unit postgresql-15.service has failed.
--
-- The result is failed. /* 起動に失敗していますね */

[root@postgreSQL pgsql]# systemctl status /* PostgreSQL サービスの状態を確認 */
● postgreSQL
    State: degraded
     Jobs: 0 queued
   Failed: 1 units
```
**degraded を対処**

サービスを起動できないですね。。。

State : degraded については、以下のブログが参考になります。簡単に言うと起動に失敗している状況らしいです。

▼systemctl statusでdegradedと言われた場合の対処方法
  https://linux-junkie.at.webry.info/201712/article_1.html

対処方法としては、systemctl disable でサービスを無効化した後、再起動をすることで runnning になるらしい。
```
[root@postgreSQL pgsql]# systemctl disable postgresql-15.service
Removed /etc/systemd/system/multi-user.target.wants/postgresql-15.service.
[root@postgreSQL pgsql]# systemctl reboot
Too few arguments.

/*OS再起動後*/

[root@postgreSQL ~]# systemctl status postgresql-15.service
● postgresql-15.service - PostgreSQL 15 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-15.service; enabled; vendor preset: disabled)
   Active: active (running)  /* PostgreSQL のサービスが起動してますね */
   ・・・
```
ようやく起動したので次に進みます。

#### 4.PGAdminでPostgreSQLに接続
現在のPostgreSQLサーバーの起動状態を確認します。
```
[root@postgreSQL ~]# su - postgres
[postgres@postgreSQL ~]$ pg_ctl status
pg_ctl: サーバーが動作中です(PID: 3493)
/usr/pgsql-15/bin/postgres "-D" "/var/lib/pgsql/15/data/"
```
PostgreSQL サーバーが起動していることを確認したので、PGAdmin から接続します。
![接続成功.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920045/68e7c32b-00b3-752e-fc63-e2589bb99aa9.png)
※セキュリティ面の配慮のため、ホスト名/アドレスは消しています。
![接続成功2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920045/178141cb-670f-4511-47b2-be10ae01da1f.png)

#### 5.まとめ
PGAdminを使用してPostgreSQLサーバーに接続する際の必須設定としては、以下の3つが必要です。

- pg_hba.conf 及び postgres.conf の設定
- OSファイアウォールポート設定  
- 上記2項目の設定を反映する(サービスの再起動)

また、今回の検証では許可を無制限にしていますが、実際の運用では特定のIPアドレスのみ許可をします。
無制限にするとセキュリティがゆるゆるなので、、、

ではまた！