RDS PostgreSQL支持pg_cron定时任务插件。该插件基于cron的作业调度,语法与常规cron相同,您可以通过相应的SQL命令直接在数据库中配置定时任务。
功能简介
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;
说明仅高权限账号可以执行此命令。