乐于分享
好东西不私藏

(文档)第118讲:定时任务调度插件–pg_cron 使用技巧

(文档)第118讲:定时任务调度插件–pg_cron 使用技巧

目录

  一、 pg_cron概述

  二、 pg_cron安装

  三、 pg_cron应用案例

pg_cron概述

  pg_cron是PostgreSQL中的一个简单的基于cron的任务调度插件,支持在指定时间点执行批处理任务,如:定时更新数据、备份数据或清理过期数据等,能够确保任务按照预定计划进行,避免遗漏或延迟,节省时间和人力成本,实现自动准确高效的任务执行,提升系统的效率和可管理性。

pg_cron功能介绍

  定时任务主要分为定时计划和任务内容两个部分,具体介绍如下:

  1) 任务内容:用于指定该任务的具体内容,例如VACUUM。

  2) 定时计划:用于规定任务的时间计划,例如每隔一分钟执行一次该任务。

pg_cron实现原理

  pg_cron里维护了job list和task list来进行后台调度和任务的执行,其更新过程是在启动时根据cron.job表构造job list和task list,后面任务列表更新时通过触发器cron.job_cache_invalidate进行列表刷新,整体流程如下:

pg_cron调度过程

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

pg_cron语法介绍

  定时计划使用标准的cron语法,语法如下:

pg_cron安装

  1、下载

  git clone https://github.com/citusdata/pg_cron.git

  2、编译安装

  cd pg_cron

  make && make install

  3、修改参数并重启数据库

  postgres=# ALTER SYSTEM SET shared_preload_libraries TO pg_cron;

  postgres=# \! pg_ctl restart

  4、安装插件

  postgres=# CREATE EXTENSION pg_cron;

  pg_cron使用技巧

  1) 定时任务执行的时间是GMT或UTC时间,在使用时注意换算本地时间。

  2) 定时任务都储存于默认数据库postgres中,仅支持在数据库postgres中查询定时任务。

添加任务

  1、周六3:30 AM(GMT)删除过期数据

  2、每天的10:00 AM(GMT)执行函数test

  SELECT cron.schedule(‘0 10 * * *’, ‘select test()’);:

  3、每分钟执行指定SQL

  SELECT cron.schedule(‘* * * * *’, ‘select 1’);

  4、每月1号和30号以及每周六和周日的2:30 AM(GMT)执行磁盘清理:

  SELECT cron.schedule(’30 2 1,30 * 6,0′, ‘VACUUM FULL’);

  5、每天的11:00 PM(GMT)对Postgres库执行VACUUM:

  SELECT cron.schedule(‘Do Vacuum’, ‘0 23 * * *’ , ‘VACUUM FULL’);

       1) 低于1.4版本的pg_cron插件只能在安装插件的库执行定时任务,如果需要在其他库执行任务,需要直接操作cron.job表,操作不方便且不安全。

       2) 1.4版本的pg_cron插件支持指定数据库和数据库账号执行定时任务。语法如下:

  SELECT cron.schedule_in_database(‘<定时任务名称>’, ‘<定时计划>’, ‘<定时任务>’, ‘<执行数据库>’, ‘<数据库账号>’, ‘<任务是否启用>’);

  '<执行数据库>’:默认值为空,表示在postgres库执行。

  '<数据库账号>:默认值为空,表示使用当前账号执行。

  '<任务是否启用>’:默认值为true,表示启用该定时任务。

  1、每天的11:00 PM(GMT)在testdb库执行VACUUM

  SELECT cron.schedule_in_database(‘Do Vacuum’, ‘0 23 * * *’ , ‘VACUUM FULL’, ‘testdb’);

  2、每分钟让user1用户在testdb库中执行指定SQL

  SELECT cron.schedule_in_database(‘Select Per Minute’, ‘* * * * *’, ‘select 1’, ‘testdb’, ‘user1’);

修改任务

  pg_cron提供了cron.alter_job函数用于更改定时任务,语法如下:

  SELECT cron.alter_job(<定时任务ID>, ‘<定时计划>’, ‘<定时任务>’, ‘<执行数据库>’, ‘<执行用户>’, ‘<任务是否启用>’);

  <定时任务ID>:必填。定时任务ID为创建任务时自动生成的,可以通过查看cron.job表的jobid字段查看。

  其他参数:非必填,默认值为空,表示不更改。

  1、任务ID为3的定时任务更改为每天11:00 AM(GMT)执行

  SELECT cron.alter_job(3, ‘0 11 * * *’);

  2、任务ID为1的定时任务更改为VACUUM

  SELECT cron.alter_job(1, null , ‘VACUUM’);

  3、任务ID为2的定时任务的执行用户更改为user2:

  SELECT cron.alter_job(2, null , null, null, ‘user2’);

监控任务

  1) pg_cron新增了cron.job_run_details表记录定时任务执行信息,您可以在该表中获取执行任务的详细情况。

  2) 定时任务较多时,可能会导致cron.job_run_details表变得非常大,建议设置一个定时任务来删除该表。如果您不需要记录定时任务的执行情况,也可以提交工单联系技术支持修改cron.log_run关闭记录信息。

  1、 查看失败的任务详情

  SELECT * FROM cron.job_run_details WHERE status = ‘failed’;

  2、查看任务ID为1的定时任务执行详情

  SELECT * FROM cron.job_run_details WHERE jobid = ‘1’;

维护任务

  1、查看定时任务列表

  SELECT * FROM cron.job;

  2、通过任务名字删除定时任务

  SELECT cron.unschedule(‘<定时任务名称>’);

  3、通过ID名字删除定时任务

  SELECT cron.unschedule(<定时任务ID>);

  注意:定时任务ID为创建任务时自动生成的,可以通过查看cron.job表的jobid字段查看。

PostgreSQL技术大讲堂系列课程

    PostgreSQL从入门到精通,

    系列课程始于23年初,

    在周六19:30与大家分享PG技术,

    从基础的PG介绍与安装,

    到后续的调优、流复制等企业应用,

    涉及90多个知识点的介绍与演示,

    截至25年8月9日,

    系列课程已讲100期,

    欢迎继续关注PostgreSQL技术大讲堂,

    如果你也有意学习PostgreSQL,

    可以联系客服,领取相关资料。

相关阅读:

·2025年11月份工信部人才交流中心PostgreSQL能力认证证书

·工信部人才交流中心PostgreSQL能力认证证书【10月25日】

· 6月6日证书 – 工信部人才交流中心PostgreSQL中级高级认证

· 关于举办PostgreSQL数据库管理人才研修与评测班(二期)的通知

· 榜上有名!2024年工业和信息化重点领域人才能力评价支撑机构

·关于举办PostgreSQL数据库管理人才研修与评测班的通知

·工信部人才交流中心PostgreSQL中高级认证 纸质证书【9月16日】
(文档)PG第116讲:中文分词插件–pg_jieba使用技巧
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » (文档)第118讲:定时任务调度插件–pg_cron 使用技巧

评论 抢沙发

7 + 6 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮