pg_batch -- SQLジョブを並列実行します。
pg_batch [OPTIONS] FILENAME [args...]
オプション OPTIONS には以下を指定できます。 詳細はオプションを参照してください。
pg_batch は PostgreSQL のためのSQLジョブ実行プログラムです。 ジョブ一覧生成するスクリプトを SQL として外部から与え、その出力 SQL をジョブとしてシリアルまたはパラレルに実行します。
pg_batch は以下の処理を行います。
実用的なサンプルとして、vacuumdb の代わりに利用できる「VACUUMジョブ生成スクリプト」が添付されています。
test というデータベースに VACUUM ジョブを行うには、下記のコマンドを実行します。
$ pg_batch -d test $PGSHARE/contrib/pg_batch_vacuum.sql
すべてのデータベースに user-jobs.sql というジョブを行うには、下記のコマンドを実行します。
$ pg_batch --all user-jobs.sql
pg_batch では、下記のコマンドライン引数を指定できます。
PostgreSQLに接続するためのパラメータです。
また、このユーティリティは、他のほとんどの PostgreSQL ユーティリティと同様、 libpq でサポートされる環境変数を使用します。詳細については、環境変数の項目を参照してください。
pg_batch を使用する際には、以下の使用上の注意と制約があります。
pg_batch はシングルスレッドで動作しますが、複数のセッション (-j で数を指定) を使って非同期クエリでジョブSQLを実行するため、データベース・サーバで複数のジョブを並行して実行することができます。
ジョブ一覧取得スクリプトは、(query AS text, priority AS float8) の2列を含む複数の行を返却する SQL です。 "query" にはジョブとして実行する SQL を格納し、"priority" にはジョブの優先度が格納されるようスクリプトを設計します。 一般的には、ジョブ一覧取得スクリプトは以下のような形式になります。
SELECT query, priority FROM ジョブ一覧 WHERE 今日行うべき;
なお、"priority" のカラムは省略することもできます。省略された場合は全てのジョブの "priority" を「0」として扱います。
pg_batch は "priority" の大きい順にジョブを実行します。また、タイムアウトや Ctrl+C によりジョブがキャンセルされた場合に、 "priority" が「0」以上の未実行のジョブが存在すると警告します。 これらの事を考慮し、ジョブを実行する時の条件に応じて適切な "priority" を設定してください。 例えば、1日1回ジョブを実行する場合には、以下のようなルールで "priority" を設定します。
タイムアウトを設定した場合、タイムアウト時間を経過すると実行中のジョブをキャンセルし、未実行のジョブをスキップします。 この時、priority" が「0」以上の未実行のジョブが存在する場合は警告ログとして該当のジョブを表示します。 また、"priority" が「0」以上の未実行のジョブが存在した場合は pg_batch の終了値が「1」となります。 割り込み終了 (Ctrl+C) でのキャンセルも、タイムアウトと同じ扱いです。
pg_batch が出力するログのメッセージについて説明します。
INFO: DATABASE 'データベース名' (ジョブ数 jobs)
INFO: [ジョブ番号/全体ジョブ数] START: ジョブの開始日時(YYYY-MM-DD HH:MI:SS) INFO: [ジョブ番号/全体ジョブ数] QUERY: SQL
/* ジョブが成功した場合 */ INFO: [ジョブ番号/全体ジョブ数] SUCCESS: ジョブの終了日時(YYYY-MM-DD HH:MI:SS) (経過時間(HH:MM:SS)) /* ジョブが失敗した場合 */ WARNING: [ジョブ番号/全体ジョブ数] FAILED: ジョブの終了日時(YYYY-MM-DD HH:MI:SS) (経過時間(HH:MM:SS))
/* タイムアウト発生までに実行したジョブの内、失敗したジョブが存在しない場合 */ INFO: TIMEOUT タイムアウト発生日時(YYYY-MM-DD HH:MI:SS) /* タイムアウト発生までに実行したジョブの内、失敗したジョブが存在する場合 */ WARNING: TIMEOUT タイムアウト発生日時(YYYY-MM-DD HH:MI:SS)
/* 優先度の低いジョブの場合 (priority < 0) */ INFO: [ジョブ番号/全体ジョブ数] SKIP: SQL /* 優先度の高いジョブの場合 (priority >= 0) */ WARNING: [ジョブ番号/全体ジョブ数] SKIP: SQL
ERROR: エラーメッセージ
VACUUM ジョブは、autovacuum と同様の VACUUM の必要性判定を行い、デッドタプル数が多い または トランザクションID周回が間近に迫ったテーブルのみを VACUUM します。vacuumdb コマンドと比較すると、VACUUM が不要なテーブルには VACUUM を行わないことと、VACUUM を複数セッションから並行して実施できる利点があります。
autovacuum が VACUUM を行う閾値を 100% とすると、規定の設定では以下の図に示す判定を行います。 autovacuum の閾値については、PostgreSQL 文書「自動バキュームデーモン」を参照してください。
pg_batch のインストールは、標準のcontribモジュールと同様です。
pgxs を使ってビルドできます。
$ cd pg_batch $ make USE_PGXS=1 $ make USE_PGXS=1 install
pg_batch プログラム単体では、特にデータベースへの登録作業は必要ありません。 添付の「VACUUMジョブ生成スクリプト」を利用する場合には、対象のデータベースに対して $PGSHARE/contrib/pg_batch.sql を実行してください。
$ psql -d dbname -f $PGSHARE/contrib/pg_batch.sql