pg_cronによるメンテナンスジョブのスケジューリング
pg_cron は、 PostgreSQL 拡張で、データベース内のジョブスケジューリングを提供し、外部ツールに依存することなく SQL タスクを自動化できる。 細については、 pg_cronを参照してください。
pg_cron 拡張機能は、 PostgreSQL バージョン 13 以上でサポートされています。
pg_cron の設定
-
管理ユーザーとしてibmclouddbデータベースにログインします。
\c ibmclouddb -
pg_cron拡張機能を有効にする。create extension pg_cron; -
pg_cronがインストールされているか確認する。\dxpg_cronは ibmclouddb データベースにのみインストール可能で、現在のセキュリティ上の理由により、admin ユーザのみが使用できます。 -
以下のコマンドを実行して、
pg_cronに権限を付与する。select public.grant_pgcron_privileges();
ジョブのスケジューリング
cron.schedule_in_database() を使って仕事のスケジュールを立てる。
SELECT cron.schedule_in_database(
job_name text,
schedule text, -- cron expression
command text, -- SQL command to run
database_name text -- target database
);
- スケジュールジョブを表示するには
select * from cron.job;
- ステータススケジュールのジョブを表示するには
select * from cron.job_run_details;
- ジョブのスケジュールを解除する
ibmclouddb=> SELECT cron.unschedule(jobid);
unschedule
------------
t
(1 row)
使用例 pg_cron
- ibmclouddbデータベースにログインします:
\c ibmclouddb
pg_cron拡張機能を有効にする:
ibmclouddb=> \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(1 row)
ibmclouddb=> create extension pg_cron;
CREATE EXTENSION
ibmclouddb=>
ibmclouddb=> \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------
pg_cron | 1.6 | pg_catalog | Job scheduler for PostgreSQL
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
pg_cronに特権を与える:
ibmclouddb=> select public.grant_pgcron_privileges();
grant_pgcron_privileges
--------------------------------
Granted permission on pg_cron
(1 row)
- 毎週日曜日の午前4:00にVACUUMジョブを実行するようにスケジューリングする。
SELECT cron.schedule_in_database(
job_name text,
schedule text, -- cron expression
command text, -- SQL command to run
database_name text -- target database
);
ibmclouddb=> SELECT cron.schedule_in_database('weekly-vacuum', '0 4 * * 0', 'VACUUM', 'test');
schedule_in_database
----------------------
35
(1 row)
- スケジュールされたジョブを表示するには
ibmclouddb=> select * from cron.job;
jobid | schedule | command | nodename | nodeport | database | username | active | jobname
-------+-----------+---------+-----------+----------+----------+----------+--------+---------------
35 | 0 4 * * 0 | VACUUM | localhost | 5432 | test | admin | t | weekly-vacuum
(1 row)
- ジョブ実行の詳細を見るには
ibmclouddb=> select * from cron.job_run_details;
jobid | runid | job_pid | database | username | command | status | return_message | start_time | end_time
-------+-------+---------+----------+----------+---------+-----------+----------------+-------------------------------+-------------------------------
35 | 85 | 33810 | test | admin | VACUUM | succeeded | VACUUM | 2025-09-23 15:48:00.013814+00 | 2025-09-23 15:48:01.29763+00
- ジョブのスケジュールを解除する
ibmclouddb=> SELECT cron.unschedule(35);
unschedule
------------
t
(1 row)
cron.job_run_detailsのレコードは自動的にはクリーニングされないが、cronジョブをスケジュールできるすべてのユーザーは、自分の cron.job_run_details レコードを削除する権限も持っている。
ibmclouddb=> SELECT cron.schedule('delete-job-run-details', '0 12 * * *', $$DELETE FROM cron.job_run_details WHERE end_time < now() - interval '7 days'$$);
-
pg_cronジョブは、スケーリング、フェイルオーバー、スイッチオーバーなどのアクティビティの結果としてデータベースが再起動するたびに終了します。 リトライの仕組みがないため、ジョブは自動的に再開されない。 次に予定されている実行を待つか、必要に応じてスケジュールを調整しなければならない。 -
最大5つのpg_cronジョブが同時に実行されます。