文档

定时任务(pg_cron)

更新时间:

RDS PostgreSQL支持pg_cron插件设置定时任务。

前提条件

  • 实例为RDS PostgreSQL 10或以上版本。

  • 实例内核小版本为20230830或以上。

    重要

    20230830内核小版本之前已支持此插件,但为了规范插件管理,提升RDS PostgreSQL在插件侧的安全防护,RDS计划在内核版本迭代中陆续对部分存在安全风险的插件进行优化,部分插件在低内核小版本无法创建,更多信息,请参见【产品/功能变更】RDS PostgreSQL限制创建插件说明

    • 如果您在20230830内核小版前已经使用了此插件,则不影响使用。

    • 如果您首次创建或重新创建此插件,请升级内核小版本到最新。

  • 使用该插件前,需要将pg_cron加入到shared_preload_libraries参数中。

    您可以使用RDS PostgreSQL参数设置功能,为shared_preload_libraries参数添加pg_cron。具体操作,请参见设置实例参数

背景信息

pg_cron是基于cron的作业调度插件,语法与常规cron相同,但它可以直接从数据库执行PostgreSQL命令。

每一个定时任务分为两部分:

  • 定时计划

    规定使用插件的计划,例如每隔1分钟执行一次该任务。

    定时计划使用标准的cron语法,其中*表示任意时间都运行,特定数字表示仅在这个时间时运行

     ┌───────────── 分钟: 0 ~ 59
     │ ┌────────────── 小时: 0 ~ 23
     │ │ ┌─────────────── 日期: 1 ~ 31
     │ │ │ ┌──────────────── 月份: 1 ~ 12
     │ │ │ │ ┌───────────────── 一周中的某一天 :0 ~ 6,0表示周日。
     │ │ │ │ │                  
     │ │ │ │ │
     │ │ │ │ │
     * * * * *

    例如每周六3:30am(GMT)的语法为:

    30 3 * * 6
  • 任务内容

    用户具体的任务内容,例如select * from some_table

注意事项

  • 定时任务执行的时间是GMT时间,请注意换算时间。

  • 定时任务都储存于默认数据库postgres中,但是您可以在其他数据库上查询定时任务。

  • pg_cron插件安装在cron.database_name参数指定的数据库中。cron.database_name参数值默认为postgres,如果您需要将pg_cron插件安装在其他数据库中,请修改cron.database_name参数值,详情请参见设置实例参数

  • RDS PostgreSQL 10、11、12在20201130内核小版本之前已支持pg_cron插件,但由于pg_cron插件已升级,推荐升级内核小版本,如果您在升级前已经在使用pg_cron,请重新创建插件来使用新的特性,但是重新创建后原有定时任务会丢失。

使用方法

重要

如下使用方法仅适用于内核小版本小于20230530的RDS PostgreSQL,如果您的内核版本大于等于20230530,则pg_cron插件的具体用法,请参见官方文档

  • 创建插件

    CREATE EXTENSION pg_cron;
    说明

    仅高权限账号可以执行此命令。

  • 删除插件

    DROP EXTENSION pg_cron;
    说明

    仅高权限账号可以执行此命令。

  • 执行某个任务

    SELECT cron.schedule('<定时计划>', '<定时任务>')

    示例

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

    SELECT cron.schedule('<定时计划>', '<定时任务>', '<指定数据库>')
    说明

    不指定数据库时会使用配置文件中的默认数据库postgres。

  • 删除某个任务

    SELECT cron.unschedule(<定时任务ID>)

    示例

    SELECT cron.unschedule(43);
  • 查看当前任务列表

    SELECT * FROM cron.job;
  • 本页导读 (1)
文档反馈