使用 pg_cron 排程維護工作

pg_cron 是 PostgreSQL 擴充套件,提供資料庫內工作排程,讓您無需依賴外部工具即可自動執行 SQL 任務。 如需相關資訊,請參閱 pg_cron

pg_cron 擴充套件支援 PostgreSQL 版本 13 及以上。

設定 pg_cron

  1. 以 admin 使用者身分登入 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)
  • 排程 VACUUM 作業在每個星期天早上 4:00 執行。
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 作業;額外的作業在佇列中等待。