紹介
pgAgentは、PostgreSQLデータベースのジョブをスケジュールするためのツールです。また、一般的に使用されるcron
よりも強力なスケジューリング機能を持っています。なぜなら、pgAgentはPostgresタスクを処理するために特に構築されているからです。例えば、pgAgentはバッチスクリプトやコマンドの繰り返しをせずに複数のステップをスケジュールすることができます。重要なのは、pgAdminがインストールされていても、pgAgentは独立してダウンロードする必要がある点です。
このチュートリアルでは、pgAgentをインストールし、データベースをpgAdminグラフィカルユーザーインターフェイス(GUI)でpgAgentを使用するように構成し、pgAgentをデーモンとして設定し、データベースのバックアップをスケジュールするジョブを設定します。
前提条件
このチュートリアルに従うには、次のものが必要です:
- Ubuntu 22.04サーバーが非rootの
sudo
を有効にしたユーザーとファイアウォールでセットアップされていること。これは、当社の初期サーバーセットアップガイドを読んで行うことができます。 - PostgreSQLがサーバーにインストールされています。これは、Ubuntu 22.04にPostgreSQLをインストールして使用する方法に従って設定できます。このガイドに従うと、新しいロールとデータベースを作成してください。pgAdminをPostgreSQLインスタンスに接続するためには、両方が必要です。
- pgAdminがインストールされ、アカウントが設定されています。これは、Ubuntu 22.04でサーバーモードでpgAdmin4をインストールおよび構成する方法に従って実行できます。
ステップ1 — pgAgentのインストール
前述のように、pgAdminをインストールするとpgAgentが自動的に構成されません。次のコマンドを実行して、ターミナルからapt install
とパッケージ名pgagent
を実行することで、pgAgentをインストールできます。
- sudo apt install pgagent
pgAgentをインストールしたら、次のステップに進んで、pgAdminでデータベースをpgAgentで使用するように構成します。
ステップ2 — データベースのpgAgent用の構成
準備が整ったら、pgAdminを設定して使用できます。pgAdminを介してデータベースをpgAgentの使用に設定できます。ウェブブラウザを開き、pgAdminアプリケーションに移動します。 http://your_domain。アカウントにログインしたら、左側のパネルのツリーコントロールに移動します。作成したsammyという名前のデータベースを見つけてリストを展開します。このリストから、Extensionsというオプションがあります。それを見つけたら、右クリックしてクエリツールを選択します:

pgAgentを使用するには、pgAdminでデータベースに拡張機能をロードする必要があります。これを行うには、次のクエリを記述して横向きの矢印▶をクリックし、実行コマンドを実行します:
- CREATE EXTENSION pgagent;
このステップは、次の例に示すように、クエリツール機能で表されています:

メッセージタブの下に、クエリが300ミリ秒で正常に返されました。という出力が表示されます。これにより、pgAgent拡張機能が正常に作成されたことが確認されます。
注意:データベースに適切なplpgsql
言語がロードされていない場合、次のエラーメッセージが表示されます:
OutputERROR: language "plpgsql" does not exist
HINT: Use CREATE EXTENSION to load the language into the database.
SQL state: 42704
これが発生した場合は、必要なpl/pgsqlプロシージャ言語をインストールするためにCREATE LANGUAGE
を実行する必要があります。次のコマンドを実行してこれをインストールできます。
- CREATE LANGUAGE plpgsql;
pl/pgsql言語をインストールしたら、下部にメッセージが表示され、Query returned successfully in 231 msec.のようなものが表示されます。その後、前のCREATE EXTENSION pgagent
クエリを再実行してください。
これらのクエリを実行した後、Extensionsの下にはpgagentとplpgsqlの2つのアイテムがリストされます:

A new item in the tree control on the left-hand side will appear called pgAgent Jobs. This signifies that pgAgent was successfully installed on your pgAdmin account. Next, you will set up pgAgent as a daemon so that it can run your jobs successfully.
注意:これらのアイテムがすぐに表示されない場合は、ブラウザのページをリフレッシュしてください。クエリが成功していれば表示されるはずです。
ステップ3 — pgAgentをデーモンとして設定
pgAdminを介してデータベースにpgAgentをインストールおよび構成したら、次にpgAgentをサーバー上のデーモンとして設定する必要があります。 デーモン は、バックグラウンドで連続プロセスとして実行され、サービスタスクを実行します。pgAgentはUnixシステム上でデーモンとして実行され、通常はデータベースサーバー自体で実行されます。
デーモンとしてpgAgentを設定するには、PostgreSQL接続文字列が必要です。ジョブをスケジュールするときに、プロセスが適切に実行されるようにするためのものです。この場合、PostgreSQL libpq接続文字列を設定しています。これはユーザー固有の文字列であり、特定の設定に接続します。PostgreSQL libpq接続関数については、PostgreSQLドキュメントで詳細を確認できます。
接続文字列には、ホスト名、データベース名、およびユーザー名の資格情報が含まれます。この例では、ホストはUnixドメインソケットを使用し、データベース名はsammy
、ユーザー名はsammy
です。この文字列は、デーモンを起動するためにpgagent
コマンドに追加されます。ターミナルで、次のコードを実行します:
- pgagent host=/var/run/postgresql dbname=sammy user=sammy
出力に何も表示されず、接続エラーメッセージも表示されない場合、接続文字列の設定が成功しています。
接続文字列を作成したら、pgAgentでジョブをスケジュールする準備が整います。
ステップ4 — pgAgentでのジョブのスケジューリング
pgAgentは、ジョブを実行および管理し、1つ以上のステップまたはスケジュールのジョブを作成できるスケジューリングエージェントとして機能します。例えば、ステップにはシェルスクリプト上の複数のSQLステートメントが含まれ、他のステップの後に順次実行されます。全体として、pgAgentを使用してジョブをスケジュール、管理、変更、または無効にすることができます。
このチュートリアルでは、pgAgentを使用して、週の各日の毎分データベースをバックアップするジョブを作成します。 sammyを右クリックし、pgAgentジョブを選択し、次に以下のように作成、pgAgentジョブ…を選択します。

一度これを行うと、作成 – pgAgentジョブというタイトルのプロンプトが表示され、一般タブで必要な情報の入力を開始できます。 この例では、名前をsammy_backupとし、ホストエージェントを指定しないことにします。 なぜなら、このジョブを任意のホストで実行できるようにしたいからです。 さらに、ジョブクラスを定期メンテナンスのままにします。 他にコメントを含めたい場合は、コメントセクションに自由に記入してください。

次に、ステップタブに移動します。 右上隅の+シンボルをクリックしてステップを作成します。 この例では、このステップの名前をstep1とします。 次に、オプションを展開するには、ゴミ箱アイコンの左側にある鉛筆をクリックします。 有効?ボタンはデフォルトでオンになっており、このステップが実行されるときに含まれることを示します。
種類オプションでは、SQLまたはバッチを選択できます。ここではバッチを選択しました。この例ではバッチを選択する理由は、これがデータベースのスケジュールされたバックアップに設定する適切なPostgreSQLコマンドを実行するからです。 SQLオプションは、生のSQLを実行するジョブをスケジュールするために利用できます。この場合、接続タイプにはローカルを選択して、ステップがローカルサーバーで実行されるようにしますが、お好みでリモートを選択して、任意のリモートホストを選択することもできます。リモートホストで行いたい場合は、接続文字列フィールドにその条件を指定する必要があります。 ステップ1に従った場合、接続文字列はすでに設定され、接続されています。
データベースフィールドでは、正しいデータベースが選択されていることを確認してください。ここではsammyが指定されています。 エラー時オプションでは、ステップの処理中にエラーが発生した場合のpgAgentの応答をカスタマイズできます。この場合、ステップの処理中にエラーが発生した場合に通知するために失敗を選択しました。さらに、追加の注記を追加したい場合は、コメントボックスに追加できます。
同じステップタブ内には、コードタブもあります。この例で選択したように、バッチを選択した場合は、コードタブに移動します。このタブに入ると、PostgreSQLコマンドを挿入するための空行があります。独自のオプションセットでこのバックアップコマンドを挿入してください。有効なコマンドであれば何でも受け付けられます。
このチュートリアルでは、pg_dump
コマンドを使用してPostgresデータベースsammyをバックアップします。このコマンドには、特定のユーザー名、データベース名、および--clean
フラグが含まれており、これはpg_dump
がデータベースオブジェクトを生成する前にデータベースオブジェクトを削除または「クリーニング」するのに役立ちます。--file
フラグでは、バックアップファイルが保存される正確な場所が指定されています。このステートメントの最後の部分date +%Y-%m-%d-%H-%M-%S
は、日付と複数のファイルを動的に生成して各バックアップごとにそれを追跡できるようにします。そうしないと、バックアップファイルは常に既存のものを上書きして保存します。この方法で、予定された任意の時間または日付の各バックアップファイルを追跡できます。
pg_dump --username=sammy --dbname=sammy --clean --file=/home/sammy/backup-`date +%Y-%m-%d-%H-%M-%S`.sql
注意: バックアップファイルを異なる場所に保存する場合は、選択したディレクトリへの絶対パスを使用してください。たとえば、通常~/
は/home/sammy/
のホームディレクトリを指しますが、この場合はpg_dump
が/home/sammy/
の絶対パスを要求するためです。
一度バックアップコマンドを追加したら、スケジュールタブに移動できます。 ステップを設定する場合と同様に、+記号をクリックしてスケジュールを追加し、その後、希望の名前を入力し、ご希望のオプションを展開する際にゴミ箱アイコンの隣にある鉛筆アイコンをクリックします。 一般タブの下に、この例では入力した名前があります。ここでは、スケジュール1です。再度、有効はデフォルトでオンになっており、スケジュールが適切に実行されるようになっています。 開始および終了オプションでは、スケジュールされたジョブの開始日時と終了日時を指定します。スケジュールされたジョブをテストするため、現在の時間が開始と終了の範囲内にあることを確認してください。お好みでコメントにメモを追加してください。
今、リピートタブに進んでください。ここでは、このスケジュールされたジョブを実行する頻度をカスタマイズできます。週、月、日付、時間、または分でできるだけ具体的に指定できます。選択しない場合、これはすべて選択と同じです。したがって、平日を空白のままにすると、スケジュールはすべての平日を考慮します。同様に、時間では、時間または分を空白のままにして、これはすべて選択と同じです。時間は cron スタイルの形式であり、したがって、この例ではバックアップを毎分生成するには、1時間のすべての分 (00から59) を選択する必要があります。これを示すために、分にはすべて選択を選択しました。すべての分がリストされますが、空白にすると同じ結果になります:
実行したくない日や時間がある場合は、より細かい時間スケジュールを作成するか、例外タブに移動して設定できます。
注意:スケジュールに基づいてジョブも実行されるため、いつでも変更されると、スケジュールされた実行時刻が再計算されます。これが発生すると、pgAgent は過去のスケジュールされた実行時刻の値をデータベースからポーリングし、通常その指定された開始時間の約1分後に開始します。問題がある場合は、pgAgent が再起動すると、設定した定期スケジュールに戻ります。
設定とスケジュールのカスタマイズが完了したら、保存ボタンを押してください。左側のツリーコントロールには、新しいpgAgentジョブが表示され、ジョブの名前が表示されます。この例では、sammy_backupがスケジュールおよびステップとともに表示されます:

pgAgentジョブが正常に作成されたので、次のステップでは、pgAgentジョブが正常に実行されているかどうかを確認する方法について学びます。
ステップ5 — pgAgentジョブの確認
データベースのバックアップファイルを毎分作成する予定のジョブが正常に動作しているかどうかは、いくつかの方法で確認できます。pgAdminでは、左側のツリーコントロールに移動し、sammy_backupをクリックします。そこから統計と表示されるタブに移動します。統計ページには、スケジュールされたジョブの各インスタンスが以下のようにリストされます:

統計情報はすぐに表示または更新されない場合があるため、別の場所に移動したり、ブラウザを更新する必要があるかもしれません。ジョブは一定の間隔で実行されるようにスケジュールされているため、これを考慮して日付や時間を設定してください。
次のコマンドを実行して、ジョブが機能していることを確認する場合は、コマンドラインからls ~
コマンドを実行できます。このチュートリアルでは、ステップ 4でpg_dump
コマンドを記述する際に、このホームディレクトリの正確な場所を設定します。
- ls ~
出力には、バックアップファイルが保存されるたびに、それぞれのインスタンスがリストされます。
ステップ 6 — pgAgent ジョブの修正、無効化、削除、および手動実行 (オプション)
pgAgent は、ジョブの修正や無効化に関して柔軟性を提供しています。pgAdmin を使用して、この場合はsammy_backupの特定の pgAgent ジョブに移動し、リストからプロパティオプションを選択します。ここから、ジョブを変更するために上部の鉛筆アイコンを押すことができます:

プロパティにいて、鉛筆アイコンを押すと、スケジュールタブに移動して、次のようにジョブを無効にできます:
また、左側のツリーコントロールから、pgAgentジョブを右クリックすると、ジョブを完全に削除するためにDELETE/DROP選択を選択できます。ジョブを手動で実行したい場合は、同じ手順を繰り返し、今度はリストからRUN NOW選択を選択します:

これらは、pgAgentを使用してジョブをスケジュールするためのいくつかの機能にすぎませんが、他にも多くの可能性があります。例えば、データベース内のすべてのユーザーとロールのバックアップを作成するジョブをスケジュールしたい場合、pg_dumpall --globals only
コマンドを使用することができます。バッチジョブでより複雑なスクリプトを使用することもでき、これについてはPostgreSQLウィキページで詳しく学ぶことができます。
結論
pgAgentは、日常の退屈ながらも必要なタスク、例えばデータベースの定期的なバックアップなど、さまざまなジョブをスケジュールするのに役立ちます。このツールをもっと使い慣れてきたら、複雑なスケジューリングが必要なマルチステップジョブやSQLタスクの作成も試すことができます。さらに詳しく学びたい場合は、pgAdminウェブサイトの公式pgAgentドキュメントを読んでみてください。