定时任务(pg_cron)

RDS PostgreSQL支持pg_cron定时任务插件。该插件基于cron的作业调度,语法与常规cron相同,您可以通过相应的SQL命令直接在数据库中配置定时任务。

您可以加入RDS PostgreSQL插件交流钉钉群(103525002795),进行咨询、交流和反馈,获取更多关于插件的信息。

功能简介

pg_cron是基于cron的作业调度插件,语法与常规cron相同,您可以通过相应的SQL命令直接在数据库中配置定时任务。更多详细信息请参见pg_cron

每一个定时任务主要包含定时计划定时任务内容两部分,例如每周六凌晨3:30(GMT)删除events表中过期数据的任务SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);中:

  • 定时计划30 3 * * 6,表示每周六凌晨3:30(GMT)执行。其使用标准的cron语法,其中*表示任意时间都运行,特定数字表示仅在这个时间时运行

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

    您可以在crontab.guru网站中创建和理解pg_cron定时任务的时间设置。

  • 定时任务内容$$DELETE FROM events WHERE event_time < now() - interval '1 week'$$,表示删除events表中的过期数据。

前提条件

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

    说明

    暂不支持RDS PostgreSQL 17。

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

    重要

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

    • 如果您的实例内核小版本低于20230830,且已经使用了此插件,则不影响使用。

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

  • 使用该插件前,需要将pg_cron添加到shared_preload_libraries运行参数值中。

    您可以使用RDS PostgreSQL的设置实例参数功能,在shared_preload_libraries运行参数值中添加pg_cron。例如,将运行参数值改为'pg_stat_statements,auto_explain,pg_cron'

使用须知

  • 定时任务执行的时间是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,请重新创建插件以利用新特性。需要注意的是,重新创建后原有的定时任务将会丢失。

  • 创建和删除pg_cron插件时,需要使用高权限账号,如何创建高权限账号请参见创建账号

使用方法

重要

pg_cron插件安装在cron.database_name参数指定的数据库(默认为postgres)中,该插件支持的命令仅限于在该特定数据库内执行。更多pg_cron插件的用法,请参见pg_cron

  • 创建插件

    CREATE EXTENSION pg_cron;
    说明
    • 仅高权限账号可以执行此命令。如何创建高权限账号请参见创建账号

    • 您可以执行SELECT * FROM pg_extension查看已安装的插件。

  • 创建定时任务

    SELECT cron.schedule('<定时任务名称>','<定时计划>', '<定时任务内容>');
    说明

    定时任务名称可以省略。定时任务设置成功后,返回定时任务ID。

    示例:

    -- 周六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_in_database('<定时任务名称>', '<定时计划>', '<定时任务内容>', '<指定数据库>');
    重要

    定时任务名称必须填写,未填写将导致任务创建失败。

    如果RDS PostgreSQL内核小版本小于20230530,请使用如下命令。不指定数据库时会使用cron.database_name参数指定的数据库(默认为postgres)。

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

    示例:

    SELECT cron.schedule_in_database('weekly-vacuum', '0 4 * * 0', 'VACUUM', 'some_other_database');
  • 查看当前定时任务列表

    SELECT * FROM cron.job;
  • 删除某个定时任务

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

    如果您指定了定时任务名称,也可以通过定时任务名称删除该任务。

    SELECT cron.unschedule('<定时任务名称>');

    示例:

    -- 通过定时任务ID删除
    SELECT cron.unschedule(43);
    -- 通过定时任务名称删除
    SELECT cron.unschedule('test01');
  • 删除插件

    DROP EXTENSION pg_cron;
    说明

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