云数据库 PostgreSQL pg_cron

这篇说说pg_cron插件的使用方法,该插件可在PostgreSQL内使用cron表达式定时执行SQL命令,支持定时清理、统计等场景,并详述了环境准备、任务创建、修改、删除及运行记录查看等操作。 创建任务:使用cron.schedule函数,传入cron表达式和SQL命令即可创建定时任务。 查看与修改:通过cron.job表查看任务,使用cron.alter_job函数修改任务参数。 删除与记录:按任务名或ID使用c。

相关产品
云数据库 PostgreSQL 产品页,含版本规格、价格与购买入口。

这里说明 pg_cron 插件的简介及使用方法。

一、概述

pg_cron 是数据库内的定时任务调度插件,使用标准 cron 表达式定时执行 SQL 命令,可用于定时清理数据、定时统计、周期性维护等场景。

二、支持版本

PostgreSQL 版本 内核版本
PostgreSQL 10 v10.23_r1.20及以上
PostgreSQL 11 v11.22_r1.35及以上
PostgreSQL 12 v12.22_r1.37及以上
PostgreSQL 13 v13.22_r1.32及以上
PostgreSQL 14 v14.22_r1.42及以上
PostgreSQL 15 v15.14_r1.27及以上
PostgreSQL 16 v16.10_r1.22及以上
PostgreSQL 17 v17.10_r1.22及以上
PostgreSQL 18 v18.3_r1.6及以上

注意:说明:

注意:你可在控制台实例详情页查看当前实例的内核版本,或执行 SHOW tencentdb_version; 查询。

三、插件简介

pg_cron 在数据库内以后台进程方式运行,定时任务的调度信息存储在 cron.job 表中。任务到点执行时,pg_cron 会按任务中记录的命令在目标数据库执行,并将每次运行的结果记录到 cron.job_run_details 表中。

四、环境准备

pg_cron 是需要预加载的插件,使用前请确认实例已加载该插件:

1. 在控制台参数设置的 shared_preload_libraries 参数中勾选 pg_cron,保存后重启实例。参数设置方法可参考 设置实例参数。

2. 连接到 cron.database_name 参数指定的数据库(默认 postgres),执行以下语句创建扩展:

postgres=> CREATE EXTENSION pg_cron;CREATE EXTENSION

注意:说明:

注意:pg_cron 的扩展只能在 cron.database_name 参数指定的数据库中创建,否则会报错。

五、创建任务

以下示例先创建一张测试表,用于演示定时插入任务:

postgres=> CREATE TABLE cron_demo(ts timestamptz DEFAULT now());CREATE TABLE

六、基础创建

使用 cron.schedule 函数创建任务,第一个参数为 cron 表达式,第二个参数为要执行的命令:

postgres=> SELECT cron.schedule('* * * * *', 'INSERT INTO cron_demo DEFAULT VALUES;'); schedule———- 1(1 row)

返回值为任务 ID(jobid)。上述语句表示每分钟执行一次插入操作。

七、指定任务名创建

你也可以为任务指定一个名称,便于后续管理:

postgres=> SELECT cron.schedule('five-min', '*/5 * * * *', 'SELECT now();'); schedule———- 2(1 row)

八、cron 表达式说明

cron 表达式由5个字段组成,依次表示:分钟、小时、日期、月份、星期:

字段 取值范围 说明
分钟 0 – 59 每分钟用 *,每5分钟用 */5
小时 0 – 23 每小时用 *,凌晨2点用 2
日期 1 – 31 每天用 *,每月1号用 1
月份 1 – 12 每月用 *,1月用 1
星期 0 – 7 0和7均表示周日

九、查看任务

查询 cron.job 表查看已创建的任务:

postgres=> SELECT jobid, jobname, schedule, command, username, active FROM cron.job ORDER BY jobid; jobid | jobname | schedule | command | username | active——-+———-+————-+—————————————+———-+——– 1 | | * * * * * | INSERT INTO cron_demo DEFAULT VALUES; | root | t 2 | five-min | */5 * * * * | SELECT now(); | root | t(2 rows)

cron.job 表主要字段说明:

字段 说明
jobid 任务 ID,创建时自动分配
jobname 任务名称,创建时指定
schedule cron 表达式
command 要执行的命令
database 任务执行的目标数据库
username 执行任务的用户
active 是否启用,t 表示启用,f 表示停用

十、修改任务

使用 cron.alter_job 函数修改任务。第一个参数为任务 ID,其余参数按需传入要修改的字段:

postgres=> SELECT cron.alter_job(2, schedule => '*/2 * * * *', command => 'SELECT now();'); alter_job———–(1 row)

上述语句将任务2的调度周期改为每2分钟执行一次,命令保持不变。

十一、按任务名删除

postgres=> SELECT cron.unschedule('five-min'); unschedule———— t(1 row)

返回 t 表示删除成功。

十二、按任务 ID 删除

postgres=> SELECT cron.unschedule(1); unschedule———— t(1 row)

十三、查看运行记录

任务每次执行后,运行结果记录在 cron.job_run_details 表中:

postgres=> SELECT jobid, status, return_message, start_time, end_time FROM cron.job_run_details ORDER BY runid DESC LIMIT 2; jobid | status | return_message | start_time | end_time——-+———–+—————-+——————————-+——————————- 3 | succeeded | INSERT 0 1 | 2026-09-03 11:42:00.003175+08 | 2026-09-03 11:42:00.006969+08(1 row)

字段说明:

字段 说明
status 执行状态,succeeded 表示成功,failed 表示失败
return_message 命令的完成消息,如 INSERT 0 1 表示成功插入1行
start_time / end_time 任务开始和结束时间

十四、参数说明

pg_cron 的相关参数如下:

参数 默认值 说明
cron.database_name postgres 存放 pg_cron 元数据的数据库,修改需重启
cron.max_running_jobs 5 允许同时运行的最大任务数,修改需重启
cron.timezone GMT 调度时区,修改需重启

注意:说明:

注意:上述参数的修改方式请以控制台参数设置为准。操作请参考 设置实例参数。

十五、Q:创建扩展时提示只能在指定数据库创建?

A:pg_cron 的扩展只能在 cron.database_name 参数指定的数据库中创建。请先确认当前连接的数据库是否与 cron.database_name 一致,或通过控制台修改该参数后重试。

十六、Q:任务执行失败如何排查?

A:查询 cron.job_run_details 表,查看失败任务的 status 和 return_message 字段,其中记录了执行状态和错误信息。

十七、相关参考

pg_cron 产品文档

赞 (0)
上一篇 4天前
下一篇 4天前