Chapter 12. トラブルシューティング

Table of Contents
postmaster起動の失敗
クライアント接続時の障害
デバッグ出力

postmaster起動の失敗

postmasterの起動に失敗する理由として,いくつかよく見うけられるものが あります.まずpostmasterのログファイルを確認するか,あるいは標準 (エラー)出力をリダイレクトせずにコマンドラインからpostmasterを 起動してください.postmasterがどんな文句を言っているのかを聞いてみま しょう.エラーが出てきても,そのメッセージ自身が適切な説明を与えて くれることがあります.しかしそうでないものもありますので,ここに 挙げておきます.

FATAL: StreamServerPort: bind() failed: Address already in use
        Is another postmaster already running on that port?
(致命的なエラー: StreamServerPort: bind()の失敗 : 既にアドレスが使われています.
        同じポートで他のpostmasterが動作していませんか?)
    
メッセージの意味は大抵の場合書かれているとおりで,すでに実行中の postmasterと同じポートで,誤ってふたつ目のpostmasterを立ち上げて しまったということです.しかし,もしカーネルのエラーメッセージが "Address already in use(既にアドレスが使われています)"−全く同じ表記 でないかもしれませんが−と違うなら,これはたぶん別の問題です.たとえば postmasterを特権ポートで立ち上げようとすると,こんなメッセージを出して くるでしょう.
$ postmaster -i -p 666
FATAL: StreamServerPort: bind() failed: Permission denied
        Is another postmaster already running on that port?
(致命的なエラー: StreamServerPort: bind() の失敗: パーミッションがありません
        同じポートで他のpostmasterが動作していませんか?)
    

IpcMemoryCreate: shmget failed (Invalid argument) key=5440001, size=83918612, permission=600
FATAL 1:  ShmemCreate: cannot create region
(IpcMemoryCreate: shmget の失敗 (引数が不適切です) key=5440001, size=83918612, permission=600
致命的なエラー 1:  ShmemCreate: 領域を獲得できませんでした)
    
このようなメッセージだと,カーネルの共有メモリサイズの上限がPostgresの 作成しようとしているバッファ領域に比べて足らない,ということになりそう です.(あるいは,カーネルにSystemVの共有メモリ機能がまったく 組み込まれていない,ということもありえます) 一時的な対応としてなら,通常よりも小さいバッファの設定でpostmasterを 起動してみることはできます(-Bオプション).しかし最終的にはカーネル の共有メモリの上限を上げざるを得ないでしょう.このメッセージは, postmasterを同じサーバ上でいくつも立ち上げようとしている状況で 必要になったメモリ空間全体が,カーネルの上限を超えた場合にも表示される ことがあります.

IpcSemaphoreCreate: semget failed (No space left on device) key=5440026, num=16, permission=600
IpcSemaphoreCreate: semget の失敗 (デバイスに空きがありません) key=5440026, num=16, permission=600
    
これはディスクスペースを使い切ってしまったということでは ありません.そうではなく,カーネルのSystemV セマフォの上限が,Postgresの作成しようとしている数に足らないという ことです.前項と同じように,今度はバックエンドの最大数を減らして postmasterを立ち上げれば,この問題に対処できると思います (-N オプション).が,やはり最後にはカーネルの上限を上げることに なるでしょう.