小知识,大挑战!本文正在参与“ 程序员必备小知识 ”创作活动
0.介绍
pg_cron是PostgreSQL(9.5或更高版本)的一个简单的基于cron的作业调度程序,它作为扩展在数据库中运行,由citusdata公司提供,由于postgresql本身没有类似oracle schedule、job的功能,所以在处理调度问题时,运行job基本依赖操作系统的crontab。 它与常规 cron 保持相同的语法,但它允许直接从数据库安排PostgreSQL 命令。作为一个独立运行的工作者进程,其生命周期管理、内存空间都依赖于 postgreSQL。
1.pg_cron生命周期
pg_cron 插件的主体是围绕 PG_CRON_TASK 进行,从内部来说, PG_CRON_TASK 有自己的生命周期,其生命周期的轮转过程就是插件的运行过程,从外部来说 PG_CRON_TASK 与 PG_CRON_JOB 通信取得当前的任务列表,在运行状态与 POSTMASTER 通信 完成定时任务的运行。
pg_cron 生命周期中涉及到的主要涉及环境信息 如 图2 所示,主要分为三类:即状态检查信息、标志位返回信息 和 错误返回信息 。而pg_cron 的生命周期的状态转移就由这些信息控制。状态转移状态一般来说也分为三类:状态等待中,正常执行进入下一个状态,错误信息返回。进程从 CRON_TASK_WAITING 开始,依次进入每一个对应的状态,最后流转到 CRON_TASK_DONE 和 CRON_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)(0到6表示周末到下周六,
│││││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)返回的行数-或错误消息