PostgreSQL的扩展 pg_cron

PostgreSQL的扩展 pg_cron

pg_cron 是 PostgreSQL 的一个开源扩展,它允许在数据库内部使用 cron 语法调度定期任务,是最接近 Oracle DBMS_SCHEDULER 的解决方案。

一 安装与配置

1 安装方法

下载路径:

https://github.com/citusdata/pg_cron/tags

在这里插入图片描述

编译安装:

cd pg_cron
make && make install

在 PostgreSQL 中配置:

-- 在 postgresql.conf 中添加:
shared_preload_libraries = 'pg_cron'-- 重启后创建扩展
CREATE EXTENSION pg_cron;

2. 权限配置

-- 创建专用角色
CREATE ROLE cron_job_runner WITH LOGIN;
GRANT USAGE ON SCHEMA cron TO cron_job_runner;-- 配置任务执行权限
ALTER SYSTEM SET cron.database_name = 'your_database';
ALTER SYSTEM SET cron.host = 'localhost';
ALTER SYSTEM SET cron.log_run = 'on';

二、核心功能使用

1. 基本任务调度

-- 每分钟执行
SELECT cron.schedule('test-job', '* * * * *', 'SELECT now()');-- 每天凌晨3点执行
SELECT cron.schedule('nightly-cleanup', '0 3 * * *', 'DELETE FROM logs WHERE created_at < now() - interval ''30 days''');-- 每周一早上执行
SELECT cron.schedule('weekly-report', '0 9 * * 1', 'CALL generate_weekly_report()');

2. 带参数的任务

-- 使用美元引用
SELECT cron.schedule('param-job', '0 * * * *', $$UPDATE stats SET value = value + 1 WHERE metric_id = 'page_views'$$);-- 调用存储过程
SELECT cron.schedule('call-proc', '0 0 * * *', 'CALL refresh_materialized_views(true)');

3. 任务管理

-- 查看所有任务
SELECT * FROM cron.job;-- 查看执行历史
SELECT * FROM cron.job_run_details ORDER BY start_time DESC LIMIT 10;-- 更新任务计划
SELECT cron.alter_job(job_id, schedule := '0 4 * * *');-- 删除任务
SELECT cron.unschedule(jobid);

三、高级功能

1. 任务重试机制

-- 带错误处理的任务
SELECT cron.schedule('retry-job', '*/5 * * * *', $$
BEGIN-- 业务逻辑INSERT INTO important_data SELECT * FROM external_source;
EXCEPTION WHEN OTHERS THENINSERT INTO job_errors VALUES ('retry-job', SQLERRM, now());
END;
$$);

2. 任务依赖链

-- 使用表状态控制流程
SELECT cron.schedule('step1', '0 1 * * *', $$TRUNCATE TABLE staging_data;COPY staging_data FROM '/data/import.csv';UPDATE job_status SET step1_complete = true WHERE job_name = 'daily_import';
$$);SELECT cron.schedule('step2', '0 2 * * *', $$BEGINPERFORM 1 FROM job_status WHERE job_name = 'daily_import' AND step1_complete;IF NOT FOUND THENRAISE EXCEPTION 'Step1 not completed';END IF;-- 处理数据...END;
$$);

3. 分布式任务

-- 在多个节点上调度(需Citus扩展)
SELECT cron.schedule('sharded-job', '0 * * * *', 'SELECT master_distribute_command($cmd$INSERT INTO sharded_events SELECT * FROM collect_events()$cmd$)');

四、监控与维护

1. 监控面板查询

-- 正在运行的任务
SELECT * FROM cron.job_run_details 
WHERE status = 'running';-- 失败任务统计
SELECT jobid, jobname, COUNT(*) as failures
FROM cron.job_run_details
WHERE status = 'failed'
GROUP BY jobid, jobname
ORDER BY failures DESC;-- 任务执行时长分析
SELECT jobname,avg(end_time - start_time) as avg_duration,max(end_time - start_time) as max_duration
FROM cron.job_run_details
GROUP BY jobname;

2. 维护操作

-- 清理历史记录(保留30天)
DELETE FROM cron.job_run_details 
WHERE start_time < now() - interval '30 days';-- 临时禁用所有任务
UPDATE cron.job SET active = false;-- 导出任务配置
COPY (SELECT jobname, schedule, command FROM cron.job) 
TO '/backup/pg_cron_jobs.csv' WITH CSV HEADER;

五、典型应用场景

1. 数据维护任务

-- 自动VACUUM
SELECT cron.schedule('auto-vacuum', '0 4 * * *', $$VACUUM (VERBOSE, ANALYZE) tables_with_heavy_updates;
$$);-- 分区表维护
SELECT cron.schedule('partition-rotation', '0 3 * * *', $$CALL rotate_partitions('events', 'day', 7);
$$);

2. 数据ETL流程

-- 每小时数据抽取
SELECT cron.schedule('extract-hourly', '0 * * * *', $$INSERT INTO data_warehouse.hourly_factsSELECT * FROM extract_hourly_metrics();
$$);-- 每天数据转换
SELECT cron.schedule('transform-daily', '30 3 * * *', $$CALL transform_raw_to_dimensions();
$$);

3. 业务定时任务

-- 每月账单生成
SELECT cron.schedule('monthly-billing', '0 2 1 * *', $$CALL generate_invoices(date_trunc('month', CURRENT_DATE));
$$);-- 定时提醒
SELECT cron.schedule('appointment-reminders', '0 9 * * *', $$INSERT INTO notificationsSELECT user_id, 'appointment_reminder', appointment_timeFROM appointmentsWHERE appointment_time BETWEEN now() AND now() + interval '24 hours';
$$);

六、注意事项

  1. 性能影响

    • 避免调度过于频繁的CPU密集型任务
    • 长时间运行的任务应设置超时
  2. 安全考虑

    -- 限制任务权限
    REVOKE ALL ON SCHEMA cron FROM PUBLIC;
    GRANT USAGE ON SCHEMA cron TO scheduler_role;
    
  3. 高可用性

    • 在主备架构中,pg_cron只需在主节点运行
    • 使用 repmgr 或 Patroni 时确保故障转移后任务继续执行
  4. 版本兼容性

    • pg_cron 1.0+ 需要 PostgreSQL 12+
    • 新版本支持任务标签和更细粒度的控制

pg_cron 通过将 cron 功能直接集成到 PostgreSQL 中,提供了轻量级但强大的任务调度解决方案,特别适合需要与数据库紧密交互的定时任务场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78468.shtml

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

相关文章

卷积神经网络迁移学习:原理与实践指南

引言 在深度学习领域&#xff0c;卷积神经网络(CNN)已经在计算机视觉任务中取得了巨大成功。然而&#xff0c;从头开始训练一个高性能的CNN模型需要大量标注数据和计算资源。迁移学习(Transfer Learning)技术为我们提供了一种高效解决方案&#xff0c;它能够将预训练模型的知识…

图论---朴素Prim(稠密图)

O( n ^2 ) 题目通常会提示数据范围&#xff1a; 若 V ≤ 500&#xff0c;两种方法均可&#xff08;朴素Prim更稳&#xff09;。 若 V ≤ 1e5&#xff0c;必须用优先队列Prim vector 存图。 // 最小生成树 —朴素Prim #include<cstring> #include<iostream> #i…

Spring-Cache替换Keys为Scan—负优化?

背景 使用ORM工具是往往会配合缓存框架实现三级缓存提高查询效率&#xff0c;spring-cache配合redis是非常常规的实现方案&#xff0c;如未做特殊配置&#xff0c;CacheEvict(allEntries true) 的批量驱逐方式&#xff0c;默认使用keys的方式查询历史缓存列表而后delete&…

【N8N】Docker Desktop + WSL 安装过程(Docker Desktop - WSL update Failed解决方法)

背景说明&#xff1a; 因为要用n8n&#xff0c;官网推荐这个就下载了&#xff0c;然后又是一堆卡的安装问题记录过程。 1. 下载安装包 直接去官网Get Docker | Docker Docs下载 下载的是第一个windows - x86_64. &#xff08;*下面那个beta的感觉是测试版&#xff09; PS&am…

RT Thread 发生异常时打印输出cpu寄存器信息和栈数据

打印输出发生hardfault时,当前栈十六进制数据和cpu寄存器信息 在发生 HardFault 时,打印当前栈的十六进制数据和 CPU 寄存器信息是非常重要的调试手段。以下是如何实现这一功能的具体步骤和示例代码。 1. 实现 HardFault 处理函数 我们需要在 HardFault 中捕获异常上下文,…

【安装neo4j-5.26.5社区版 完整过程】

1. 安装java 下载 JDK21-windows官网地址 配置环境变量 在底下的系统变量中新建系统变量&#xff0c;变量名为JAVA_HOME21&#xff0c;变量值为JDK文件夹路径&#xff0c;默认为&#xff1a; C:\Program Files\Java\jdk-21然后在用户变量的Path中&#xff0c;添加下面两个&am…

android jatpack Compose 多数据源依赖处理:从状态管理到精准更新的架构设计

Android Compose 多接口数据依赖管理&#xff1a;ViewModel 状态共享最佳实践 &#x1f4cc; 问题背景 在 Jetpack Compose 开发中&#xff0c;经常遇到以下场景&#xff1a; 页面由多个独立接口数据组成&#xff08;如 Part1、Part2&#xff09;Part2 的某些 UI 需要依赖 P…

面试之消息队列

消息队列场景 什么是消息队列&#xff1f; 消息队列是一个使用队列来通信的组件&#xff0c;它的本质就是个转发器&#xff0c;包含发消息、存消息、消费消息。 消息队列怎么选型&#xff1f; 特性ActiveMQRabbitMQRocketMQKafka单机吞吐量万级万级10万级10万级时效性毫秒级…

GStreamer 简明教程(十一):插件开发,以一个音频生成(Audio Source)插件为例

系列文章目录 GStreamer 简明教程&#xff08;一&#xff09;&#xff1a;环境搭建&#xff0c;运行 Basic Tutorial 1 Hello world! GStreamer 简明教程&#xff08;二&#xff09;&#xff1a;基本概念介绍&#xff0c;Element 和 Pipeline GStreamer 简明教程&#xff08;三…

Linux kernel signal原理(下)- aarch64架构sigreturn流程

一、前言 在上篇中写到了linux中signal的处理流程&#xff0c;在do_signal信号处理的流程最后&#xff0c;会通过sigreturn再次回到线程现场&#xff0c;上篇文章中介绍了在X86_64架构下的实现&#xff0c;本篇中介绍下在aarch64架构下的实现原理。 二、sigaction系统调用 #i…

华为OD机试真题——简易内存池(2025A卷:200分)Java/python/JavaScript/C++/C/GO最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 本文收录于专栏&#xff1a;《2025华为OD真题目录全流程解析/备考攻略/经验…

腾讯一面面经:总结一下

1. Java 中的 和 equals 有什么区别&#xff1f;比较对象时使用哪一个 1. 操作符&#xff1a; 用于比较对象的内存地址&#xff08;引用是否相同&#xff09;。 对于基本数据类型、 比较的是值。&#xff08;8种基本数据类型&#xff09;对于引用数据类型、 比较的是两个引…

计算机网络中的DHCP是什么呀? 详情解答

目录 DHCP 是什么&#xff1f; DHCP 的工作原理 主要功能 DHCP 与网络安全的关系 1. 正面作用 2. 潜在安全风险 DHCP 的已知漏洞 1. 协议设计缺陷 2. 软件实现漏洞 3. 配置错误导致的漏洞 4. 已知漏洞总结 举例说明 DHCP 与网络安全 如何提升 DHCP 安全性 总结 D…

2025 年导游证报考条件新政策解读与应对策略

2025 年导游证报考政策有了不少新变化&#xff0c;这些变化会对报考者产生哪些影响&#xff1f;我们又该如何应对&#xff1f;下面就为大家详细解读新政策&#xff0c;并提供实用的应对策略。 最引人注目的变化当属中职旅游类专业学生的报考政策。以往&#xff0c;中专学历报考…

【物联网】基于LORA组网的远程环境监测系统设计(ThingsCloud云平台版)

演示视频: 基于LORA组网的远程环境监测系统设计(ThingsCloud云平台版) 前言:本设计是基于ThingsCloud云平台版,还有另外一个版本是基于机智云平台版本,两个设计只是云平台和手机APP的区别,其他功能都一样。如下链接: 【物联网】基于LORA组网的远程环境监测系统设计(机…

SQL 函数进行左边自动补位fnPadLeft和FORMAT

目录 1.问题 2.解决 方式1 方式2 3.结果 1.问题 例如在SQL存储过程中&#xff0c;将1 或10 或 100 长度不足的时候&#xff0c;自动补足长度。 例如 1 → 001 10→ 010 100→100 2.解决 方式1 SELECT FORMAT (1, 000) AS FormattedNum; SELECT FORMAT(12, 000) AS Form…

Nacos简介—2.Nacos的原理简介

大纲 1.Nacos集群模式的数据写入存储与读取问题 2.基于Distro协议在启动后的运行规则 3.基于Distro协议在处理服务实例注册时的写路由 4.由于写路由造成的数据分片以及随机读问题 5.写路由 数据分区 读路由的CP方案分析 6.基于Distro协议的定时同步机制 7.基于Distro协…

中电金信联合阿里云推出智能陪练Agent

在金融业加速数智化转型的今天&#xff0c;提升服务效率与改善用户体验已成为行业升级的核心方向。面对这一趋势&#xff0c;智能体与智能陪练的结合应用&#xff0c;正帮助金融机构突破传统业务模式&#xff0c;开拓更具竞争力的创新机遇。 在近日召开的阿里云AI势能大会期间&…

十分钟恢复服务器攻击——群联AI云防护系统实战

场景描述 服务器遭遇大规模DDoS攻击&#xff0c;导致服务不可用。通过群联AI云防护系统的分布式节点和智能调度功能&#xff0c;快速切换流量至安全节点&#xff0c;清洗恶意流量&#xff0c;10分钟内恢复业务。 技术实现步骤 1. 启用智能调度API触发节点切换 群联系统提供RE…

LLM量化技术全景:GPTQ、QAT、AWQ、GGUF与GGML

01 引言 本文介绍的是在 LLM 讨论中经常听到的各种量化技术。本文的目的是提供一步一步的解释和代码&#xff0c;让大家可以自己使用这些技术来压缩模型。 闲话少说&#xff0c;我们来研究一下吧&#xff01; 02 Quantization 量化是指将高精度数字转换为低精度数字。低精…