更新时间:2024-09-19 GMT+08:00

使用pg_cron插件

简介

pg_cron扩展是一个使用cron语法的定时任务调度程序。与常规cron使用相同的语法,但允许直接从数据库执行PostgreSQL命令。更多信息,请参见pg_cron官方文档

支持的版本说明

PostgreSQL 12及以上版本的最新小版本支持该插件。可通过以下SQL语句查询当前实例支持该插件的版本:

SELECT * FROM pg_available_extension_versions WHERE name = 'pg_cron';

如果不支持,可通过升级内核小版本或者使用转储与还原升级大版本使用该插件。

RDS for PostgreSQL实例支持的插件,具体请参见支持的插件列表

插件介绍

标准cron语法,*表示每个时间段运行,特定数字表示仅在此时间。

┌───────────── min (0 - 59)  
   │ ┌────────────── hour (0 - 23)  
   │ │ ┌─────────────── day of month (1 - 31)  
   │ │ │ ┌──────────────── month (1 - 12)  
   │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to  
   │ │ │ │ │                                   Saturday, or use names; 7 is also Sunday)  
   │ │ │ │ │  
   │ │ │ │ │ 

例如每周六9:30 AM(GMT)的语法为:

30 9 * * 6

注意事项

  1. pg_cron需要后台守护进程,因此启动数据库前,需要将pg_cron放到shared_preload_libraries中。
  2. 定时任务不会在备机上运行,但当备机升主后,定时任务会自动启动。
  3. 定时任务会以任务创建者的权限执行。
  4. 定时任务使用GMT时间执行。
  5. 一个实例可以并行运行多个任务,但同一时间某个任务仅能运行一个。
  6. 某个任务,需要等待前一个定时任务结束,那么该任务会进入等待队列,且会在前一个任务结束后尽快启动。
  7. 使用前,需要将cron.database_name修改为创建定时任务的数据库,并且只能设为单个数据库,不支持设置多个数据库。

基本使用

创建或删除插件:

-- 创建插件
CREATE EXTENSION IF NOT EXISTS pg_cron; 
-- 删除插件
DROP EXTENSION IF EXISTS pg_cron; 

创建任务:

-- 任务1:每周六上午3:30(GMT),删除旧数据 
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);  
-- 任务2:每天上午 10:00(GMT),执行vacuum,任务以nightly-vacuum为命名。
SELECT cron.schedule('nightly-vacuum', '0 10 * * *', 'VACUUM');
表1 参数说明

参数名

功能

默认值

需要重启

cron.database_name

定时任务元信息所在的数据库。

postgres

cron.log_statement

执行任务前,是否将SQL打印到日志。

true

cron.log_run

是否将任务的执行信息存储到job_run_details表中。

true

cron.host

要执行定时任务的host名。

localhost

cron.use_background_workers

使用后台work进程,而非客户端连接执行任务。

false

cron.max_running_jobs

可以同时运行的job数量。

5