PG_CRON是PostgreSQL 9.5及以上版本中基于CRON的一个简单的作业调度程序,它作为扩展程序在数据库中运行。PG_CRON的使用方式与常规CRON保持相同的语法,但它允许直接从数据库安排PostgreSQL命令。
注意事项
- 旧版本PG_CRON插件可能存在内存泄露风险,因此在使用PG_CRON插件之前,请将内核小版本升级至V1.1.19及以上版本。如果不使用PG_CRON插件,则无该风险。
- 出于安全性考虑,您只能够通过系统函数来操作定时任务(系统提供了增加和删除定时任务的功能),普通用户对于
cron.job
(PG_CRON定时任务表)只有查看的权限。请您根据自己的需要选择函数的使用方法。 - 数据库中的定时任务都储存于默认postgres数据库中,但是您可以在其它多个数据库上执行定时任务查询。
- 定时任务执行的时间是GMT时间,请注意换算时间。
- PG_CRON插件默认关闭,由于安全原因,暂时不支持用户手动创建。如有需要,请前往配额中心,在配额名称PolarDB PG pg_cron插件使用的操作列,单击申请,申请创建。
关闭插件
您可以在数据库中执行以下脚本关闭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