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 オプション).が,やはり最後にはカーネルの上限を上げることに
なるでしょう.