postgres 安装与使用定时任务插件pg_cron

2,904 阅读3分钟

小知识,大挑战!本文正在参与“ 程序员必备小知识 ”创作活动

0.介绍

pg_cronPostgreSQL(9.5或更高版本)的一个简单的基于cron的作业调度程序,它作为扩展在数据库中运行,由citusdata 公司提供,由于postgresql 本身没有类似 oracle schedulejob的功能,所以在处理调度问题时,运行job基本依赖操作系统的crontab。 它与常规 cron 保持相同的语法,但它允许直接从数据库安排PostgreSQL 命令。作为一个独立运行的工作者进程,其生命周期管理、内存空间都依赖于 postgreSQL。

1.pg_cron生命周期

pg_cron 插件的主体是围绕 PG_CRON_TASK 进行,从内部来说, PG_CRON_TASK 有自己的生命周期,其生命周期的轮转过程就是插件的运行过程,从外部来说 PG_CRON_TASKPG_CRON_JOB 通信取得当前的任务列表,在运行状态与 POSTMASTER 通信 完成定时任务的运行。

d01f160ac94706ba27444d0115334ed8.png pg_cron 生命周期中涉及到的主要涉及环境信息 如 图2 所示,主要分为三类:即状态检查信息、标志位返回信息 和 错误返回信息 。而pg_cron 的生命周期的状态转移就由这些信息控制。状态转移状态一般来说也分为三类:状态等待中,正常执行进入下一个状态,错误信息返回。进程从 CRON_TASK_WAITING 开始,依次进入每一个对应的状态,最后流转到 CRON_TASK_DONECRON_TASK_ERROR 中的一个。 最后这些状态信息被重置,pg_cron 进入下一个生命周期。

2.安装

2.1环境

操作系统:centos7
postgresql版本:12

2.2 扩展安装

yum install -y pg_cron_12

2.3 postgresql.conf配置

shared_preload_libraries = 'pg_cron'
cron.database_name = '数据库名称'

2.4 配置连接

通常的pg_hba.conf文件配置包含以下内容即可:

host    all    all   localhost           trust
host    all    all   0.0.0.0/0           trust
host    all    all   127.0.0.1/32        trust

2.5创建并激活插件

-- run as superuser:
CREATE EXTENSION pg_cron;

-- optionally, grant usage to regular users:  marco
GRANT USAGE ON SCHEMA cron TO marco;

3.使用

3.1创建定时任务

每一个定时任务分为两部分: 定时计划 和 定时任务。定时计划规定了用户 使用 插件的计划(例如:每隔1分钟执行一次该任务),定时任务是用户具体的任务内容(例如:select * from some_table) 普通用户一共有三个可选函数:增加任务项、删除任务项、查看当前任务项。

  • 增加任务项

--每分钟执行指定脚本
SELECT cron.schedule('* * * * *','select 1;');


--每个小时的23分执行指定脚本
SELECT cron.schedule('23 * * * *','select 1;')

--每个月的4号执行指定脚本
SELECT cron.schedule('* * 4 * *','select 1;');

pg_cron 计划使用标准的 cron 语法,其中 * 表示“每个该时间运行”,特定数字表示“仅在 这个数字时 运行”

┌─────────────分钟(0-59)
│┌──────────────小时(0-23)
││┌───────────────日期(1-31)
│││┌────────────────月份(1-12)
││││┌─────────────────一周中的某一天(0-6)(06表示周末到下周六,
│││││7仍然是周末)
││││││││││*****
  • 删除任务项
-- 取消单个任务
SELECT cron.unschedule(<定时任务ID>);

--一次取消所有定时任务
SELECT cron.unschedule(jobid) FROM cron.job;
  • 查看当前任务
SELECT * FROM cron.job; 
jobid | schedule   |  command  | nodename  | nodeport | database | username | active
-------+------------+-----------+-----------+----------+----------+----------+--------
43|010***|   VACUUM;| localhost |5433| postgres | test     | t

3.2审核日志

审核日志可让我们查看正在运行的cron作业以及过去的作业运行,cron这个schema下有个job_run_details表,这个表其实就是查看我们命令执行的一些细节。

1)命令开始和结束的时间

2)pg_cron命令是否成功

3)返回的行数-或错误消息