PostgreSQL技术内幕24:定时任务调度插件pg_cron

devtools/2025/2/2 21:24:55/

文章目录

    • 0.简介
    • 1.基础知识
    • 2.pg_cron安装使用方式
      • 2.1 安装pg_cron
      • 2.2 使用方式
    • 3.实现原理
      • 3.1 启动过程
      • 3.2 任务添加和管理
      • 3.3 调度过程
      • 3.4 执行原理

0.简介

pg_cron是PostgreSQL中的一个简单的基于cron的任务调度插件,本文将从其基础知识(Linux中Cron的语法)、pg_cron安装使用方式以及实现原理来对其进行详细的分析。

1.基础知识

理解pg_cron可以先去了解Linux系统中的Cron,其是一种用于自动执行预定任务的工具,Linux中Cron语法如下,pg_cron也是基于此来实现的。

#查看当前用户任务列表
crontab -l
#编辑任务列表
crontab -e
#语法,其时间部分包含五个或六个字段,分别是分钟、小时、日期、月份、星期和可选的年份。
#实际时间例子如下
* * * * *:每分钟运行一次任务。
0 * * * *:每小时的第0分钟运行一次任务。
0 0 * * *:每天的00:00(午夜)运行一次任务。
0 0 * * 1:每周一的00:00运行一次任务。
0 0 1 * *:每月1号的00:00运行一次任务。
#实际添加一个每天七点执行脚本run.sh格式如下,直接添加一行
0 7 * * * /path/run,sh

2.pg_cron安装使用方式

2.1 安装pg_cron

git clone https://github.com/citusdata/pg_cron.git
cd pg_cron
#其使用的是pg_config中的信息(编译选项,安装路径等)
make && make install#修改参数
postgres=# ALTER SYSTEM SET shared_preload_libraries TO pg_cron;
ALTER SYSTEM
postgres=# exit
#重启数据库
pg_ctl restart
#创建pg_cron插件
postgres=# CREATE EXTENSION pg_cron;
CREATE EXTENSION

2.2 使用方式

#添加任务,每分钟执行
postgres=# SELECT cron.schedule('* * * * *', 'select 1;');schedule
----------1
(1 row)#查看任务
postgres=# SELECT * FROM cron.job;jobid | schedule  |  command  | nodename  | nodeport | database | username | active | jobname
-------+-----------+-----------+-----------+----------+----------+----------+--------+---------1 | * * * * * | select 1; | localhost |     6688 | postgres | admin    | t      |
(1 row)#删除任务
postgres=#  SELECT cron.unschedule(1);unschedule
------------t
(1 row)#再次查看
postgres=# SELECT c* FROM cron.job;jobid | schedule | command | nodename | nodeport | database | username | active | jobname
-------+----------+---------+----------+----------+----------+----------+--------+---------
(0 rows)

3.实现原理

3.1 启动过程

启动过程需要理解的内容是如何去启动pg_cron,对于PG来说,其为多进程的架构,后台主进程是postmaster,在其启动是会调用process_shared_preload_libraries();函数去加载外部插件,对于插件加载过程包含了环境检查和主函数注册,主函数由插件中_PG_init()完成注册,函数从外部加载,由postmaster执行。

PG_init = (PG_init_t) pg_dlsym(file_scanner->handle, "_PG_init");
if (PG_init)(*PG_init) ();

对于pg_cron来说,_PG_init 函数对于主函数进行了注册:将 PgCronLauncherMain配置为一个后台 worker 并且注册到列表中。到这里系统回到了 postmaster 进程中继续执行任务,直到执行到 maybe_start_bgworkers() 函数,尝试将 workerlist 列表中的worker启动。(这个执行的过程还与数据库的模式有关,处于 standby mode 状态下的数据库不会去启动 pg_cron) postmaster 会分配一个 background work给pg_cron , 之后pg_cron 进程独立运行,进程如下。

在这里插入图片描述

3.2 任务添加和管理

pg_cron中,所有的定时任务都会被保存在cron.job表中,也就是在用法里描述操作的表。
pg_cron里维护了job list和task list来进行后台调度和任务的执行,其更新过程是在启动时根据cron.job表构造job list和task list,后面任务列表更新时通过触发器cron.job_cache_invalidate进行列表刷新,整体流程如下:

在这里插入图片描述

3.3 调度过程

其启动后会进入一个循环,其内部不断执行任务列表获取,是否执行判断(ShouldRunTask函数),其任务状态有以下几种,由于pg_cron是单线程的,所以在对于可能阻塞的步骤采用IO多路复用来处理,避免阻塞,使用的是Poll函数。
在这里插入图片描述

1)WAITING(等待):默认状态。如果条件不满足(非激活状态/计划时间还未到),则跳过该任务的调度,如果条件满足,则进入START状态。
2)START(启动):构建任务的连接信息,并进行连接测试。如果连接成功,则进入CONNECTING状态,否则进入ERROR状态。
3)CONNECTING(连接):检查任务是否激活,连接是否正常。如果所有条件都满足,则进入SENDING状态,否则进入ERROR状态。
4)SENDING(发送):检查任务是否激活,连接是否正常。如果所有条件满足,将定时任务文本发送至PolarDB PostgreSQL版服务器,进入RUNNING状态,否则进入ERROR状态。
5)RUNNING(运行):检查任务是否激活,连接是否正常。如果所有条件都满足,接收传回的任务结果并进入DONE状态,否则跳出等待进入ERROR状态。
6)ERROR(错误):任务失败,重置连接信息并进入DONE状态。
7)DONE(完成):任务完成,重置任务信息并重新进入WAITING状态。
其判断是否需要执行,也是根据设置,时间参数格式和linux中cron一致,如下:
在这里插入图片描述

3.4 执行原理

执行原理其实就是将待执行的文本发送给postmaster去做相应执行。


http://www.ppmy.cn/devtools/155540.html

相关文章

PostgreSQL 数据查询操作(排序、筛选、连接、分组、子查询)

(1)排序查询与筛选查询操作 排序查询使用ORDER BY,对某个表中的列1按照列升序(ASC,默认升序)或降序(DESC)排序,排序后展示列1和列2两列。此外,也可以按照多列…

MySQL数据类型转换应注意什么?

文章目录 1. **隐式转换**2. **显式转换**3. **数据截断**4. **字符集与排序规则**5. **日期和时间转换**6. **数值转换**7. **NULL 处理**8. **性能影响**9. **错误处理**10. **函数选择**示例总结 在 MySQL 中进行数据类型转换时,需要注意以下几个关键点&#xff…

基于Cipher的Java加密工具类

一、什么是Cipher Cipher是一种用于加密和解密信息的算法或方法。它将原始的明文转化为密文,从而保护信息的安全性和机密性。使用密码学中的数学原理和技术,Cipher可以对数据进行加密处理,使其在传输或存储过程中对未授权的访问者不可读。在必…

LVGL+FreeRTOS实战项目:智能健康助手(lcd篇)

1.8寸彩色TFT显示屏简介 接线图 我们选用的是分辨率为128*160的彩色显示屏,采用的SPI接口,通过我们STM32的SPI外设,来和我们的屏幕进行通信,以显示我们需要显示的图片。 软件部分 #include "lcd_driver.h"//液晶IO初始…

2015年蓝桥杯第六届CC++大学B组真题及代码

目录 1A:奖券数目(填空_简单枚举) 2B:星系炸弹(填空_日期计算) 3C:三羊献瑞(填空_全排列) 4D:格子中输出(代码填空) 5E&#xff1…

C# 拖入文件 只能拖入txt文件

要实现只能将 .txt 文件拖入 Button 控件(如 button1)并获取其路径,可以在之前的基础上添加文件类型的检查逻辑。以下是具体实现步骤和示例代码: 1. 创建 Windows Forms 项目 打开 Visual Studio,创建一个新的 Window…

ASP.NET Core WebAPI的异步及返回值

目录 Action方法的异步 Action方法参数 捕捉URL占位符 捕捉QueryString的值 JSON报文体 其他方式 Action方法的异步 Action方法既可以同步也可以异步。异步Action方法的名字一般不需要以Async结尾。Web API中Action方法的返回值如果是普通数据类型,那么返回值…

【BQ3568HM开发板】深入解析智能家居中控屏工程的NAPI接口设计

目录 引言 一、NAPI接口概述 二、NAPI接口设计 1. 接口定义 2. 接口实现 三、NAPI接口在智能家居中控屏中的应用 1. 灯光控制 2. 窗帘控制 四、总结 本文收发于电子发烧友论坛:https://bbs.elecfans.com/jishu_2474863_1_1.html。 引言 在智能家居中控屏…