postmaster

Name

postmaster  --  Postgres のマルチユーザバック エンドの起動

Synopsis

postmaster [ -B nBuffers ] [ -D DataDir ] [ -N maxBackends ] [ -S ]
    [ -d DebugLevel ] [ -i ] [ -l ]
    [ -o BackendOptions ] [ -p port ] [ -n | -s ]
  

入力

postmaster では以下のコマンドライン 引数を受け付けます。

-B nBuffers

バックエンドサーバプロセスの起動時に postmaster がそのプロセスに割り当てる共有メモリディスクバッファの数を設 定します。 デフォルトは 64 バッファで、一つのバッファの大きさは 8K バイト (または src/include/config.h で設定された BLCKSZ の値)です。

-D DataDir

データベースディレクトリのツリーのルートとして使用するディレクトリ を指定します。-D が指定されていない場合、デフォルトのデータ ディレクトリは、環境変数 PGDATA の値となります。 PGDATA が設定されていなければ、使用されるディレクトリは $POSTGRESHOME/data となります。 環境変数の設定も、コマンドラインオプションの指定もなければ、 コンパイル時に設定されたデフォルトのディレクトリが使用されます。

-N maxBackends

この postmaster が起動できるバックエンドサーバプロセスの最大数 を設定します。デフォルトではこの値は 32 になっていますが、シス テムがプロセス数をサポートする限り最大 1024 まで設定可能です。 (-B の値が最低でも -N の値の 2 倍を要求することに注意して下さ い。ですので、-N の値を増加した場合は -B の値を増加させる必要 があります。) -N のデフォルト値と上限値は Postgres の構築時に変更可能です。(src/include/config.h を参照のこと。)

-S

postmaster プロセスがサイレントモード で立ち上がることを指定します。それは、ユーザの(制御している) tty と切り離し、自分自身のプロセスグループを立ち上げ、標準出力と標 準エラーを /dev/null にリダイレクトします。

postmaster と生成するバックエンドによって、通常生成される追跡 情報、及び、ログ出力は全て破棄されますので、このスイッチの使用 は問題解決を非常に困難にすることに 注意 して下さい。

-d DebugLevel

バックエンドサーバが生成するデバッグ出力の大きさを決定します。 DebugLevel が 1 の時、 postmaster は全ての接続トラフィックをトレースします。 レベルが 2 以上の場合、バックエンドプロセスからのデバッグ出力量を 増加させ、postmaster はバックエンド環境及びトラフィック処理を含むよ り多くの情報を表示するようになります。 postmaster の標準出力と標準エラーがログファイルにリダイレクトされ ていない限り、これらの出力は全て postmaster の制御用 tty に現れます。

-i

TCP/IP (インターネットドメイン) によるクライアントからの接続を可能 にします。 このオプションが無い場合、ローカル Unix ドメインソケット通信 のみが可能となります。

-l

SSL を使用した安全な接続を可能にします。-i オプ ションも付けなければなりません。 このオプションを使用するには、SSL を有効にしてコンパイルする必要 があります。

-o BackendOptions

BackendOptions で指定される postgres オプションはこの postmaster で起動される全ての バックエンドサーバプロセスに渡されます。 オプションの文字列内にスペースがある場合、文字列全体を引用符で 括らなければなりません。

-p port

フロントエンドアプリケーションからの接続を postmaster が監視する TCP/IP ポート またはローカル Unix ドメインソケットファイル拡張子を指定します。 デフォルトは、 PGPORT 環境変数の値、または PGPORT 環境変数が設定されて いない場合 Postgres がコンパイルされときに指定された (通常 5432)値となります。デフォルトのポート以外を指定した 場合、(psql を含んだ)全ての フロントエンドアプリケーションはコマンドラインオプションか PGPORT で同じポートを指定しなければなりません。

更に、バックエンドの異常終了を引き起こすような問題をデバッグする ために使用できる 2 つのコマンドラインオプションがあります。 これらのオプションはこういった時に postmaster の振舞いを制御しますが、 いずれのオプションも通常の操作を目的としているものでは ありません

このような状況に対しての通常の戦略は、他の全てのバックエンドに 対して、その動作を必ず終了するよう、そして、共有メモリとセマフォ を再初期化するように通知することです。 その理由はおかしくなっているバックエンドが終了する前に、 何らかの共有状態を変造する恐れがあるからです。

以下にこれらの特別の場合用のオプションを示します。

-n

postmaster は共有データ構成を再初期化しません。 知識のあるシステムプログラマはデバッガを使用して、共有メモリと セマフォ状況を調査することができます。

-s

postmaster は他の全てのバックエンドプロセスを SIGSTOP シグナルを送って中断します。ただし、停止はしません。 このことによって、システムプログラマが全てのバックエンド プロセスから手作業でコアダンプを収集できます。

出力

semget: No space left on device

このメッセージが現れたら ipcclean コマンドを実行しなければなりません。実行後、 postmaster を再起動します。引続きエラーが出るようであれば、 インストールの注意書きにしたがって、共有メモリとセマフォに ついてカーネルを構築する必要がありそうです。 一台のホスト上で postmaster の複数のインスタンスを立ちあげている場合、 特にカーネルの共有メモリやセマフォの限界が小さい場合、 共有メモリあるいはセマフォ(または両方)のパラメータを 拡張するようにカーネルを再構築しなければなりません。

Tip: Postgres の共有メモリ消費量 を低くするため -B を使用し、あるいは Postgres のセマフォ 消費を少なくする -N を使用することでカーネルの再構築を 先に延ばす事もできます。

StreamServerPort: cannot bind to port

このメッセージが現れたら、他に postmaster プロセスが同一のポートで実行されていないかどうかを確認しな ければなりません。 最も簡単な確認方法は、BSD ベースのシステムでは

% ps -ax | grep postmaster
	
、System V 系、HP-UX のような POSIX 準拠のシステムでは
% ps -e | grep postmaster
	
といったコマンドを実行することです。

他の postmaster プロセス が立ち上がっていないことが確認されたにも関らず、このエラー が引続き出るときは -p オプションを使って異なるポートを指定してみて下さい。 postmaster を停止し、同じポートですぐに再立ち上げした場合、このエラーが 出る場合があります。このときは、オペレーティングシステムが ポートを閉鎖するまで数秒待ってから単に再実行してください。 最後に、オペレーティングシステムが予約しているポート番号を 指定するとこのエラーがでます。例えば、Unix の多くのバージョン では 1024 より小さいポート番号は 信頼 されたポートとみなされ、Unix のスーパユーザ以外からアクセスでき ません。

IpcMemoryAttach: shmat() failed: Permission denied

ありそうな事として、他のユーザが postmaster プロセスを、共有リソースを取得済の同じポートで開始させよう として、その起動に失敗してしまった場合です。 Postgres の共有メモリキーは postmaster に割り付けたポート番号をもとにしているので、 このようなコンフリクトは一台のホストに複数のデータベースイ ンストレーションが存在する場合起こり得ることです。 もしも他に postmaster プロセスが現在走っていないなら(上記参照)、 ipcclean を実行してから、再トライしてみてください。 もし他の postmaster イメージ が走っていれば、それらのプロセスの所有者を発見して ポート番号の割当の調整および未使用の共有メモリセグメントの 削除といった対策が取れます。

説明

postmaster はフロントエンドとバックエンドプロセス間の通信を制御すると共に 共有バッファプールと SysV セマフォの配分を(試行設定指示のない 機械の場合)行います。 postmaster 自身はユーザと接触しないので、バックグランドプロセスとして 起動されなければなりません。

ある与えられた Postgres データベースインストレーションではある時点でたった一つだけの postmaster が走っていなければなりません。 ここでデータベースインストレーションとはデータベースのディレクトリと postmaster のポート番号を 言います。もし複数の postmaster を同じマシン上で動かす 場合はそれぞれが異なったディレクトリとポート番号を持って いなければなりません。

注意

可能であれば、 postmaster を終了させる時に SIGKILL使わないで下さい。 代わりに SIGHUPSIGINT、 または (kill(1) のデフォルトシグナル) SIGTERM を使うべきです。

% kill -KILL
   
またはその別の形式
% kill -9
   
では postmaster は、 強制終了以前に保持していたシステムリソース(例えば共有メモリ とかセマフォ)を開放することができません。 その代わりに、(前述のような)手作業で後始末する必要を省く ことができる SIGTERM を使用して下さい。

共有メモリ問題を扱う有用なユーティリティには、 ipcs(1)ipcrm(1) そして ipcclean(1)があります。

使用法

postmaster をデフォルト値で 起動するには以下を行ないます。

% nohup postmaster >logfile 2>&1 &
   
このコマンドは postmaster を デフォルトポート(5432)で起動します。 これが最も単純で一般的な postmaster の起動です。

postmaster を指定ポートで起動するには 以下を行ないます。

% nohup postmaster -p 1234 &
   
このコマンドは postmaster を ポート 1234 を通じて通信するように起動します。この postmaster に psql で接続するには
% psql -p 1234
   
または、環境変数 PGPORT の設定で
% setenv PGPORT 1234
% psql
   
のようにします。