pg_cronによるメンテナンスジョブのスケジューリング

pg_cron は、 PostgreSQL 拡張で、データベース内のジョブスケジューリングを提供し、外部ツールに依存することなく SQL タスクを自動化できる。 細については、 pg_cronを参照してください。

pg_cron 拡張機能は、 PostgreSQL バージョン 13 以上でサポートされています。

pg_cron の設定

  1. 管理ユーザーとしてibmclouddbデータベースにログインします。

     \c ibmclouddb
    
  2. pg_cron 拡張機能を有効にする。

     create extension pg_cron;
    
  3. pg_cron がインストールされているか確認する。

     \dx
    

    pg_cron は ibmclouddb データベースにのみインストール可能で、現在のセキュリティ上の理由により、admin ユーザのみが使用できます。

  4. 以下のコマンドを実行して、 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ジョブが同時に実行されます。