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

注意事项

出于安全性考虑,您只能够通过系统函数来操作定时任务(系统提供了增加和删除定时任务的功能),普通用户对于cron.job(PG_CRON定时任务表)只有查看的权限。请您根据自己的需要选择函数的使用方法。

数据库中的定时任务都储存于默认postgres数据库中,但是您可以在其它多个数据库上执行定时任务查询。

PG_CRON默认开启,如果不能正常使用请提交工单开通。

开启或关闭插件

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

-- 开启pg_cron
CREATE EXTENSION 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
  • 查看任务执行记录
    SELECT * FROM cron.job_log;
    
     jlgid | jlgjobid   |  jlgstatus  | jlgrowcount  |        jlgruntime             
    -------+------------+-------------+--------------+-------------------------------
        2  |     1      |    2        |      1       | 2020-10-12 20:01:00.004602+08