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

文章目录

    • 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.rhkb.cn/news/12856.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【回溯+剪枝】找出所有子集的异或总和再求和 全排列Ⅱ

文章目录 1863. 找出所有子集的异或总和再求和解题思路:子集问题解法(回溯 剪枝)47. 全排列 II解题思路:排序 回溯 剪枝 1863. 找出所有子集的异或总和再求和 1863. 找出所有子集的异或总和再求和 一个数组的 异或总和 定义为…

每日一题洛谷P5721 【深基4.例6】数字直角三角形c++

#include<iostream> using namespace std; int main() {int n;cin >> n;int t 1;for (int i 0; i < n; i) {for (int j 0; j < n - i; j) {printf("%02d",t);t;}cout << endl;}return 0; }

Hackmyvm Blackhat

简介 难度&#xff1a;简单 靶机地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmBlackhat 参考wp&#xff1a;https://emvee-nl.github.io/posts/HackMyVM-Writeup-Blackhat/#privilege-escalation 环境 kali&#xff1a;192.168.194.9 靶机&#xff1a;192.…

【含文档+PPT+源码】基于Python爬虫二手房价格预测与可视化系统的设计与实现

项目介绍 本课程演示的是一款基于Python爬虫二手房价格预测与可视化系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项…

《redis哨兵机制》

【redis哨兵机制导读】上一节介绍了redis主从同步的机制&#xff0c;但大家有没有想过一种场景&#xff0c;比如&#xff1a;主库突然挂了&#xff0c;那么按照读写分离的设计思想&#xff0c;此时redis集群只有从库才能提供读服务&#xff0c;那么写服务该如何提供&#xff0c…

用python实现进度条

前言 在Python中&#xff0c;可以使用多种方式实现进度条。以下是几种常见的进度条格式的实现方法&#xff1a; 1. 使用 tqdm 库 tqdm 是一个非常流行的库&#xff0c;可以轻松地在循环中显示进度条。 from tqdm import tqdm import time# 示例&#xff1a;简单的进度条 fo…

Mysql:数据库

Mysql 一、数据库概念&#xff1f;二、MySQL架构三、SQL语句分类四、数据库操作4.1 数据库创建4.2 数据库字符集和校验规则4.3 数据库修改4.4 数据库删除4.4 数据库备份和恢复其他 五、表操作5.1 创建表5.2 修改表5.3 删除表 六、表的增删改查6.1 Create(创建):数据新增1&#…

2024年12月 Scratch 图形化(二级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化&#xff08;二级&#xff09;真题解析 中国电子学会全国青少年软件编程等级考试 一、单选题(共25题&#xff0c;共50分) 第 1 题 小猫初始位置和方向如下图所示&#xff0c;下面哪个选项能让小猫吃到老鼠&#xff1f;&#xff08; &#xff09; A. B. …

开工了,搬砖了!

今天是正月初八&#xff0c;正式搬砖了。地铁还是空荡荡的&#xff0c;显然很多小伙伴春节假期还没有结束。往年上班时间也是正月初十左右&#xff0c;每次看到身边的人都返程了&#xff0c;心理总有些许不安&#xff0c;就好像人只有忙碌起来才显得生命和时间都是可贵的&#…

gesp(C++六级)(13)洛谷:P11375:[GESP202412 六级] 树上游走

gesp(C六级)&#xff08;13&#xff09;洛谷&#xff1a;P11375&#xff1a;[GESP202412 六级] 树上游走 题目描述 小杨有一棵包含无穷节点的二叉树&#xff08;即每个节点都有左儿子节点和右儿子节点&#xff1b;除根节点外&#xff0c;每个节点都有父节点&#xff09;&#…

51单片机看门狗系统

在 STC89C52 单片机中&#xff0c;看门狗控制寄存器的固定地址为 0xE1。此地址由芯片厂商在硬件设计时确定&#xff0c;但是它在头文件中并未给出&#xff0c;因此在使用看门狗系统时需要声明下这个特殊功能寄存器 sfr WDT_CONTR 0xE1; 本案将用一个小灯的工作状况来展示看门…

HTML排版标签、语义化标签、块级和行内元素详解

目录 前言 一、HTML中的排版标签 1. 文本相关标签 1.1 标题标签 ~ 1.2 段落标签 1.3 强调和加粗 1.4 换行标签 1.5 水平线标签 二、HTML中的语义化标签 2.1 语义化标签概述 2.2 常见的语义化标签 示例&#xff08;核心代码部分&#xff09;&#xff1a; 三、HTM…

20250205——Windows系统基于ollama的DeepSeek-R1本地安装

1、安装ollama 1.1 Windows系统 打开ollama官网链接Download Ollama on Windows&#xff0c;根据自己的系统下载安装包&#xff0c;如果是Windows系统&#xff0c;下载Windows版本。 1.1 Linux系统 &#xff08;这个是因为运行遇到报错了&#xff0c;想自己记录一下解决方法&a…

DeepSeek R1 x ApiSmart

根据美国业界的说法&#xff1a;如果一个模型能够在生成良好代码方面表现更出色&#xff0c;那么通常它也能对非代码生成类型的其他用户查询产生更好的答案。 在AI编程领域&#xff0c;市面上已有多款大模型和工具供我们选择。常见的有OpenAI系列模型、Claude 3.5 Sonnet&#…

解决threeJS加载obj gltf和glb模型后颜色太暗的方法

网上找到的部分解决方法 网上找到的部分解决方法 咱们有时候去glb官方下载glb或gltf模型时候&#xff0c;模型显示太黑 其实通过查找后不难发现网上给出了很多解决方法&#xff0c;但是大部分都无法从根本上解决问题。我之前看到有一篇文章对gltf的解决方法是让gltf增加自发光…

GitHub Copilot 越狱漏洞

研究人员发现了两种操控 GitHub 的人工智能&#xff08;AI&#xff09;编码助手 Copilot 的新方法&#xff0c;这使得人们能够绕过安全限制和订阅费用、训练恶意模型等。 第一种技巧是将聊天交互嵌入 Copilot 代码中&#xff0c;利用 AI 的问答能力&#xff0c;使其产生恶意输…

动态规划练习八(01背包问题)

一、问题介绍与解题心得 01背包问题就是每个物品数量只有一个&#xff0c;每个物品可以取或不取&#xff0c;来达到收益最大&#xff0c;或者收益在某个值。 限制条件&#xff1a;背包容量有限&#xff0c;物品个数只有1个 解决问题&#xff1a;从价值入手&#xff08;价值最…

Java实习生面试题汇总

Java实习生面试题汇总 简介 本人是二本大三学生&#xff0c;下半年大四。暑假在上海这边找实习工作&#xff0c;面了几家公司&#xff0c;所问到的问题记录在下面。 因为是在校生&#xff0c;没任何实习经历&#xff0c;一般找我面试的都是小公司&#xff0c;一般问的比较简…

开源安全一站式构建!开启企业开源治理新篇章

在如今信息技术日新月异、飞速发展的数字化时代&#xff0c;开源技术如同一股强劲的东风&#xff0c;为企业创新注入了源源不断的活力&#xff0c;然而&#xff0c;正如一枚硬币有正反两面&#xff0c;开源技术的广泛应用亦伴随着不容忽视的挑战。安全风险如影随形&#xff0c;…

xxl-job 自定义告警短信发送

官方介绍 代码实现 实现 JobAlarm 重写 doAlarm 方法 Component public class SmsJobAlarm implements JobAlarm {Overridepublic boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog) {boolean alarmResult true;// 简单内容&#xff0c;根据业务自行修改String template …