はじめに
pgAgentはPostgreSQLでジョブを実行、および管理するエージェントです。
Linuxではデーモンとして稼働し、通常はデータベースサーバ上で稼働させます。
今回、以下の環境でpgAgentをインストールし、ジョブを作成してみました。
- DBサーバ CentOS7.5、PostgreSQL
- クライアント Windows10、pgAdmin4
サーバ側は以下の投稿で構築したものを利用しています。
クライアントではpgAdmin4をインストールし、ジョブの作成を行います。
環境構築
早速、環境を構築していきます。
構築手順は以下のpgAdmin公式ページを参考にしています。
まず、pgAgentをyumでインストールします。
CentOS用のPostgreSQLのリポジトリパッケージをインストール済みであることが前提条件となります。
# yum -y install pgagent_11.x86_64
Installed:
pgagent_11.x86_64 0:4.0.0-1.rhel7.1
Dependency Installed:
boost-atomic.x86_64 0:1.53.0-27.el7 boost-chrono.x86_64 0:1.53.0-27.el7 boost-date-time.x86_64 0:1.53.0-27.el7 boost-filesystem.x86_64 0:1.53.0-27.el7
boost-regex.x86_64 0:1.53.0-27.el7 boost-system.x86_64 0:1.53.0-27.el7 boost-thread.x86_64 0:1.53.0-27.el7
Complete!
pgAdminを使用してpgAgentを管理する前に、データベースにpgAgentエクステンションを作成します。これにより"pgagent"スキーマにテーブルや他のオブジェクトが作成されます。
$ psql -U postgres
psql (11.2)
Type "help" for help.
postgres=# CREATE EXTENSION pgagent;
CREATE EXTENSION
pgAgentではpostgresユーザでパスワード不要でログインできるようにしておく必要があります。必要に応じて以下のpgpassの設定を実施します。
$ vi ~/.pgpass
127.0.0.1:5432:postgres:postgres:postgres
ホスト名:ポート番号:データベース名:ユーザ名:パスワード
$ chmod 600 ~/.pgpass
pgAgentを起動するため、DBサーバ上でpgAgentを以下のコマンドで起動します。
※これだとOS起動の度に実行することになるので、systemctlで登録しておくのが良いかと思います。
$/usr/bin/pgagent_11 hostaddr=127.0.0.1 dbname=postgres user=postgres
pgAdminを使ってジョブを作成する
ジョブを作成または管理するには、pgAdminを使用します。
ジョブの作成方法は以下の公式サイトを参考にしています。
まず、pgAdminを起動し、「pgAgent_Jobs」のコンテキストメニューから「Create」-「pgAgent Job...」を選択します。
※pgAdminのインストール方法は省略。
「Create - pgAgent Job」のダイアログが表示されますので、ここからジョブ、ステップ等を作成していきます。
まずは、「General」タブで、「Name」を適当に入力します。
次に「ステップ」タブでジョブが実行するステップを定義します。
新しいステップを追加するために、"+"をクリックし進めていくと以下のような画面になります。
今回はステップの名前だけ入力しています。
次に「Code」タブを選択し、実行するコードを入力します。
今回は何でもよかったので以下のようにコンソールに出力するだけのコードを書いています。
次に「スケジュール」タブからジョブを実行するスケジュールを決定します。
「General」タブではNameとStart(ジョブの開始)を入力します。
「Repeat」タブにて具体的にジョブをいつ実行するかを設定します。
以下は毎分実行するように指定しています。(Hoursとかは設定しなくても同じかもしれませんが)
後は「Save」して終わりです。
1分ごとに実行されていますので、ジョブの実行結果をpga_joblog、pga_jobsteplogテーブルで確認してみます。
postgres=# select * from pgagent.pga_joblog order by jlgstart desc limit 1;
jlgid | jlgjobid | jlgstatus | jlgstart | jlgduration
-------+----------+-----------+-------------------------------+-----------------
206 | 1 | s | 2019-05-11 10:01:03.607376+02 | 00:00:00.009261
(1 row)
postgres=# select * from pgagent.pga_jobsteplog order by jslid desc limit 1;
jslid | jsljlgid | jsljstid | jslstatus | jslresult | jslstart | jslduration | jsloutput
-------+----------+----------+-----------+-----------+-------------------------------+-----------------+-----------
206 | 206 | 1 | s | 0 | 2019-05-11 10:01:03.609999+02 | 00:00:00.005754 |
(1 row)
jlgstatus、jslstatusが"s"だと成功のようです。
今回はざっくりとお試しで使ってみただけなので、後日もう少し調べていきたいと思います。