IBM Cloud Docs
使用 pg_cron 调度维护工作

使用 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 数据库上。

  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 作业;其他作业在队列中等待。