PostgreSQL11でジョブを実行、管理するpgAgentを設定してみた

# はじめに

pgAgentはPostgreSQLでジョブを実行、および管理するエージェントです。
Linuxではデーモンとして稼働し、通常はデータベースサーバ上で稼働させます。

今回、以下の環境でpgAgentをインストールし、ジョブを作成してみました。

- DBサーバ CentOS7.5、PostgreSQL
- クライアント　Windows10、pgAdmin4

サーバ側は以下の投稿で構築したものを利用しています。

- [CentOS 7にPostgreSQL11をインストールする](https://qiita.com/mkyz08/items/519bd8d6a7140c8ed57e)

クライアントではpgAdmin4をインストールし、ジョブの作成を行います。

# 環境構築

早速、環境を構築していきます。
構築手順は以下のpgAdmin公式ページを参考にしています。

- [Installing pgAgent](https://www.pgadmin.org/docs/pgadmin4/dev/pgagent_install.html)

まず、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を使用します。
ジョブの作成方法は以下の公式サイトを参考にしています。

- [Creating a pgAgent Job](https://www.pgadmin.org/docs/pgadmin4/dev/pgagent_jobs.html)
 
まず、pgAdminを起動し、「pgAgent_Jobs」のコンテキストメニューから「Create」-「pgAgent Job...」を選択します。
※pgAdminのインストール方法は省略。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/007e57eb-5fc3-d17b-ea5f-02ac3fc2eb92.png)

「Create - pgAgent Job」のダイアログが表示されますので、ここからジョブ、ステップ等を作成していきます。
まずは、「General」タブで、「Name」を適当に入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/f51440da-3eb1-4535-736e-6b1bf4a3cba8.png)

次に「ステップ」タブでジョブが実行するステップを定義します。
新しいステップを追加するために、"+"をクリックし進めていくと以下のような画面になります。
今回はステップの名前だけ入力しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/e1ee26b8-4ae7-b7c7-0b4f-9b2a612f20b0.png)

次に「Code」タブを選択し、実行するコードを入力します。
今回は何でもよかったので以下のようにコンソールに出力するだけのコードを書いています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/7d469824-c403-ee41-4b0d-9ba8f1e038af.png)

次に「スケジュール」タブからジョブを実行するスケジュールを決定します。
「General」タブではNameとStart（ジョブの開始）を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/35d8ba1a-650e-d009-666c-2f164cef8065.png)

「Repeat」タブにて具体的にジョブをいつ実行するかを設定します。
以下は毎分実行するように指定しています。（Hoursとかは設定しなくても同じかもしれませんが）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/bb72cdf6-1250-7255-0fca-7bddfa778466.png)

後は「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"だと成功のようです。

今回はざっくりとお試しで使ってみただけなので、後日もう少し調べていきたいと思います。


# 参考

- [Installing pgAgent](https://www.pgadmin.org/docs/pgadmin4/dev/pgagent_install.html)
- [Creating a pgAgent Job](https://www.pgadmin.org/docs/pgadmin4/dev/pgagent_jobs.html)