本文介绍如何通过RDS PostgreSQL提供的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插件已升级,如果您在升级内核小版本20201130之前已经在使用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;
- 查看任务执行记录
SELECT * FROM cron.job_log;