約束の地

キャロ組

PostgreSQL で psql などを実行したら could not connect to database postgres: could not connect to server: No such file or directory と出る場合

状況

$ psql などを実行すると無情に以下のようなエラーが出続けるという状況です*1

psql: could not connect to server: No such file or directory 
Is the server running locally and accepting 
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

注意

十中八九、ソケットが云々の話ではないと思われます。設定がおかしいでしょう。

混乱させられる点

再インストールやサービスのリスタートをしても、見た目は正常に動いているように見えてしまう*2のがとても厄介でめちゃくちゃハマりました。

結論

Stack Overflow にまさにあるとおりです。

結論(具体的に)

多少はしょりながら結論を説明します。なお、以下はすべて sudo で実行することを前提としています。

1. pg_lsclusters を実行して現状を確認する。

# pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
10  main    5432 down   postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log

上記の結果の、VerClusterLog file の値を後で使います。Statusdown となっているので psql でエラーが出るのは当然と言えます。

2. cluster を start させてみる

以下のコマンドで cluster を start させてみます。もし start できたならば psql できますのでここで終わりです。が、おそらく何らかのエラー(例えば以下のような)が吐き出されるでしょう。

実行するコマンドのオプションには「1.」の VerCluster の値を用います。最後に start を付与します。

# pg_ctlcluster 10 main start
Job for postgresql@10-main.service failed because the service did not take the steps required by its unit configuration.
See "systemctl status postgresql@10-main.service" and "journalctl -xe" for details.

3. エラーログを確認する

「2.」でのエラーの詳細がエラーログに書き出されています。エラーログの場所は「1.」の Log file の場所です。

# cat /var/log/postgresql/postgresql-10-main.log

ログがすべてを物語っています。

  • 例1
2018-10-26 20:24:55.208 GMT [12282] LOG:  unrecognized configuration parameter "listen_address" in file "/etc/postgresql/10/main/postgresql.conf" line 59
2018-10-26 20:24:55.208 GMT [12282] FATAL:  configuration file "/etc/postgresql/10/main/postgresql.conf" contains errors
pg_ctl: could not start server
Examine the log output.
  • 例2
2018-10-27 05:43:45 JST [8391-1] FATAL:  private key file "/etc/ssl/private/ssl-cert-snakeoil.key" has group or world access
2018-10-27 05:43:45 JST [8391-2] DETAIL:  File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root.

「例1」では postgresql.conf の書式に誤りがあることが指摘されています。「例2」では鍵ファイルのパーミッションが適切でないことが指摘されています。

4. エラーを修正して再度 cluster を start させる

「3.」のエラーを修正したら PostgreSQL のサービスを再起動し、再び pg_ctlcluster コマンドを実行しましょう。

# pg_ctlcluster 10 main start

特にエラーが吐き出されなければ、これで psql コマンドなどが通常通り使えるようになったはずです。

混乱させられる点(繰り返します)

再インストールやサービスのリスタートをしても、見た目は正常に動いているように見えてしまう*3のがとても厄介でめちゃくちゃハマりました*4

*1:環境や状況によってエラーメッセージは微妙に違います

*2:サービスは起動する

*3:サービスは起動する

*4:dry-run コマンドってないんでしょうか……

Powered by はてなブログ