[postgres@localhost ~]# pg_isready -h <ホスト名>
[postgres@localhost ~]$ echo $?
0
PostgreSQLのユーティリティのひとつ、pg_isreadyを使うと、PostgresSQLサーバの接続状態が確認できます。
簡単に言えば接続ができるか、応答があるかを確認するシンプルなコマンドです。
応答があるか確認してみる
pg_isreadyコマンドをそのまま実行すると、デフォルトでlocalhostにあるPostgreSQLの接続状態を確認します。
とりあえずlocalhostでPostgreSQLサーバが起動していない状態でコマンドを実行した結果は以下のとおり。
【サーバが起動していないとき】
[root@localhost ~]# pg_isready
/var/run/postgresql:5432 - 応答がありません
画面上のメッセージから接続が失敗したことが分かりました。次に起動している状態で実行した場合です。
【サーバが起動しているとき】
[postgres@localhost ~]$ pg_isready
/var/run/postgresql:5432 - 接続を受け付けています
上記のようにオプションを指定せずに実行した場合、下記でデフォルト実行されます。
確認対象のホスト(-hまたは--host=)
⇒localhost(※厳密にはUnixドメインソケットを使用するため、明示的にした場合のTCP/IP接続とは異なる)
確認対象のポート
⇒5432
応答待機時間-t(または--timeout=)
⇒3秒
接続ユーザー-U(または--username=)
⇒OSログインユーザー
応答コードについて
pg_isreadyコマンドの結果は、終了ステータスに格納されます。 Linuxのシェルで確認する場合、直前のコマンド結果を表示する「$?」で確認できます。
終了コード | |
pg_isready実行の結果 | 終了ステータス |
接続に成功したとき | 0 |
接続が拒絶されたとき | 1 |
接続の応答がないとき | 2 |
接続が試行されなかったとき | 3 |
"0"(接続に成功)と"2"(応答がない)は分かりやすく、"3"(接続が思考されていない)はオプションのパラメータ指定に誤りがある場合になります。
ダントツで分かりづらいのが、"1"(接続の拒絶)です。
とりあえず下記思いつくパターンで片っ端から実行した結果を記載します。
※PostgreSQLはデフォルト設定状態で上ほど優先的に処理される、同じ終了コードは順位同列。
パターン別の結果一覧 | |
パターン | 結果 |
PostgreSQLが起動していない | 応答がない(2) |
リモートの場合、指定ホストサーバのポートが開いていない | 応答がない(2) |
PostgreSQLが起動中(pg_ctl startなど) | 接続を拒絶(1) |
PostgreSQLが停止中(pg_ctl stopなど) | 接続を拒絶(1) |
オプションパラメータの指定ミス | 施行しない(3) |
pg_hba.confの設定で接続が認められていない | 接続に成功(0) |
-dオプションで存在しないDBを指定 | 接続に成功(0) |
-Uオプションで存在しないユーザーを指定 | 接続に成功(0) |
PostgreSQLが正常に稼働中 | 接続に成功(0) |
pg_isreadyが成功してもpsqlが成功するとは限らない点に注意。
(これが一致しなくてどうすると思いますが、、-Uオプションいる?)
ログに書き出される内容とエラーについて
PostgreSQLのマニュアルにあるように、pg_isreadyコマンドを実行するに際し、ユーザー名やデータベースなど、一部のオプションはパラメータが正しくなかったとしてもエラーしません。
しかし不正なパラメータであったことは、$PGDATA/log/以下のログに書き出されます。 例えば下記はPostgreSQLに存在しないユーザーでpg_isreadyコマンドを実行した結果です。
[postgres@localhost ~]$ pg_isready
pg_isready -U 存在しないユーザー
↓ログの中身は、
2020-04-20 23:28:38.768 JST [3516] FATAL: role "存在しないユーザー" does not exist
となります。