PostgreSQL 導入後 サーバに接続できないときの対処法

PostgreSQL をインストールしたばかりのとき、以下のようなエラーを目にすることがあります。

最新の PostgreSQL 11 を Ubuntu 18.04 にインストールした際にも発生することがあります。

$ psql
psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
psql: サーバに接続できませんでした: No such file or directory
      ローカルにサーバが稼動していますか?
      Unixドメインソケット"/var/run/postgresql/.s.PGSQL.5432"で通信を受け付けていますか?

このときの解決策として、PostgreSQLをアンインストールして環境を再構築するという記述が、しばしば見受けられます。

それで問題が解決すれば良いのですけれども、同じ問題が再発することがあります。

私の経験上、再インストールによって解決する問題は version を指定せずにパッケージマネージャから RDBMS をインストールして、正しいファイルや設定を読み込めていないことが多いので、そうでない場合にはあまり効果が期待できないです。

では、どうするかと言うと、経験上の判断から locale settings や cluster を見に行くことが多いです。




本題に入る前に、再現性を高めるために、いつものバージョン情報とインストール時の設定を掲載しておきます。

europa@Jupiter:~$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

$ psql -V
psql (PostgreSQL) 11.4 (Ubuntu 11.4-1.pgdg18.04+1)

導入時に行ったこと
参照: PostgreSQL: Linux downloads (Ubuntu)

$ sudo apt update && sudo apt -y upgrade
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)"-pgdg main | sudo tee /etc/apt/sources.list.d/pgdg.list
$ sudo apt update
$ sudo apt install postgresql-11  -y 
$ sudo passwd postgres && su - postgres

ここまででインストールに成功すると、冒頭 Connection refused error に遭遇することがあるかもしれません。

$ psql -p 5432 -h localhost
could not connect to server: Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections on port 5432? could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432?

psql: サーバに接続できませんでした: Connection refused
	サーバはホスト "localhost" (::1) で稼動しており、
	また、ポート 5432 で TCP/IP 接続を受け付けていますか?
サーバに接続できませんでした: Connection refused
	サーバはホスト "localhost" (127.0.0.1) で稼動しており、
	また、ポート 5432 で TCP/IP 接続を受け付けていますか?

まずはプログラムが動いているかどうか確認します。動作していないと、そもそも繋がりません。

$ service postgresql status
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor prese
   Active: active (exited) since Fri 2019-07-20 08:46:24 CST; 31min ago
 Main PID: 2178 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 1130)
   CGroup: /system.slice/postgresql.service

$ ps -ef|grep postgres
postgres 3950  2503  0 09:20 pts/0    00:00:00 grep postgres

プログラムが動作していることを確認できましたら、ソケット(プログラムとネットワークの接続口)の状態を見に行きます。

$ ss -tunelp|grep 5432

PostgreSQL に接続するために必要なところなので、きちんと動いていれば状態を確認できます。

ここの反応が今はありませんので、うまく行っていませんね。

ということで、現在のクライアント認証はどうなっているのかを見に行きます。

認証設定ファイルは "pg_hba.conf" という名前で保存されていることが伝統なので、探し出して現在の設定を把握します。

$ sudo find / -name pg_hba.conf
$

ところが、なぜか該当ファイルが見当たらないので、決め打ちで探しにいきます。

$ ls /etc/postgresql/
$ ls -a /etc/postgresql
.  ..  

そうすると、そこにあるはずのディレクトリが存在しません。

設定の問題以前に、設定ファイルそのものがありません。

ようやく、ここからが本題なのですけれども、必要なファイルが無いときは初期化したり、ツールで作成させると問題の解決につながることもあります。

$ sudo pg_createcluster 11 main --start
Creating new PostgreSQL cluster 11/main ...
/usr/lib/postgresql/11/bin/initdb -D /var/lib/postgresql/11/main --auth-local peer --auth-host md5
データベースシステム内のファイルの所有者は"postgres"となります。
このユーザがサーバプロセスも所有する必要があります。

データベースクラスタは以下のロケールで初期化されます。
  COLLATE:  C.UTF-8
  CTYPE:    C.UTF-8
  MESSAGES: C.UTF-8
  MONETARY: en_US.UTF-8
  NUMERIC:  en_US.UTF-8
  TIME:     en_US.UTF-8
そのためデフォルトのデータベース符号化方式はUTF8に設定されました。
デフォルトのテキスト検索設定はenglishに設定されました。

データベージのチェックサムは無効です。

既存のディレクトリ/var/lib/postgresql/11/mainの権限を修正します ... 完了
サブディレクトリを作成します ... 完了
max_connectionsのデフォルト値を選択します ... 100
shared_buffersのデフォルト値を選択します ... 128MB
selecting default timezone ... America/Chicago
動的共有メモリの実装を選択します ... posix
設定ファイルを作成します ... 完了
ブートストラップスクリプトを実行します ... 完了
ブートストラップ後の初期化を行っています ... 完了
データをディスクに同期します...完了

成功しました。以下のようにしてデータベースサーバを起動できます。

    pg_ctlcluster 11 main start

Ver Cluster Port Status Owner    Data directory              Log file
11  main    5432 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log

必要なファイルが揃いますと、設定ファイルも検索で見つかるようになりますし、RDBMS にも接続できるようになります。

$ sudo find / -name pg_hba.conf
/etc/postgresql/11/main/pg_hba.conf

$ su - postgres -c psql
Password: 

これでも、まだ接続できなかったらサーバ側の設定でポートが開放されているか、認証設定はどうなっているかを疑ってください。

まとめますと、インストールされた RDBMS の version と、プログラムの起動状態、クライアント認証、初期化の有無、そして IP アドレスやポートのサーバ設定などを順を追って確認していくと問題の原因に行き当たる確率が高いです。


[改訂新版]内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 (Software Design plus)

Leave a Reply

Your email address will not be published. Required fields are marked *