postgres — PostgreSQLデータベースサーバ
postgres [option...]
postgresは、PostgreSQLのデータベースサーバです。
クライアントアプリケーションがデータベースに接続するためには、稼働中のpostgresインスタンスに(ネットワークを介して、またはローカルで)接続する必要があります。
その後、postgresは接続を取り扱うために別のサーバプロセスを開始します。
1つのpostgresインスタンスは常に1つのデータベースクラスタのデータを管理します。
データベースクラスタとは、共通のファイルシステム領域(「データ領域」)に格納されているデータベースの集まりのことです。
1つのシステム上で、同時に複数のpostmasterインスタンスを実行することは可能ですが、それらは異なるデータ領域と、異なる接続ポート(下記参照)を使用する必要があります。
postgresは、その起動時にデータ領域の場所を知らなければなりません。
その場所を-Dオプションまたは環境変数PGDATAによって指定しなければなりません。デフォルト値はありません。
通常、-DまたはPGDATAは、initdbで作成されたデータ領域ディレクトリを直接指し示します。
他のファイルレイアウトを取ることもできます。19.2を参照してください。
デフォルトでは、postgresはフォアグラウンドで起動し、ログメッセージを標準エラー出力に出力します。
実運用では、postgresアプリケーションはおそらくマシン起動時にバックグラウンドで起動されるはずです。
またpostgresはシングルユーザモードで呼び出すこともできます。
このモードは、主にinitdbによる初期化処理の中で使用されます。
これを、デバッグのためや障害からの復旧時に使用することもできます。
実際には発生するはずのプロセス間通信やロック処理が発生しませんので、シングルユーザモードがサーバのデバッグに必ずしも適したものではないことに注意してください。
シェルからシングルユーザモードで起動された場合、ユーザは問い合わせを入力できます。
結果は画面上に表示されますが、その形式はエンドユーザ向けではなく開発者向けのものです。
シングルユーザモードでは、セッションユーザはIDが1のユーザと設定され、暗黙的にスーパーユーザの権限がこのユーザに与えられます。
このユーザは実際に存在していなくても構いません。
このため、シングルユーザモードはシステムカタログの偶発的な損傷などから手動で復旧するために使用することができます。
postgresには、下記のコマンドライン引数を指定できます。
オプションに関する詳細は第19章を参照してください。
また、設定ファイルを使用することによって、これらのほとんどのオプションについて入力する手間を省くことができます。
一部の(安全な)オプションは接続中のクライアントから設定することもできます。
その設定方法はアプリケーションに依存し、また、そのセッションでのみ適用されます。
たとえば、環境変数PGOPTIONSを設定すると、libpqに基づくクライアントはその文字列をサーバに渡します。
渡された文字列はpostgresコマンドラインオプションとして解釈されます。
-B nbuffersサーバプロセスが使用する共有バッファの数を設定します。 このパラメータのデフォルト値はinitdbにより自動的に決まります。 このオプションを指定することは設定パラメータshared_buffersを設定することと同等です。
-c name=value
指定の実行時パラメータを設定します。
PostgreSQLでサポートされる設定パラメータは第19章で説明します。
実際には、他の多くのコマンドラインオプションはこのようなパラメータへの代入を簡略化したものです。
-cは複数のパラメータを設定するために複数個使用することができます。
-C name
指定された名前の実行時パラメータの値を表示し、終了します、
(詳細については上の-cを参照してください。)
これは実行中のサーバに対して使用することができ、postgresql.confからの値やその起動時に与えられたパラメータにより変更された値を返します。
クラスタが起動した時に与えられたパラメータは反映されません。
このオプションは、pg_ctlなど、サーバインスタンスと連携する他のプログラムが設定パラメータ値を問い合わせることを意図しています。
ユーザ向けのアプリケーションでは代わりにSHOWやpg_settingsビューなどを使用すべきです。
-d debug-level
デバッグレベルを設定します。
大きな値が設定されているほど、より多くのデバッグ情報がサーバのログに出力されます。
値として設定できる範囲は、1から5までです。
特定のセッションで-d 0を渡すこともできます。
この設定により、親のpostgresプロセスのサーバログレベルがこのセッションに伝播されません。
-D datadirファイルシステム上のデータベース設定ファイルの場所を指定します。 詳細は19.2を参照してください。
-e
デフォルトの日付データ形式を「ヨーロッパ式」、つまりDMYの順番にします。
これにより、いくつかの日付出力形式でも、月の前に日が表示されるようになります。
詳細は8.5を参照してください。
-F
性能向上のためにfsync呼び出しを無効とします。
ただしこの場合、システムクラッシュ時にデータが損傷する危険性があります。
このオプションの指定は設定パラメータfsyncを無効にすることと同一です。
このオプションを使用する時は、事前に詳細な文書を一読してください。
-h hostname
postgresがクライアントアプリケーションとの接続を監視するホスト名、または、IPアドレスを指定します。
この値には、カンマで区切ったアドレスの一覧、あるいは、全ての利用可能なインタフェースを監視することを意味する*を指定することができます。
空の値を指定すると、IPアドレスをまったく監視しないことを意味します。
この場合、サーバへの接続には、Unixドメインソケットのみが使用されます。
デフォルトではlocalhostのみを監視します。
このオプションを指定することは設定パラメータlisten_addressesを設定することと同等です。
-i
リモートクライアントからのTCP/IP(インターネットドメイン)経由の接続を可能とします。
このオプションを設定しない場合には、ローカルからの接続のみが使用可能となります。
このオプションは、postgresql.conf内のlisten_addressesを、あるいは-hを*に設定することと同じ意味を持ちます。
このオプションはlisten_addressesの全ての機能を実現することができないため廃止が予定されています。
通常は、直接listen_addressesを設定する方法をお勧めします。
-k directory
postgresがクライアントアプリケーションからの接続を監視するUnixドメインソケットのディレクトリを指定します。
ディレクトリをカンマで区切ったリストを値とすることもできます。
空の値を指定すると、Unixドメインソケットをまったく監視しません。この場合サーバに接続するためにはTCP/IPのみを使用することができます。
デフォルトでは、通常/tmpとなっていますが、これはコンパイルに変更できます。
このオプションを指定することは設定パラメータunix_socket_directoriesを設定することと同等です。
-lSSLを使用して、安全な接続を行います。 このオプションを使用するためには、PostgreSQLのコンパイル時にSSLを有効にする必要があります。 SSLの使用に関する詳細は18.9を参照してください。
-N max-connectionsこのサーバが受け付けるクライアント接続数の最大値を設定します。 このパラメータのデフォルト値はinitdbにより自動的に選択されます。 このオプションを指定することは設定パラメータmax_connectionsを設定することと同じ意味を持ちます。
-o extra-options
extra-optionsで指定されたコマンドライン形式の引数は、このpostgresプロセスにより開始される全てのサーバプロセスに引き渡されます。
extra-options内の空白文字は、それがバックスラッシュ(\)でエスケープされていなければ、引数を区切るものと解釈されます。
文字としてのバックスラッシュを記述するには、\\と書いてください。
複数の引数は、-oを複数回使うことでも指定できます。
このオプションの使用は非推奨です。
サーバプロセス用のすべてのコマンドラインオプションはpostgresコマンドラインで直接指定することができます。
-p port
クライアントアプリケーションからの接続をpostgresが監視するTCP/IPポート、またはローカルUnixドメインソケットファイルの拡張子を指定します。
デフォルトでは、環境変数PGPORT、PGPORTが設定されていない場合はコンパイル時に設定された値(通常5432)が使用されます。
デフォルトのポート以外を指定した場合には、コマンドラインオプション、またはPGPORTを使用して、全てのクライアントアプリケーションが同じポートを指定するようにしなければなりません。
-s各コマンドの終了時に時間情報や他の統計情報を表示します。 これはベンチマークやバッファ数の調整時の使用に適しています。
-S work-mem
内部的なソート処理やハッシュ処理で一時ディスクファイルに頼る前に使用するメモリ量を指定します。
設定パラメータ19.4.1のwork_memの説明を参照してください。
-V--versionpostgresのバージョンを表示し、終了します。
--name=value
指定した実行時パラメータを設定します。
-cの省略形式です。
--describe-config
このオプションは、サーバの内部設定変数、その説明、および、デフォルト値をタブ区切りのCOPY書式でダンプ出力します。
これは、管理用ツールでの使用を主目的として設計されました。
-?--helppostgresのコマンドライン引数に関する説明を表示し、終了します。
ここで説明するオプションは、主にデバッグ用に、場合によっては深刻な障害を受けたデータベースの復旧を補助するために使われます。 これらを運用状態のデータベースの設定として使用する理由はないはずです。 これらのオプションを説明しておくのは、PostgreSQLシステム開発者が利用するためです。 さらに、これらのオプションは、いずれも将来のリリースで予告なしに変更・廃止される可能性があります。
-f { s | i | o | b | t | n | m | h }
特定のスキャンと結合方式の使用を禁止します。
sはシーケンシャルスキャン、iはインデックススキャンを無効にします。
o、b、tはそれぞれ、インデックスオンリースキャン、ビットマップインデックススキャン、TIDスキャンを無効にします。
nはネステッドループ結合、mはマージ結合、hはハッシュ結合を無効にします。
シーケンシャルスキャンとネステッドループ結合は、完全に無効にすることはできません。
-fsオプションと-fnオプションは、単に「他の選択肢があるならば、これらの種類の計画を使わないようにする」ということをオプティマイザに指示するだけです。
-n
これはサーバプロセスが異常終了する問題をデバッグするためのオプションです。
このような状態では、他のすべてのサーバプロセスに対し、終了し、共有メモリやセマフォを再初期化するように通知するのが、通常の戦略です。
これはエラーが起きたサーバプロセスが、終了する前に、何かしら共有状態を破損したかもしれないからです。
このオプションは、postgresが共有データ構造を再初期化しないように指定します。
知識のあるシステムプログラマであれば、その後にデバッガを使用して共有メモリやセマフォの状態を検証することができます。
-O
システムテーブルの構造の変更を可能にします。
これはinitdbによって使われます。
-Pシステムテーブルの読み込みの際にシステムインデックスを無視します。 しかし、システムテーブルの更新の際にはインデックスを更新します。 破損したシステムインデックスから復旧する場合に有用です。
-t pa[rser] | pl[anner] | e[xecutor]
それぞれの主要なシステムモジュールに関連する問い合わせに対し、時間に関する統計情報を表示します。
このオプションは-sオプションと一緒に使うことはできません。
-T
これはサーバプロセスが異常終了する問題をデバッグするためのオプションです。
このような状態では、他のすべてのサーバプロセスに対し、終了し、共有メモリやセマフォを再初期化するように通知するのが、通常の戦略です。
これはエラーが起きたサーバプロセスが、終了する前に、何かしら共有状態を破損したかもしれないからです。
このオプションは、postgresが他のすべてのサーバプロセスに対しSIGSTOPシグナルを送信して、終了させるのではなく停止させることを指定します。
これによりシステムプログラマはすべてのサーバプロセスのコアダンプを手作業で収集することができます。
-v protocol特定のセッションで使われるフロントエンド/バックエンドプロトコルのバージョン番号を指定します。 このオプションは内部使用のみを目的としたものです。
-W seconds新規サーバプロセスが起動するとき、認証手続きが行われた後、指定した秒数の遅延が発生します。 サーバプロセスにデバッガを接続する時間を提供することが目的です。
以下のオプションはシングルユーザモードに対してのみ適用されます(シングルユーザモード参照)。
--singleシングルユーザモードを選択します。 これはコマンドラインで最初の引数でなければなりません。
databaseアクセスするデータベースの名前を指定します。 これはコマンドラインの最後の引数でなければなりません。 省略時は、デフォルトでユーザ名になります。
-Eすべてのコマンドをその実行前に標準出力にエコー表示します。
-jコマンド入力の終端文字として、単なる改行ではなく、セミコロンとそれに続く2つの改行を使用します。
-r filename
全てのサーバログ出力をfilenameに送ります。
このオプションは、コマンド行オプションとして指定された場合のみ、受け付けられます。
PGCLIENTENCODINGクライアントで使用される文字符号化方式のデフォルトです。 (クライアントは個別に変更することができます。) また、この値は設定ファイルでも設定可能です。
PGDATAデフォルトのデータディレクトリの場所です。
PGDATESTYLE実行時パラメータDateStyleのデフォルト値です。 (この環境変数の使用は廃止予定です。)
PGPORTデフォルトのポート番号です。 (設定ファイル内で設定するほうが好まれています。)
semgetやshmgetについて言及するエラーメッセージは、おそらく、十分な共有メモリやセマフォを提供できるようにカーネルを再構築する必要があることを示します。
詳細は18.4を参照してください。
ただし、shared_buffersの値を小さくしてPostgreSQLの共有メモリ消費量を低減する、max_connectionsの値を小さくしてセマフォ消費量を低減するといった対策を行うことで、カーネルの再構築を先延ばしすることができるかもしれません。
他のサーバが既に実行中であることを示すエラーメッセージに対しては、例えば以下のコマンドを使用して、注意深く検査しなければなりません。
$ps ax | grep postgres
もしくは
$ps -ef | grep postgres
どちらを使用するかは、システムによって異なります。 競合するサーバが稼働していないことが確実であれば、メッセージ内で示されたロックファイルを削除して、再度試してください。
ポートをバインドできなかったことを示すエラーメッセージの場合は、PostgreSQL以外のプロセスが既にそのポートを使用している可能性が考えられます。
また、postgresを停止して、すぐに同じポートを使う設定で再起動した場合、このエラーが出ることがあります。
この場合、オペレーティングシステムがポートを閉鎖するまで数秒待ってから再挑戦してください。
最後に、オペレーティングシステムが予約しているポート番号を指定した場合も、このエラーが発生することがあります。
例えば、Unixの多くのバージョンでは1024より小さいポート番号は「信頼できる(trusted)」とみなされており、Unixのスーパーユーザ以外アクセスできません。
ユーティリティコマンドpg_ctlを使って、postgresサーバを安全かつ簡便に起動とシャットダウンすることができます。
postgresを終了させるためにSIGKILLを使用するのは可能な限り避けてください。
SIGKILLで終了させると、postgresが終了前に保持しているシステムリソース(共有メモリやセマフォ)を解放しなくなることがあります。
システムリソースが解放されていないと、新しくpostgresを起動する時に問題が起こる可能性があります。
postgresサーバを正常に終了させるために、SIGTERM、SIGINT、SIGQUITを使用することができます。
SIGTERMは全てのクライアントが終了するのを待ってから終了させます。
SIGINTは強制的に全てのクライアントとの接続を切断します。
SIGQUITは適切なシャットダウンを行わないで、即時に終了させ、次回の起動時に復旧処理が行われます。
SIGHUPシグナルによりサーバの設定ファイルを再読み込みします。
また、SIGHUPを個々のサーバプロセスに送信することも可能ですが、通常は意味がありません。
実行中の問い合わせを中止するには、そのコマンドを実行しているプロセスにSIGINTシグナルを送信してください。
きれいにバックエンドプロセスを終了させるためには、対象プロセスにSIGTERMを送信してください。
また、これらの2つと同じ操作を行うSQLから呼び出すことができるものについては9.26.2内のpg_cancel_backendおよびpg_terminate_backendを参照してください。
postgresサーバでは、通常のクリーンアップを行わずに下位のサーバプロセスを終了させるためにはSIGQUITを使用します。
これはユーザが使用すべきではありません。
また、サーバにSIGKILLシグナルを送信するのは好ましくありません。
メインのpostgresはこれをクラッシュとして解釈するので、クラッシュからの標準的な復旧手続きの一環として、強制的に共通の親プロセスを持つpostgresプロセスを全て終了させます。
--オプションはFreeBSDやOpenBSDではうまく動きません。
代わりに-cを使用してください。
これは対象のオペレーティングシステムの不具合です。
もし修正されなければ、将来のPostgreSQLリリースで回避策を提供する予定です。
シングルユーザモードのサーバを起動するには、以下のようなコマンドを使用してください。
postgres --single -D /usr/local/pgsql/data other-options my_database
データベースディレクトリの正確なパスを-Dで指定します。パスを指定しない時は、必ず環境変数PGDATAを設定しておいてください。
また、作業対象とするデータベースの名前も指定してください。
通常、シングルユーザモードのサーバでは、改行をコマンド入力の終わりとみなします。 セミコロンについて、psqlにおけるような高度な機能はありません。 コマンドが複数行にわたる場合は、改行を入力する前にバックスラッシュを入力しなければなりません(最終行を除く)。 バックスラッシュとそれに続く改行は、いずれも入力コマンドから削除されます。 これは文字列リテラルやコメントの中においても当てはまることに注意して下さい。
ただし、コマンドラインスイッチ-jを使用した場合は、1つの改行ではコマンド入力の終わりとはみなされず、セミコロン、改行、改行というシーケンスがコマンド入力の終わりとなります。
つまり、セミコロンを入力し、そのすぐ後に続けて完全な空行を入力して下さい。
このモードでは、バックスラッシュと改行の組み合わせは特別扱いされません。
この場合も、文字列リテラルやコメント内に現れるこのようなシーケンスに対する高度な扱いはありません。
どちらの入力モードでも、コマンド入力終端の直前や一部でないセミコロンを入力した場合、それはコマンドを分割するものとしてみなされます。 コマンド入力終端を入力すると、それまでに入力した複数の文が、1つのトランザクションとして実行されます。
セッションを終了するには、EOF(通常Control+D)を入力します。 最後にコマンド入力終端を入力した後、何らかのテキストを入力している場合、EOFはコマンド入力の終端として扱われ、終了するにはもう一度EOFを入力する必要があります。
シングルユーザモードのサーバには、高度な行編集機能が用意されていないことに注意してください(例えばコマンド履歴機能はありません)。 またシングルユーザモードは、自動チェックポイントやレプリケーションなどのバックグラウンド処理をまったく行いません。
デフォルト値を使用してpostgresをバックグラウンドで起動するには、以下を入力してください。
$nohup postgres >logfile 2>&1 </dev/null &
例えば1234というポートを指定してpostgresを起動するには、以下を入力してください。
$postgres -p 1234
psqlを使用して上のサーバに接続するには、以下のように-pオプションでこのポートを指定してください。
$psql -p 1234
または環境変数PGPORTを設定してください。
$export PGPORT=1234$psql
指定の実行時パラメータを以下のいずれかで設定することができます。
$postgres -c work_mem=1234$postgres --work-mem=1234
どちらの形式でも、postgresql.conf内に設定されているwork_memの値を上書きします。
コマンドラインでは、パラメータ内のアンダースコア(_)をアンダースコアとしてもダッシュ記号(-)としても記載できることに注意してください。
おそらく短期間の実験という場合を除き、コマンドラインスイッチに依存するよりもpostgresql.conf内の設定を変更してパラメータを設定する方が実用的です。