すでに動作している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のユーザ名がデフォルトでデータ
ベース名となることに注意してください.