PG_CRON是PostgreSQL 9.5及以上版本中基于CRON的一个简单的作业调度程序,它作为扩展程序在数据库中运行。PG_CRON的使用方式与常规CRON保持相同的语法,但它允许直接从数据库安排PostgreSQL命令。

注意事项

  • 旧版本PG_CRON插件可能存在内存泄露风险,因此在使用PG_CRON插件之前,请将内核小版本升级至V1.1.19及以上版本。如果不使用PG_CRON插件,则无该风险。
  • 出于安全性考虑,您只能够通过系统函数来操作定时任务(系统提供了增加和删除定时任务的功能),普通用户对于cron.job(PG_CRON定时任务表)只有查看的权限。请您根据自己的需要选择函数的使用方法。
  • 数据库中的定时任务都储存于默认postgres数据库中,但是您可以在其它多个数据库上执行定时任务查询。
  • 定时任务执行的时间是GMT时间,请注意换算时间。
  • PG_CRON插件默认关闭,由于安全原因,暂时不支持用户手动创建。如有需要,请前往配额中心,在配额名称PolarDB PG pg_cron插件使用操作列,单击申请,申请创建。

关闭插件

您可以在数据库中执行以下脚本关闭PG_CRON。

-- 关闭 pg_cron
DROP EXTENSION pg_cron;

使用插件

每一个定时任务都分为定时计划和定时任务两个部分。定时计划规定了使用插件的计划,例如每隔一分钟执行一次该任务;定时任务是具体的任务内容,例如select * from some_table。插件提供了一个可选参数database,未指定该参数则默认配置postgres数据库。

以下函数是您可以执行的全部函数,其它操作视为非法操作。

-- 执行一个任务
SELECT cron.schedule('schedule', 'task')

-- 选定数据库执行任务 
-- 第三个参数不指定即为配置文件中数据库,默认postgres
SELECT cron.schedule('schedule', 'task', 'my_db')

-- 删除一个任务
SELECT cron.unschedule(schedule_id)

-- 查看当前任务列表
SELECT * FROM cron.job;

示例

  • 增加任务项
    -- 周六3:30am (GMT) 删除过期数据 
    SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
     schedule
    ----------
           42
    
    -- 每天的 10:00am (GMT) 执行磁盘清理
    SELECT cron.schedule('0 10 * * *', 'VACUUM');
     schedule
    ----------
           43
     
    -- 每分钟执行 指定脚本
    SELECT cron.schedule('* * * * *', 'select 1;');
     schedule
    ----------
           44
    
    -- 每个小时的 23分 执行 指定脚本
    SELECT cron.schedule('23 * * * *', 'select 1;');
     schedule
    ----------
           45
           
    -- 每个月的 4号 执行 指定脚本
    SELECT cron.schedule('* * 4 * *', 'select 1;');
     schedule
    ----------
           46

    其中,PG_CRON计划使用标准的CRON语法,*表示每个该时间运行,指定数字则表示仅在这个时间运行,如下所示。

     ┌───────────── 分钟 (0 - 59)
     │ ┌────────────── 小时 (0 - 23)
     │ │ ┌─────────────── 日期 (1 - 31)
     │ │ │ ┌──────────────── 月份 (1 - 12)
     │ │ │ │ ┌───────────────── 一周中的某一天 (0 - 6) (0 到 6 表示周末到下周六,
     │ │ │ │ │                   7 仍然是周末)
     * * * * *
  • 删除任务项
    -- 停止、删除一个任务
    SELECT cron.unschedule(42);
     unschedule
    ------------
              t
  • 查看当前任务
    SELECT * FROM cron.job;
    
     jobid | schedule   |  command  | nodename  | nodeport | database | username | active 
    -------+------------+-----------+-----------+----------+----------+----------+--------
        43 | 0 10 * * * |   VACUUM; | localhost |     5433 | postgres | test     | t