クライアント接続時の障害

すでに動作しているpostmasterに対してクライアントアプリケーション から接続する際にも,さまざまな理由で失敗することがありえます. ここに挙げたエラーメッセージの例は,最近のバージョンのlibpqを ベースにしたクライアントのものです.(他のインターフェースライブラリ をベースにしたクライアントは,多少ちがう内容のメッセージを 表示するかもしれません)

connectDB() -- connect() failed: Connection refused
Is the postmaster running (with -i) at 'server.joe.com' and accepting connections on TCP/IP port
'5432'?
(connectDB() -- connect() の失敗: 接続が拒否されました
'server.joe.com'上で,postmasterは-iオプションつきで起動されていますか? またTCPのポート5432番で接
続を受け付けていますか?)
    
これは「話しかけるpostmasterを見つけられなかった」というよくある失敗. TCP/IPによる接続が行われようとしたときは上のようになりますし, あるいはUNIXドメインのソケットで,ローカルのpostmasterとの場合なら:
connectDB() -- connect() の失敗: そのようなファイル,あるいはディレクトリがありません
'localhost'上で,postmasterは起動されていますか? またUNIXソケット5432番で接続を受け付けています
か?)
    
のようになります. 最後の行は,クライアントがどちらを想定して接続を試みたのかを確認 するのに役立ちます. もし,本当にpostmasterがそこで動いていないので あれば,いま説明したようにカーネルエラーメッセージは "Connection refused(接続が拒否されました)" か, "No such file or directory(そのようなファイル,あるいはディレクトリは ありません)" のどちらかとなるのが典型的です. (特に理解しておいてください:この状況で出る "Connection refused" は, postmasterが一旦接続要求を受け取り,そして拒否したのでは ないということです.−−このようなケースでは後に 挙げる,別のメッセージが出力されます) 他の "Connection timed out(接続の待ち時間切れ)" のようなエラー メッセージは,ネットワーク接続ができていない,といったような,もっと 根本的な問題を指しているかもしれません.

No pg_hba.conf entry for host 123.123.123.123, user joeblow, database testdb
(ホスト 123.123.123.123, ユーザ名 joeblow, データベース testdb に対応するエントリが pg_hba.conf に
ありません)
    
これはpostmasterとのコンタクトが成功したにもかかわらず,相手が あなたと話をしたくなかった,というのが一番ありそうな状況です. メッセージが教えてくれている通り,コンフィギュレーションファイル pg_hba.confにアクセス権限のエントリがなかったため,postmasterは 接続要求を拒否したのです.

Password authentication failed for user 'joeblow'
(ユーザ名 joeblow に対するパスワード認証に失敗しました)
    
このメッセージは,postmasterとのコンタクトに成功し,そして相手も あなたと話をしたかった.なのに,pg_hba.confに指定された認証方法に パスするまでおあずけにされたことを示しています.自分で設定した パスワードを確認する,あるいはもしエラーの内容がKerberosかIDENTの どちらかの認証方法に触れているのなら,それらを調べてみてください.

FATAL 1:  SetUserId: user 'joeblow' is not in 'pg_shadow'
(致命的なエラー 1:  SetUserId: ユーザ 'joeblow' は 'pg_shadow' に存在しません)
    
これは認証の失敗に関する別のケースです:当該ユーザのために実行される べきcreate_userコマンドが,実行されていません.

FATAL 1:  Database testdb does not exist in pg_database
(致命的なエラー 1:  データベース testdb は pg_database に存在しません)
    
該当する名前のデータベースが,現在のpostmasterの制御のもとにありま せん.もしデータベース名を指定しなかった場合は(それが正しいものか そうでないのかにはかかわらず)Postgresのユーザ名がデフォルトでデータ ベース名となることに注意してください.