POSTMASTER UNIX 11/05/95 日本語PostgreSQL 日本語PostgreSQL

名称

postmaster - Postgres の postmaster を走らせます

形式

postmaster [ -B n_buffers][ -D data_dir][ -S ][ -a system]
[ -b backend_pathname][ -d [debug_level]][ -i ][ -n ]
[ -o backend_options][ -p port][ -s ]

説明

postmasterはフロントエンドとバックエンドのプロセス間の通信を管理し、また共有バッファプールとセマフォを(テストとセットの命令のないマシンで)確保します。postmasterはそれ自身ではユーザとやりとりしませんので、バックグラウンドプロセスとしてスタートするべきものです。ひとつのマシンではひとつの postmaster だけを走らせてください。

postmasterは次のコマンドラインオプションを取ります:

-B n_buffers

n_bufferspostmasterがスタートさせるバックエンドサーバプロセスのために確保と管理をする共有バッファの数を指定します。この値はデフォルトで 64 で、各バッファは 8k バイトになります。

-D data_dir

データベースディレクトリの木構造のルートとして使うディレクトリを指定します。このディレクトリは環境変数 PGDATA の値を使います。もし PGDATA がセットされていなければ、ディレクトリは $POSTGRESHOME /data になります。もし環境変数もセットされず、このコマンドラインオプションも指定されなければ、コンパイル時にセットされたデフォルトのディレクトリを使います。

-S

postmasterがサイレントモードで立ち上がることを指定します。つまり、ユーザの(制御している) TTY から離れ、自身のプロセスグループをスタートさせます。標準出力と標準エラー出力に表示されるメッセージはすべて破棄されますので、これはデバッグオプションと一緒に使ってはいけません。

-a system

フロントエンドアプリケーションがpostmasterプロセスに接続する際に使う認証システムsystem(pgintro(1) を参照してください)を使うかどうかを指定します。systemを指定することで、system を有効にします。もしくはno system

で無効にします。例えば、ユーザにKerberos認証を使うことを許すなら、 -a kerberos

を使ってください。認証されていない接続を拒否するには -a nounauth

を使ってください。このオプションはもう何の影響もありません。

-b backend_pathname

backend_pathnameは フロントエンドアプリケーションからの接続を受けた時にpostmasterが呼び出すPostgres のバックエンドサーバの実行ファイルへのフルパスです。このオプションが使われると、postmasterはその実行ファイルが置かれているディレクトリにこの実行ファイルを探そうとします。( これはpostmasterが呼び出されたパス名の下を探すことになります。もしパスが指定されなければ、環境変数 PATH に"postgres" という名前の実行ファイルを探します。

-d [debug_level]

オプション引数のdebug_levelはバックエンドサーバが生成するデバッグ出力の量を決めます。もしdebug_level が 1なら、postmaster はすべての接続のトラフィックをトレースするだけです。レベル 2以上では、バックエンドプロセスでデバッグが有効になり、postmaster はもっと情報を表示します。そこにはバックエンドの環境やプロセスのトラフィックが含まれます。もしバックエンドサーバがデバッグ出力を送るファイルが指定されなければ、この出力は親のpostmasterの制御 TTY に現れます。

-i

これは TCP/IP もしくはインターネットドメインソケット接続を有効にします。このオプションがないと、ローカルの UNIX ドメインソケット接続のみが可能となります。

-n , -s

-s と -nオプションは、バックエンドが異常終了した時のpostmasterのふるまいを制御します。どちらのオプションも通常の作業で使うことは想定していません。

この状況での普通の使い方は、すべてのバックエンドに対して、終了して共有メモリとセマフォを再初期化しなくてはならないことを知らせることです。気まぐれなバックエンドが終了する前に共有状態をおかしくしてしまうことがあるからです。

もし-sオプションが与えられると、postmasterはすべてのバックエンドプロセスに SIGSTOP を送って中断しますが、終了はさせません。これでシステムプログラマはすべてのバックエンドプロセスからのコアダンプを手で集めることができます。

もし-nオプションが与えられると、postmasterは共有データ構造を再初期化しません。知識のあるシステムプログラマはshmemdocプログラムで共有メモリとセマフォの状態を試してみることができます。

-o backend_options

backend_optionsで指定されたpostgres(1) のオプションが、このpostmasterに起動されたすべてのバックエンドサーバプロセスに渡されます。もしオプション文字列が空白を含んでいるのなら、文字列は全部引用符で囲まなくてはなりません。

-p port

postmasterがフロントエンドアプリケーションからの接続を待っているTCP/IP のポートもしくはローカル UNIX ドメインソケットのファイル拡張子を指定します。デフォルトでは 5432 または環境変数 PGPORT の値(セットされていれば)になります。もしデフォルトのポート以外を指定したら、すべてのフロントエンドアプリケーションユーザも、psql を含む libpq アプリケーションを起動する時に同じポートを(コマンドラインオプションもしくは PGPORT を使って) 指定しなくてはなりません。

警告

できるなら、postmasterを殺す時に SIGKILL使わないで ください。 SIGHUP、 SIGINT、 SIGTERM (kill(1) のデフォルトシグナル)を代わりに使ってください。今後postmasterが死ぬ前に持っているシステム資源 (例えば共有メモリやセマフォ) を解放するのを妨げるような

kill -KILL
    
や、その別の形式の
kill -9
    
を止めてください。これは下に述べるshmat(2) の問題を扱わなくてはならないようになることを防ぎます。


# デフォルト値を使って postmaster を起動します nohup postmaster >logfile 2>&1 &
このコマンドはデフォルトポート (5432) でpostmasterを起動し、"postgres" という実行ファイルを $PATH に検索します。これはpostmasterを起動する最も簡単で最もよくある方法です。

# 特定のポートと実行ファイル名でスタートします nohup postmaster -p -b /usr/postgres/bin/postgres &
このコマンドは1234 ポートで通信するpostmasterを立ち上げ、 "/usr/postgres/bin/postgres" にあるバックエンドを使うようにします。psql を使ってこのpostmasterに接続するには、psqlのコマンドラインから -p 1234 を指定するか、環境変数 PGPORT を 1234 にセットします。

参照

ipcs(1) ,ipcrm(1) ,ipcclean(1) ,psql(1) , postgres(1) ,

診断

FindBackend: could not find a backend to execute...

このメッセージを見たなら、postgresの実行ファイルがパスにありません。postgres があるディレクトリをパスに加えてください。

semget: No space left on device

このメッセージを見たら、ipccleanコマンドを走らせてください。そうした後にもう一度postmasterをスタートしてみてください。それでもだめなら、インストールノートに説明されるように、多分共有メモリとセマフォのためにカーネルを設定する必要があるでしょう。もし複数のpostmasterをひとつのホストで走らせたり通常のカーネルのデフォルトよりも共有メモリとセマフォのパラメータを減らしたりしたなら、もう一度戻って、共有メモリとセマフォを増やしてカーネルに設定しなくてはいけません。

StreamServerPort: cannot bind to port

もしこのメッセージを見たら、他のpostmasterが既に走っていないかどうかを確認してください。これを判別する最も簡単な方法は次のコマンドを使うことです

ps -ax | grep postmaster
    
BSD ベースのシステムでは
ps -e | grep postmast
    
(System V ライクな OS や HP-UX のような POSIX 準拠のシステムでも同様の文法です。)もし他のpostmasterプロセスが走っていなくてもまだこのエラーを受け取るようなら、 -p

オプションを使って違うポートを指定してみてください。postmasterを終了させてすぐに同じポートで再スタートすると、このエラーを受け取ることもあります。このような場合には、もう一度試す前に、オペレーティングシステムがそのポートを閉じるまで単純に数秒間待たなくてはなりません。最後に、オペレーティングシステムが予約されているとみなすポート番号を指定すると、このエラーを受け取るでしょう。例えば、多くのバージョンの UNIX が 1024 以下のポート番号を"信用できる" とみなして、UNIX のスーパーユーザのみにアクセスを許可しています。

IpcMemoryAttach: shmat() failed: Permission denied

ありがちな説明は、別のユーザが同じポートでpostmasterプロセスをスタートしようとして、それが共有資源を取得してそれから死んでしまったということです。Postgres の共有メモリのキーはpostmasterに割り当てられたポート番号に基づいていますので、ひとつのホストに 2つ以上のインストールがある時にはそのような衝突が起こることが多いです。もし他のpostmasterプロセスが現在走っていなければ(上記を参照してください)、ipccleanを走らせてもう一度試してください。もし他のpostmasterが走っているなら、そのプロセスの所有者を探して、ポート番号と使用していない共有メモリセグメントの除去についての問題の調和を取ってください。