postgres — PostgreSQLデータベースサーバ
postgres
[option
...]
postgres
は、PostgreSQLのデータベースサーバです。
クライアントアプリケーションがデータベースに接続するためには、稼働中のpostgres
インスタンスに(ネットワークを介して、またはローカルで)接続する必要があります。
その後、postgres
は接続を取り扱うために別のサーバプロセスを開始します。
1つのpostgres
インスタンスは常に1つのデータベースクラスタのデータを管理します。
データベースクラスタとは、共通のファイルシステム領域(「データ領域」)に格納されているデータベースの集まりのことです。
1つのシステム上で、同時に複数のpostgres
インスタンスを実行することは可能ですが、それらは異なるデータ領域と、異なる接続ポート(下記参照)を使用する必要があります。
postgres
は、その起動時にデータ領域の場所を知らなければなりません。
その場所を-D
オプションまたは環境変数PGDATA
によって指定しなければなりません。デフォルト値はありません。
通常、-D
またはPGDATA
は、initdbで作成されたデータ領域ディレクトリを直接指し示します。
他のファイルレイアウトを取ることもできます。20.2を参照してください。
デフォルトでは、postgres
はフォアグラウンドで起動し、ログメッセージを標準エラー出力に出力します。
実運用では、postgres
アプリケーションはおそらくマシン起動時にバックグラウンドで起動されるはずです。
またpostgres
はシングルユーザモードで呼び出すこともできます。
このモードは、主にinitdbによる初期化処理の中で使用されます。
これを、デバッグのためや障害からの復旧時に使用することもできます。
実際には発生するはずのプロセス間通信やロック処理が発生しませんので、シングルユーザモードがサーバのデバッグに必ずしも適したものではないことに注意してください。
シェルからシングルユーザモードで起動された場合、ユーザは問い合わせを入力できます。
結果は画面上に表示されますが、その形式はエンドユーザ向けではなく開発者向けのものです。
シングルユーザモードでは、セッションユーザはIDが1のユーザと設定され、暗黙的にスーパーユーザの権限がこのユーザに与えられます。
このユーザは実際に存在していなくても構いません。
このため、シングルユーザモードはシステムカタログの偶発的な損傷などから手動で復旧するために使用することができます。
postgres
には、下記のコマンドライン引数を指定できます。
オプションに関する詳細は第20章を参照してください。
また、設定ファイルを使用することによって、これらのほとんどのオプションについて入力する手間を省くことができます。
一部の(安全な)オプションは接続中のクライアントから設定することもできます。
その設定方法はアプリケーションに依存し、また、そのセッションでのみ適用されます。
たとえば、環境変数PGOPTIONS
を設定すると、libpqに基づくクライアントはその文字列をサーバに渡します。
渡された文字列はpostgres
コマンドラインオプションとして解釈されます。
-B nbuffers
サーバプロセスが使用する共有バッファの数を設定します。 このパラメータのデフォルト値はinitdbにより自動的に決まります。 このオプションを指定することは設定パラメータshared_buffersを設定することと同等です。
-c name
=value
指定の実行時パラメータを設定します。
PostgreSQLでサポートされる設定パラメータは第20章で説明します。
実際には、他の多くのコマンドラインオプションはこのようなパラメータへの代入を簡略化したものです。
-c
は複数のパラメータを設定するために複数個使用することができます。
-C name
指定された名前の実行時パラメータの値を表示し、終了します、
(詳細については上の-c
を参照してください。)
これはpostgresql.conf
からの値やその起動時に与えられたパラメータにより変更された値を返します。
クラスタが起動した時に与えられたパラメータは反映されません。
これは、ほとんどのパラメータに対して実行中のサーバで使用できます。 ただし、実行時に計算された一部のパラメータ(例えばshared_memory_size、shared_memory_size_in_huge_pages、wal_segment_sizeなど)については、サーバをシャットダウンする必要があります。
このオプションは、pg_ctlなど、サーバインスタンスと連携する他のプログラムが設定パラメータ値を問い合わせることを意図しています。
ユーザ向けのアプリケーションでは代わりにSHOW
やpg_settings
ビューなどを使用すべきです。
-d debug-level
デバッグレベルを設定します。
大きな値が設定されているほど、より多くのデバッグ情報がサーバのログに出力されます。
値として設定できる範囲は、1から5までです。
特定のセッションで-d 0
を渡すこともできます。
この設定により、親のpostgres
プロセスのサーバログレベルがこのセッションに伝播されません。
-D datadir
ファイルシステム上のデータベース設定ファイルの場所を指定します。 詳細は20.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を設定することと同等です。
-l
SSLを使用して、安全な接続を行います。 このオプションを使用するためには、PostgreSQLのコンパイル時にSSLを有効にする必要があります。 SSLの使用に関する詳細は19.9を参照してください。
-N max-connections
このサーバが受け付けるクライアント接続数の最大値を設定します。 このパラメータのデフォルト値はinitdbにより自動的に選択されます。 このオプションを指定することは設定パラメータmax_connectionsを設定することと同じ意味を持ちます。
-p port
クライアントアプリケーションからの接続をpostgres
が監視するTCP/IPポート、またはローカルUnixドメインソケットファイルの拡張子を指定します。
デフォルトでは、環境変数PGPORT
、PGPORT
が設定されていない場合はコンパイル時に設定された値(通常5432)が使用されます。
デフォルトのポート以外を指定した場合には、コマンドラインオプション、またはPGPORT
を使用して、全てのクライアントアプリケーションが同じポートを指定するようにしなければなりません。
-s
各コマンドの終了時に時間情報や他の統計情報を表示します。 これはベンチマークやバッファ数の調整時の使用に適しています。
-S
work-mem
ソート処理やハッシュテーブル処理で一時ディスクファイルに頼る前に使用する基本的なメモリ量を指定します。
設定パラメータ20.4.1のwork_mem
の説明を参照してください。
-V
--version
postgresのバージョンを表示し、終了します。
--name
=value
指定した実行時パラメータを設定します。
-c
の省略形式です。
--describe-config
このオプションは、サーバの内部設定変数、その説明、および、デフォルト値をタブ区切りのCOPY
書式でダンプ出力します。
これは、管理用ツールでの使用を主目的として設計されました。
-?
--help
postgresのコマンドライン引数に関する説明を表示し、終了します。
ここで説明するオプションは、主にデバッグ用に、場合によっては深刻な障害を受けたデータベースの復旧を補助するために使われます。 これらを運用状態のデータベースの設定として使用する理由はないはずです。 これらのオプションを説明しておくのは、PostgreSQLシステム開発者が利用するためです。 さらに、これらのオプションは、いずれも将来のリリースで予告なしに変更・廃止される可能性があります。
-f
{ s | i | o | b | t | n | m | h }
特定のスキャンと結合方式の使用を禁止します。
s
はシーケンシャルスキャン、i
はインデックススキャンを無効にします。
o
、b
、t
はそれぞれ、インデックスオンリースキャン、ビットマップインデックススキャン、TIDスキャンを無効にします。
n
はネステッドループ結合、m
はマージ結合、h
はハッシュ結合を無効にします。
シーケンシャルスキャンとネステッドループ結合は、完全に無効にすることはできません。
-fs
オプションと-fn
オプションは、単に「他の選択肢があるならば、これらの種類の計画を使わないようにする」ということをオプティマイザに指示するだけです。
-O
システムテーブルの構造の変更を可能にします。
これはinitdb
によって使われます。
-P
システムテーブルの読み込みの際にシステムインデックスを無視します。 しかし、システムテーブルの更新の際にはインデックスを更新します。 破損したシステムインデックスから復旧する場合に有用です。
-t
pa[rser] | pl[anner] | e[xecutor]
それぞれの主要なシステムモジュールに関連する問い合わせに対し、時間に関する統計情報を表示します。
このオプションは-s
オプションと一緒に使うことはできません。
-T
これはサーバプロセスが異常終了する問題をデバッグするためのオプションです。 このような状態では、他のすべてのサーバプロセスに対し、SIGQUITシグナルを送信して、終了することが必要と通知するのが、通常の戦略です。 このオプションは、代わりにSIGABRTを送信し、その結果コアダンプファイルが生成されます。
-v
protocol
特定のセッションで使われるフロントエンド/バックエンドプロトコルのバージョン番号を指定します。 このオプションは内部使用のみを目的としたものです。
-W
seconds
新規サーバプロセスが起動するとき、認証手続きが行われた後、指定した秒数の遅延が発生します。 サーバプロセスにデバッガを接続する時間を提供することが目的です。
以下のオプションはシングルユーザモードに対してのみ適用されます(以下のシングルユーザモード参照)。
--single
シングルユーザモードを選択します。 これはコマンドラインで最初の引数でなければなりません。
database
アクセスするデータベースの名前を指定します。 これはコマンドラインの最後の引数でなければなりません。 省略時は、デフォルトでユーザ名になります。
-E
すべてのコマンドをその実行前に標準出力にエコー表示します。
-j
コマンド入力の終端文字として、単なる改行ではなく、セミコロンとそれに続く2つの改行を使用します。
-r
filename
全てのサーバログ出力をfilename
に送ります。
このオプションは、コマンド行オプションとして指定された場合のみ、受け付けられます。
PGCLIENTENCODING
クライアントで使用される文字符号化方式のデフォルトです。 (クライアントは個別に変更することができます。) また、この値は設定ファイルでも設定可能です。
PGDATA
デフォルトのデータディレクトリの場所です。
PGDATESTYLE
実行時パラメータDateStyleのデフォルト値です。 (この環境変数の使用は廃止予定です。)
PGPORT
デフォルトのポート番号です。 (設定ファイル内で設定するほうが好まれています。)
semget
やshmget
について言及するエラーメッセージは、おそらく、十分な共有メモリやセマフォを提供できるようにカーネルを再構築する必要があることを示します。
詳細は19.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.27.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
内の設定を変更してパラメータを設定する方が実用的です。