使用 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
。\dx
pg_cron
只能安装在 ibmclouddb 数据库上。 -
运行以下命令为
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 作业;其他作业在队列中等待。