Note: Massimo Dal Zottoによる寄稿。
data/pg_options というオプションファイルには、 バックエンドがトレースメッセージを制御するための実行時用オプション やその他のバックエンドのチューニング用パラメータを記述します。バッ クエンドは SIGHUP シグナルを受け取ると、このファイルを再読み込みし ます。これにより、Postgres を再起動する ことなく、実行した状態のまま実行時用オプションを変更することができ ます。このファイルでは、トレース用パッケージ( backend/utils/misc/trace.c )で使用されるデバ ッグ用フラグやバックエンドの動作を制御するための数値パラメータとい ったオプションを指定できます。
バックエンドが起動する時、全ての pg_options は 0 に初期化されて います。新しいもしくは変更されたオプションは新しくバックエンドが 起動した時に読み込まれます。実行中のバックエンドでオプションの変 更を有効にするには、postmaster に対して SIGHUP シグナルを送信する 必要があります。そのシグナルは自動的に全てのバックエンドに対して 送信されます。特定のバックエンドに対してのみに SIGHUP を直接送信 することにより、そのバックエンドに対してのみ変更を有効にすること もできます。
エラーやデバッグ用メッセージを表示するために使用される関数は、 syslog(2) 機能を使用するように設定できるよ うになりました。標準出力や標準エラーに表示されるメッセージに時刻 とバックエンドのプロセス番号を前につけた、以下のように形式で出力 されます。
#timestamp #pid #message 980127.17:52:14.173 [29271] StartTransactionCommand 980127.17:52:14.174 [29271] ProcessUtility: drop table t; 980127.17:52:14.186 [29271] SIIncNumEntries: table is 70% full 980127.17:52:14.186 [29286] Async_NotifyHandler 980127.17:52:14.186 [29286] Waking up sleeping backend process 980127.19:52:14.292 [29286] Async_NotifyFrontEnd 980127.19:52:14.413 [29286] Async_NotifyFrontEnd done 980127.19:52:14.466 [29286] Async_NotifyHandler done
この形式はログファイルの可読性を向上させており、どのバックエンドが いつ何をしたのかがユーザに判るようになっています。データベースに 関するエラーや問題の検出を行なう、ログを監視する簡単な awk や perl スクリプトを作成することや、トランザクション時間に関する統計情報の 演算を行なうことがより簡単にできるようになっています。
メッセージを syslog に出力する時には LOG_LOCAL0 ファシリティが使 われます。syslog を使用するかどうかは syslog pg_option で設定でき ます。残念ながら、多くの関数は printf() を直 接使ってメッセージを標準出力や標準エラーに出力していますので、その 出力はsyslogに出力することも時刻情報を付与することもできません。 全ての出力を統一された形で制御できるように、全ての printf の呼び出 しを PRINTF に置換すること、また、もしそれが標準エラーへの出力であ る場合は EPRINTF に置換することですっきりすることはわかっているの ですが(まだ行なわれていません)。
pg_options ファイルの形式は以下の通りです。
# コメント オプション=整数値 # オプション に値を設定します。 オプション # オプション を 1 に設定します。 オプション+ # オプション を 1 に設定します。 オプション- # オプション を 0 に設定します。keyword は、 backend/utils/misc/trace.cで定義されたオプ ション名の省略形にもなることに注意して下さい。
Example 7-1. pg_options ファイル
例として、私が使用している pg_options を以下に示します。
verbose=2 query hostlookup showportnumber
現在、以下のオプションが定義されています。
大域的なトレースフラグ。以下の値を設定できます。
個別にトレースメッセージを出力可能にします。
全てのトレースメッセージを出力可能にします。
全てのトレースメッセージの出力を無効にします。
冗長性フラグ。以下の値を設定できます。
メッセージを出力しません。デフォルトの設定です。
情報メッセージを出力します。
より多くの情報メッセージを出力します。
問い合わせトレースフラグ。以下の値を設定できます。
問い合わせを表示しません。
問い合わせを 1 行に要約して表示します。
問い合わせ全体を表示します。
問い合わせ計画を表示します。
パーサの出力を表示します。
書き換えられた問い合わせを表示します。
パーサの統計情報を表示します。
プランナの統計情報を表示します。
エグゼキュータの統計情報を表示します。
今のところ使用していませんが、予定している機能を実現するために 必要となります。
ロックについてトレースします。
ユーザロックについてトレースします。
スピンロックについてトレースします。
通知関数についてトレースします。
今のところ使用していません。
今のところ使用していません。
ロックについてのトレースを行なうリレーションの最小 oid を 指定します。
非 0 の場合、ロックについてのトレース対象となるリレーショ ンの oid を指定します。
今のところ使用していません。
デッドロックを検出するためのタイマー。
syslog フラグ。以下の値を設定できます。
メッセージを標準出力/標準エラーに出力します。
メッセージを標準出力/標準エラーと syslog の両方に出力 します。
メッセージを syslog にのみ出力します。
ps_status においてホスト名の検索を有効にします。
ps_status においてポート番号を表示します。
通知後に pg_listener のロックを解除します。
pg_listener から重複したタプルを削除します。