如何在openGauss 2.1.0中使用Job?

如何在openGauss 2.1.0中使用Job?,第1张

Job类似Unix中的crontab,有定时执行的功能,可以在指定的时间点或每天的某个时间点等自行执行任务。在各类系统使用运行过程中,经常会遇到需要定时完成的任务,比如定时更新数据,定时统计数据生成报表等等,这些工作都可以使用Job来完成。在openGauss 2.1.0中,提供了以下接口来实现管理Job。

1 接口描述

2 接口定义和使用示例

PKG_SERVICE.JOB_CANCEL

存储过程CANCEL删除指定的定时任务。

PKG_SERVICE.JOB_CANCEL函数原型为:

PKG_SERVICE.JOB_CANCEL( job IN INTEGER)

示例:

存储过程FINISH禁用或者启用定时任务。

PKG_SERVICE.JOB_FINISH函数原型为:

存储过程JOB_SUBMIT提交一个系统提供的定时任务。

PKG_SERVICE.JOB_SUBMIT函数原型为:

PKG_SERVICE.JOB_SUBMIT( id IN BIGINT DEFAULT, content IN TEXT, next_date IN TIMESTAMP DEFAULT sysdate, interval_time IN TEXT DEFAULT ‘null’, job OUT INTEGER)

当创建一个定时任务(JOB)时,系统默认将当前数据库和用户名与当前创建的定时任务绑定起来。该接口函数可以通过call或select调用,如果通过select调用,可以不填写出参。如果在存储过程中,则需要通过perform调用该接口函数。如果提交的sql语句任务使用到非public的schema,应该指定表或者函数的schema,或者在sql语句前添加set current_schema = xxx语句。

示例:

PKG_SERVICE.JOB_UPDATE

存储过程UPDATE修改定时任务的属性,包括任务内容、下次执行时间、执行间隔。

PKG_SERVICE.JOB_UPDATE函数原型为:

PKG_SERVICE.JOB_UPDATE( id IN BIGINT, next_time IN TIMESTAMP, interval_time IN TEXT, content IN TEXT)

示例:

存储过程SUBMIT_ON_NODES创建一个所有CN/DN上的定时任务,仅sysadmin有此权限。

PKG_SERVICE.SUBMIT_ON_NODES函数原型为:

示例:

PKG_SERVICE.ISUBMIT_ON_NODES

ISUBMIT_ON_NODES与SUBMIT_ON_NODES语法功能相同,但其第一个参数是入参,即指定的作业号,SUBMIT最后一个参数是出参,表示系统自动生成的作业号。仅sysadmin有此权限。

3 JOB的使用示例

检查Job运行结果

修改为2分钟执行一次

检查修改情况和运行结果

禁用和启用任务

禁用和启用都是同样的函数pkg_service.job_finish,传入不同的参数表示是禁用还是启用。

可以看到如果重新启用任务的时候,没有指定下次运行时间,那么下次运行时间会始终保持在4000年,意味着仍然不会启动,所以如果禁用任务之后再重新启动,需要手动显式指定下次运行时间。

墨天轮原文链接:https://www.modb.pro/db/137362?sjhy(复制到浏览器或者点击“阅读原文”立即查看)

关于作者

刘旭,2005开始接触数据库,2014年加入云和恩墨,从事过Oracle数据库优化、SQL审核和产品开发。现阶段主要参与MogDB数据库的测试和文档编写等相关工作。

oracle数据库采用SNP进程来管理和运行JOB,SNP进程和实例中其他进程最大区别是这个进程被杀掉后,系统就会自动重新启动一个SNP,因此并不影响oracle实例运行.SNP进程本身也是被系统周期性地调用去查看数据字典中的JOB序列目录,看是否有JOB需要去运行,运行之后SNP就进入休眠状态.唤醒,SNP被调用的时间的设置是在数据库初始化文件里通过参数job_queue_interval设置进行的,数据库在打开的时候根据初始化文件去初始化SNP进程。

一、SNP参数说明参数

job_queue_interval的粒度不能太大,不要大于JOB执行的间隔(由参数interval来决定),否则的话可能造成有的作业无法执行.粒度也不能太细,否则会使系统频繁调用SNP而增加了系统的吞吐量,所以一定要根据具体环境中JOB而设定.

参数job_queue_interval的设定了系统中最多可运行的SNP数量。

二、当SNP开始执行一个任务时,其过程如下:

1.以任务所有者的用户名开始一个新的数据库会话。

2.当任务第一次提交或是最后一次被修改时,更改会话NLS设置和目前就绪的任务相匹配。

3.通过interval日期表达式和系统时间,计算下一次执行时间。

4.执行任务定义的PL/SQL。

5.如果运行成功,任务的下一次执行日期被更新,否则,失败则日志文件中的计数加1。

6.经过JOB_QUEUE_INTERVAL秒后,又到了另一个SNP运行时间,重复上边的过程。

三、作业失败如何处理 

网上和书本上理论讲,当作业失败后,系统会在1分钟后重新运行这个JOB,如果还是失败,就在和第1次失败间隔2分钟的时候继续运行这个JOB,如果还是失败,就在和第2次失败相隔4分钟后运行这个JOB(可以用T=2t-1表 示,t表示第1次失败后检测的次数),直到T≥interval(JOB正常工作的时间设置参数)后,系统检测的时间间隔就为interval.直到第16次失败就会将这个job置为broken.但是这些介绍都很粗略,如果需要真正设计一些合理的job的时候就会忽略一些细微的问题,而这些细微的问题恰好是关键的地方.

提出问题:说明在oracle后台有这样的机制,就是需要判断T是否T≥interval,那么在job失败后是先判断呢,还是等1分钟后检测之后才判断.

实验之后得出结果:先判断,然后才检测,其中由于 *** 作误差,和理论值稍有轻微偏差.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6697892.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存