pgAgentでジョブを定期実行する
Dave Page
PostgreSQL 開発コアメンバ / EnterpriseDB
はじめに
pgAgentはPostgreSQLのジョブ・スケジューラです。似たような機能を持つものにMicrosoftの SQL Server Agentがあります。pgAgentは、Windows, Linux, MacOS X, Solaris, FreeBSDなど、いろいろなOSで動作します。pgAgentを使うと、権限を持ったユーザが、単一または複数のSQLやシェルコマンド、バッチコマンドなどをスケジュール通りに実行できます。古いレコードをアーカイブしたり、日々のトランザクションをバッチ処理する、というようなメンテナンス用の処理を実行させるのが一般的な利用方法です。
通常は、pgAgentをデータベースが稼働している同じサーバにインストールして使いますが、複数のpgAgentを、データベースが稼働するサーバ以外のサーバにインストールする方がよい場合もあります。pgAdminを使うと、pgAgentをGUIで操作できます。pgAdminは英語、フランス語、ドイツ語、日本語、韓国語や中国語 (簡体、繁体) をはじめとする20以上の言語にローカライズされています。
pgAgentのインストール
pgAgentをインストールするには、PostgreSQLのWebサイトからソースコードをダウンロードします。WebサイトにはWindows、Linux、Mac OS Xようのビルド済みライブラリバイナリも用意されています。EnterpriseDBのPostgres Plus Standard ServerディストリビューションにもpgAgentは含まれています。
ソースからビルドする
ビルド済みのバイナリを使っている方は、この節を読む必要はありません。
特別な理由がない限り、ビルド済みバイナリを使ってpgAgentをインストールすることをお勧めします。ビルド用の環境を設定する、というような時間のかかることをしなくて済みます。pgAgentのコードはpgAdminのツールの一部として書かれているので、ソースからビルドするためにはpgAdminの使うライブラリが必要になりますし、pgAdminのビルド方法に書かれていることを読む必要もあります。
pgAgentのビルドに必要な環境が整ったら、cmakeを走らせてソースツリーの設定を行います。このとき、cmakeのデフォルトのオプションを変更するこめ、オプションにパスを指定する必要があるかも知れません。Makefileが生成されたら、makeを実行して実行ファイルをコンパイルします。
バイナリをインストールする
Postgres Plusのインストーラを使っている方は、この節を読む必要はありません。
Webサイトからダウンロードするか、ビルドをしてpgAgentのバイナリを手に入れたら、バイナリを指定の場所にインストールします。どの場所にインストールすべきかはOSによって異なります。Linuxの場合、たいていは/usr/local/bin以下にインストールします。
データベースの設定
Postgres Plusのインストーラを使っている方は、この節を読む必要はありません。
pgAgentを起動する前に、必ずデータベースの設定をしておいてください。pgAgentは設定情報とログをメンテナンスデータベース上のpgagentというスキーマに保存します。メンテナンスデータベースは、pgAgentが最初に接続をするデータベースです。pgAgentをセットアップ中に起こるありがちなミスは、pgagentスキーマをメンテナンスデータベースと異なるデータベースにインストールしてしまうことでしょう。そうすると、結果としてpgAgentがインストールされ、データベースがpgAgentの配下にあることを認識できなくなってしまいます。混乱を避けるためには、すべてにおいて同じデータベースを使うようにしてください。スキーマをインストールするデータベース、メンテナンスデータベースと、pgAgentの接続文字列にあるデータベースをすべて同じにするのです。
設定が終わったら、pgAgentを起動し、メンテナンスデータベース (典型的にはpostgresデータベースでしょう) のSQLツールを起動します。FileメニューからOpenを選び、pgAgentに同梱されているpgagent.sqlファイルを開きます。Runボタンをクリックし、pgAgentが利用するスキーマ(pgagentスキーマ)や様々なオブジェクトを作ります。 デフォルトでは、pgagentスキーマをインストールしたユーザ (DBA) のみがジョブを設定できます。他のユーザがジョブを設定できるようにするためには、 pga_exception, pga_job, pga_step, pga_schedule テーブルへの権限を設定します。そうすると、ほかのユーザがジョブやステップ、スケジュールを追加、削除、編集できるようになります。このようにして、DBAはpgAgentの操作をほかのユーザに委任できます。
Unixでデーモンを設定する
次に、pgAgentをシステム起動時に自動的に起動するように設定します。UNIXシステムで起動時にサービスを起動するようにするためには、起動スクリプトを作り/etc/init.dのような場所に設置します。詳しい方法については、システムのドキュメントを読んでください。UNIXシステムで動くpgAgentにはあまり多くのコマンドラインオプションがありません。多くのオプションはデバッグモード用です。
使い方:
/path/to/pgagent [オプション] <接続文字列>
- オブション:
- -f フォアグラウンドで起動 (ターミナルからは使わないこと)
- -t <ポーリングする時間を秒で指定 (10がデフォルト) >
- -r <接続が切れたときに再接続する時間を秒で指定 (10以上、デフォルトは30) >
- -s <ログファイルを指定 (指定がない時には標準出力 (STDOUT) にログを出力する>
- -l <ログレベル (ERROR=0, WARNING=1, DEBUG=2, デフォルトは0) >
接続文字列としては、PostgreSQLのlibpqが使う標準的な接続文字列を指定します。たとえば、pgAgentと同じサーバで動いているpostgres (pgagentスキーマのあるメンテナンスデータベース) というデータベースに、postgresユーザ (pgagentスキーマのレコードにSELECT, INSERT, UPDATEする権限を持つユーザ) 接続するためには以下のようなコマンドを発行します。
$ /path/to/pgagent hostaddr=127.0.0.1 dbname=postgres user=postgres
このようなコマンドを起動スクリプトに記述します。
WindowsServiceでサービスを設定する
Windows環境では、pgAgentをサービスとして設定できます。pgAgentがサービスとして動くので、サービスコントロールマネージャが起動や停止を適切に実行します。UNIXと同じコマンドラインオプションが使えますが、サービスを追加、削除するためにオブションが追加されています。
- 使い方:
- pgAgent REMOVE <サービス名>
- pgAgent INSTALL <サービス名> [options] <接続文字列>
- pgAgent DEBUG [options] <接続文字列>
- options:
- -u <ユーザ、またはドメイン/ユーザ>
- -p <パスワード>
- -d <表示名>
- -t <ポーリングする時間を秒で指定 (10がデフォルト) >
- -r <接続が切れたときに再接続する時間を秒で指定 (10以上、デフォルトは30) >
- -l <ログレベル (ERROR=0, WARNING=1, DEBUG=2, デフォルトは 0) >
サービスをインストールするためには、以下のようなコマンドを発行します (必要に応じてパスを変えて下さい) 。
"C:\Program Files\pgAgent\pgAgent.exe" INSTALL pgAgent -u postgres \ -p secret hostaddr=127.0.0.1 dbname=postgres user=postgres ★実際には1行のコマンドになります。
UNIXと同様、設定時にデータベースに接続するユーザはpgagentスキーマの全てのテーブルに対してSELECT、INSERT、UPDATEとDELETEを実行する権限を持っている必要があります。
pgAgentのサービスを起動するためには、コマンドラインから「net start pgAgent」と打つか、「サービス」コントロールパネルを使います。ログやエラーはアプリケーションのイベントログに記録されます。コマンドラインからDEBUGモードでpgAgentを起動すると、コマンドウインドウにログが出力されます。
セキュリティについて
pgAgentはとても強力なツールですが、次のようなセキュリティについての注意事項について知っておく必要があります。
データベースのパスワード
pgAgentの接続文字列にパスワードを含まないようにして下さい。UNIXシステムではpsコマンドの出力を見ることのできるユーザすべてにパスワードが見えてしまいます。Windowsシステムでは、パスワードがプレインテキストでレジストリに保存されます。代わりにlibpqの~/.pgpassファイルにpgAgentがアクセスするデータベースのパスワードを保存しておくようにします。具体的な方法についてはPostgreSQLのドキュメントを参照して下さい。
システム/データベースへのアクセス
pgAgentが走らせるすべてのジョブはpgAgentユーザの持つ権限を持って実行されます。SQLはpgAgentがデータベースの接続に使うユーザが実行し、バッチスクリプトやシェルスクリプトは、pgAgentデーモンまたはコマンドラインからpgAgentを起動したシステム上のユーザが実行します。つまり、ジョブを作ったり変更できるユーザを使って、設定を行うことが重要になります。デフォルトでは、pgAgentのデータベースを作ったユーザのみがこのようなユーザに該当します。このユーザは、たいていはPostgreSQLのスーパーユーザです。
ジョブ
ジョブは、ジョブで実行する1つまたは複数のスケジュールと、ジョブを定義するステップから構成されます。pgAdminで新しいジョブを設定するには、pgagentスキーマが作られたデータベースを表示し、ツリービューからJobsというノードを見つけます。pgAdminでオブジェクトを作るときと同じ要領で、Jobsノードの下にジョブを作ることができます。Jobsノードで右クリックし、New Jobという項目を選びます。ジョブを編集するには、右クリックしたうえでPropertiesを選びます。
ジョブの統計情報はpgAdminのメインウインドウのStatisticsタブから閲覧できます。この画面では、直前のジョブの開始時間と終了時間、終了時のステータスを閲覧できます。
ジョブを追加、編集する
ジョブはpgAdminのPropertiesダイアログで追加、編集します。ジョブの設定は本来とてもシンプルですが、ジョブに設定するステップとスケジュールによっては複雑になります。ジョブを設定するときには、ジョブの名前、ジョブが有効かどうか、ジョブのクラスやカテゴリを設定します。ジョブを特定のサーバで動かしたい場合には、オプションとしてサーバのホスト名を設定できます。ホスト名が空の場合 (たいていの場合は空のままでしょう) は、どのサーバでもジョブを実行できます。バッチスクリプト、シェルスクリプトを含むジョブでは、特定のサーバを指定する必要がある場合があります。また、コメントを追加することもできます。
注: あるサーバ上のジョブステップを実行したいとき、Host Agentの値に注意する必要があります。pgAgentがあるマシンで稼働していて、スケジュールされたデータベースに接続するとき、ホスト名を参照するために各エージェント上で以下のようなクエリを実行します。
# SELECT jagstation FROM pgagent.pga_jobagent;
Host Agentフィールドには、エージェントがクエリで参照するものと同じホスト名を設定して下さい。 利便性のために、スケジュールとステップは対応するJobダイアログから追加や削除を行えるようになっています。
スケジュールを追加、編集する
ジョブは1つか複数のスケジュールに従って実行されます。ジョブやジョブに設定されたスケジュールが待機状態に入ると、ジョブが次回実行する時間が計算されます。pgAgentのインスタンスは、データベースにアクセスし、ジョブの次回の実行時間を定期的に調べます。1分に最低1回データベースにアクセスするので、すべてのジョブは指定された時間の少なくとも1分以内に実行されます。実行すべきジョブが見つかると、pgAgentが次回起動したらすぐにジョブを実行します。その後、pgAgentは通常のスケジューリングプロセスに戻ります。 スケジュールには名前、有効かどうか、コメントといった情報が設定されています。加えて、スケジュールが実行される前に開始時間と日付が設定され、実行されると終了時間が設定されます。
スケジュールはcronと同じフォーマットで設定します。設定された時間や日時にしたがってスケジュールを実行します。たとえば、毎時5分にスケジュールを実行するには、Minute (分) のリストボックスに5と書きます。よりこまかくスケジュールを設定するには、他のボックスに値を記入します。たとえば、毎週月曜と木曜の12時5分と14時5分にスケジュールを実行する場合には、Minute (分) に5、Hours (時) に12と14、Week Days (曜日) にMonday (月曜) とThursday (木曜) を記入します。より細かく設定をするには、Month DaysチェックリストのLast Dayオプションを使います。このオプションを使うと、スケジュールを月の最後の日だけに実行できます。
時々、スケジュールに例外処理を追加したくなることがあるかもしれません。例えば、祝日にはスケジュールを実行したくない、というようなことがあるでしょう。このような設定をするには、例外としてスケジュールを実行しない日付と時間のリストを追加しておきます。すると、設定した日時のスケジュールを実行しません。
ステップを追加、編集する
ジョブは複数のステップから構成されます。SQLやシステムのバッチスクリプトやシェルスクリプトをステップとして登録でます。ジョブに登録されたステップは、名前の英数順に実行されます。 ステップはジョブのPropertiesダイアログを使ってジョブに追加するか、サブオブジェクトとして追加します。pgAdminのメインウインドウにあるPropertiesタブは選択中のステップの詳細を表示します。Statisticsタブはステップの実行時の情報、スクリプトのログやエラーを表示します。
ステップは以下のスクリーンショットにあるような情報を含みます。どのような情報があるのかは画面を見れば分かるはずです。Kind (種類) がSQLに設定した場合は、スクリプトを実行するデータベースを指定する必要があります (指定しなくても警告が出ないので注意) 。pgAgentの走っているサーバを指定するか、PostgreSQL 9.0から搭載されるホットスタンバイサーバを指定する場合は接続文字列を指定します。KindをBatchに設定した場合は、接続文字列は空にしておきます。On Errorオプションを使うと、ステップでエラーが起こったときにジョブのステータスにどう反映するかを選ぶことができます。
Definitionタブにあるテキストボックスにはステップスクリプトを記述します。SQLステップでは、一つか複数のSQL文を書きます。Batchステップでは、Windowsの場合は標準バッチファイル文を、*NIXでは、一行目に「 #!/bin/sh 」のようなシェバン (shebang) に続けてシェルスクリプトを書きます。
終わりに
pgAgentは、PostgreSQLユーザのための簡単に使え、かつ強力なジョブスケジューリングソリューションです。pgAgentを使うとメンテナンスやデータ処理のような定時処理を手軽に実行できます。pgAdminのGUIを使って操作できるのも魅力の一つです。