PostgreSQLのエラー確認ポイント

## 検証環境
　CentOS8, Postgres12.9　で確認

## 目的
postgresの検証中に出たエラー対応のまとめです。
もしかしたら誤った内容があるかもしれません。

## データベースクラスタ（初期化）

◆エラー
initdb: エラー: ディレクトリ"/var/lib/pgsql/data"は存在しますが、空ではありません～
◆内容
　データファイルがあるとエラーになる。
◆対応
　・ディレクトリを削除する
　・既存のディレクトリ名を変更する
　・作成するディレクトリに別の場所を指定する　など	

## データベースの起動、停止

### 例１：データベースクラスタが見つからない場合
規定値のディレクトリをリネームしてテストする
本来の値：/var/lib/pgsql/data
↓
変更後：/var/lib/pgsql/data1

にしてテストする。

#### rootユーザにてsystemctlで起動してみる。

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

エラー内容はjournalctlを確認するようにと言われる
```
[root@localhost ~]# journalctl -xe
-- Unit postgresql.service has begun starting up.
 6月 05 10:46:39 localhost.localdomain postgresql-check-db-dir[188431]: Directory "/var/lib/pgsql/data" is missing or empty.
```

/var/lib/pgsql/dataが見つかりませんと出る。

#### pg_ctlで起動してみる

```
[postgres@localhost ~]$ pg_ctl start
pg_ctl: ディレクトリ "/var/lib/pgsql/data" は存在しません
```
こちらは日本語でエラーが返ってくるのでわかりやすい。

#### 対応
データベースクラスタが見つからない場合は、以下の対応が考えられる
１．initdbでデータベースクラスタを作成する
２．データベースクラスタを指定して起動する
　上記の場合だと「 pg_ctl start -D /var/lib/pgsql/data1」など
　ただし、停止する場合もディレクトリ指定が必要です。

### 例２：データベースクラスタにアクセスできない

#### データベースクラスタの権限をrootにしてpostgresで起動する

```
[root@localhost ~]# chown root:root /var/lib/pgsql/data
[root@localhost ~]# su - postgres
[postgres@localhost ~]$ pg_ctl start
pg_ctl: PIDファイル"/var/lib/pgsql/data/postmaster.pid"をオープンできませんでした: 許可がありません
```
postgresユーザからアクセスできないのでエラーなる。

####　対応

・所有者とグループはpostgresにする
chown -R postgres:postgres /var/lib/pgsql

・権限は0750にする。
chmod -R 750 /var/lib/pgsql

## クライアントから接続できない

### ケース１：postgresql.conf
　listen_addressesで許可されているか

★対応：接続元を許可する
　例
　listen_addresses = '*'　
　
　※listen_addressesは範囲指定できません。個々の指定はpg_hba.confで行う

###　ケース２：pg_hba.conf	
　接続元のデータベース、ユーザ、IPアドレス等は許可されているか？

★設定例
例：192.168.11.1でパスワード（md5）認証する場合
host all all 192.168.11.1/32        md5

例：192.168.11配下でパスワード（md5）認証する場合※サブネットマスク 24とする
host all all 192.168.121.0/24        md5

例：レプリケーションの指定でパスワードなしの場合
host replication rep_user 192.168.121.123/32 trust

	
## SQLの結果が帰ってこない
レプリケーションの検証時にハマった

synchronous_standby_namesが有効かつ
synchronous_commitがoff以外かつ
スタンバイサーバが停止している場合、
スタンバイサーバからの応答が無いため、結果が返ってこない	

★対応
・スタンバイを稼働させる
もしくは
・synchronous_commitをoff,local以外に設定する	
　ただし同期が不安定になるので推奨

## データベースが停止できない

起動時のデータディレクトリを環境変数以外にしている場合はエラーになる。
stopコマンドでデータディレクトリを指定する

## つまづいたときに調査するポイント

1.ＯＳのジャーナルログ
　journalctl -xe
　※systemd-journaldが収集したログを表示するためのコマンド

2.postgresのログ
　data/log

3.プロセス確認
　ps -ef | grep postgres

4.プログラムの場所（ディレクトリ、ユーザコマンドの場所）を確認する
　pg_config --bindir

5.環境変数確認
 echo $PATH

6.データフォルダ確認
 psql　で接続して
　 SHOW data_directory;　を実行する

```
[postgres@localhost ~]$ psql
psql (12.9)
"help"でヘルプを表示します。
postgres=#  SHOW data_directory;
   data_directory
---------------------
 /var/lib/pgsql/data
(1 行)
```

7.postgresのバージョン確認
　psql --version

8.systemctlで起動時は　ステータス確認でプログラムの場所、データディレクトリは確認できる

```
[root@localhost ~]# systemctl status postgresql.service
● postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor >
● postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor >
   Active: active (running) since Thu 2023-06-08 23:10:01 JST; 6min ago
 Main PID: 1060 (postmaster)
    Tasks: 8 (limit: 11095)
   Memory: 24.5M
   CGroup: /system.slice/postgresql.service
           tq1060 /usr/bin/postmaster -D /var/lib/pgsql/data
           tq1094 postgres: logger
           tq1098 postgres: checkpointer
           tq1099 postgres: background writer
           tq1100 postgres: walwriter
           tq1101 postgres: autovacuum launcher
           tq1102 postgres: stats collector
           mq1103 postgres: logical replication launcher
```

## 参考記事

https://qiita.com/tom-sato/items/b3842d7f0ade1e8302a5