使用 pg_cron 排程維護工作
pg_cron 是 PostgreSQL 擴充套件,提供資料庫內工作排程,讓您無需依賴外部工具即可自動執行 SQL 任務。 如需相關資訊,請參閱 pg_cron。
pg_cron 擴充套件支援 PostgreSQL 版本 13 及以上。
設定 pg_cron
-
以 admin 使用者身分登入 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)
- 排程 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 作業;額外的作業在佇列中等待。