pg_cron
云原生数据仓库 AnalyticDB PostgreSQL 版的定时任务,支持在指定时间点执行批处理任务,如定时更新数据、备份数据或清理过期数据等,能够确保任务按照预定计划进行,避免遗漏或延迟,节省时间和人力成本,实现自动准确高效的任务执行,提升系统的效率和可管理性。
功能介绍
pg_cron是基于cron的作业调度插件,语法与常规cron相同,但pg_cron可以直接从数据库执行PostgreSQL命令。
定时任务主要分为定时计划和任务内容两个部分,具体介绍如下:
任务内容:用于指定该任务的具体内容,例如
VACUUM
。定时计划:用于规定任务的时间计划,例如每隔一分钟执行一次该任务。
定时计划使用标准的cron语法,语法如下:
┌───────────── 分钟 (取值为0 - 59) │ ┌────────────── 小时 (取值为0 - 23) │ │ ┌─────────────── 日期 (取值为1 - 31) │ │ │ ┌──────────────── 月份 (取值为1 - 12) │ │ │ │ ┌───────────────── 一周中的一天 (取值为0 - 6,0表示周日) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * * * * *
*
表示任意时间都可以运行。特定数字表示仅在这个时间运行。
,
表示分隔多个指定时间。-
表示时间范围。/
表示范围间隔。
创建或预览定时计划,请参见Crontab.guru。
示例如下:
每周六3:30 AM(GMT):
30 3 * * 6
每月1号和30号1:45 AM(GMT):
45 1 1,30 * *
每周一至周五的3:00 AM (GMT):
00 3 * * 1-5
从8点(GMT)到20点(GMT),每两小时整点:
0 8-20/2 * * *
注意事项
定时任务执行的时间是GMT或UTC时间,在使用时注意换算本地时间。
定时任务都储存于默认数据库postgres中,仅支持在数据库postgres中查询定时任务。
如果实例版本低于v6.3.6.0(AnalyticDB PostgreSQL 6.0版实例)、v7.0.3.0(AnalyticDB PostgreSQL 7.0版实例)或v2.0.0.1(AnalyticDB PostgreSQL版Serverless模式实例),本文中介绍的部分功能可能无法使用。如需使用本文中的所有功能,建议您升级实例内核小版本。升级实例的内核版本,请参见版本升级。
安装或删除插件
安装插件
pg_cron插件为默认安装插件,创建云原生数据仓库 AnalyticDB PostgreSQL 版实例后自动安装,无需手动安装。
删除插件
pg_cron插件目前存在内核功能依赖,无法删除。
添加定时任务
添加定时任务
语法如下:
SELECT cron.schedule('<定时计划>', '<定时任务>');
示例如下:
周六3:30 AM(GMT)删除过期数据:
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
每天的10:00 AM(GMT)执行函数test:
SELECT cron.schedule('0 10 * * *', 'select test()');
每分钟执行指定SQL:
SELECT cron.schedule('* * * * *', 'select 1');
每月1号和30号以及每周六和周日的2:30 AM(GMT)执行磁盘清理:
SELECT cron.schedule('30 2 1,30 * 6,0', 'VACUUM FULL');
指定定时任务名称
pg_cron现已支持添加定时任务名称字段,语法如下:
SELECT cron.schedule('<定时任务名称>', '<定时计划>', '<定时任务>');
示例如下:
每周六的10:00 AM(GMT)删除过期数据:
SELECT cron.schedule('Delete Expired Data','30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
每分钟执行指定SQL:
SELECT cron.schedule('Select Per Minute', '* * * * *', 'select 1');
每天的11:00 PM(GMT)对Postgres库执行VACUUM:
SELECT cron.schedule('Do Vacuum', '0 23 * * *' , 'VACUUM FULL');
指定定时任务执行数据库
低于1.4版本的pg_cron插件只能在安装插件的库执行定时任务,如果需要在其他库执行任务,需要直接操作cron.job
表,操作不方便且不安全。
1.4版本的pg_cron插件支持指定数据库和数据库账号执行定时任务。语法如下:
SELECT cron.schedule('<定时任务名称>', '<定时计划>', '<定时任务>', '<执行数据库>', '<数据库账号>', '<任务是否启用>');
'<执行数据库>'
:默认值为空,表示在postgres库执行。'<数据库账号>
:默认值为空,表示使用当前账号执行。'<任务是否启用>'
:默认值为true,表示启用该定时任务。
示例如下:
每天的11:00 PM(GMT)在dw库执行VACUUM:
SELECT cron.schedule('Do Vacuum', '0 23 * * *' , 'VACUUM FULL', 'dw');
每分钟让gp1234用户在dw库中执行指定SQL:
SELECT cron.schedule('Select Per Minute', '* * * * *', 'select 1', 'dw', 'gp1234');
每天的10:00 AM(GMT)让user1用户在dw库执行函数test:
SELECT cron.schedule('DO Function', '0 10 * * *', 'select test()', 'dw', 'user1', true);
更改定时任务
pg_cron提供了cron.alter_job
函数用于更改定时任务,语法如下:
SELECT cron.alter_job(<定时任务ID>, '<定时计划>', '<定时任务>', '<执行数据库>', '<执行用户>', '<任务是否启用>');
<定时任务ID>
:必填。定时任务ID为创建任务时自动生成的,可以通过查看cron.job
表的jobid
字段查看。其他参数:非必填,默认值为空,表示不更改。
示例如下:
任务ID为3的定时任务更改为每天11:00 AM(GMT)执行:
SELECT cron.alter_job(3, '0 11 * * *');
任务ID为1的定时任务更改为VACUUM:
SELECT cron.alter_job(1, null , 'VACUUM');
任务ID为2的定时任务的执行用户更改为gp1234:
SELECT cron.alter_job(2, null , null, null, 'gp1234');
查看定时任务执行信息
pg_cron新增了cron.job_run_details
表记录定时任务执行信息,您可以在该表中获取执行任务的详细情况。
定时任务较多时,可能会导致cron.job_run_details
表变得非常大,建议设置一个定时任务来删除该表。如果您不需要记录定时任务的执行情况,也可以提交工单联系技术支持修改cron.log_run
关闭记录信息。
示例如下:
查看失败的任务详情:
SELECT * FROM cron.job_run_details WHERE status = 'failed';
查看任务ID为1的定时任务执行详情:
SELECT * FROM cron.job_run_details WHERE jobid = '1';
查看定时任务列表
示例如下:
SELECT * FROM cron.job;
删除定时任务
通过任务名称删除定时任务,语法如下:
SELECT cron.unschedule('<定时任务名称>');
重要pg_cron允许创建重复的定时任务名称,当删除名称重复的定时任务时,只会删除任务ID较小的定时任务。
示例如下:
删除名为Do Vacuum的定时任务:
SELECT cron.unschedule('Do Vacuum');
通过定时任务ID删除定时任务,语法如下:
SELECT cron.unschedule(<定时任务ID>);
定时任务ID为创建任务时自动生成的,可以通过查看
cron.job
表的jobid
字段查看。示例如下:
删除定时任务ID为21的定时任务:
SELECT cron.unschedule(21);
相关文档
如果您想了解更多关于pg_cron的信息,请参见pg_cron。
如果您的实例是RDS PostgreSQL,请参见定时任务(pg_cron)。