数据库中job干吗用的?

数据库中job干吗用的?,第1张

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分钟后检测之后才判断.

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

将下面的存储过程名称换成实际的存储过程名称,就可以实现您要的功能的,

现为你写的,直接在pl/sql dev里面执行就行了,有啥问题再联系我。

上面一段是删除job,后面的是建立job,我写了判断语句,可以随意执行

参考oracle的 dbms_job包。

---------------------华丽丽的分割线----------------------------

DECLARE

i_count number

job_num number

BEGIN

select count(job) into i_count from user_jobs where upper(what)='存储过程名称'

if i_count>0 then

select job into job_num from user_jobs where upper(what)='存储过程名称'

dbms_job.remove(job_num)

end if

END

/

commit

DECLARE X NUMBER

BEGIN

DBMS_JOB.SUBMIT

( job      => X

,what      => '存储过程名称'

,next_date => to_date(to_char(sysdate+1,'yyyy-mm-dd')||' 01:00:00','yyyy-mm-dd hh24:mi:ss')

,interval  => 'SYSDATE+1'

,no_parse  => TRUE

)

END

/

commit

1、把init.ora中如下两个参数打开

JOB_QUEUE_INTERVAL=60

JOB_QUEUE_PROCESSES=4

job_queue_keep_connections=true

然后重启一个库,如果原来已经打开了则不用这步了

2、示例,以下由sqlplus 来执行,具体参照一下相关的文档

VARIABLE jobno number

BEGIN

DBMS_JOB.SUBMIT(:jobno,

’p_test’

SYSDATE,’SYSDATE + 1/72’)

commit

END

DBMS_JOB.SUBMIT(:jobno,//job号

’your_procedure’,//要执行的过程

trunc(sysdate)+1/24,//下次执行时间

’trunc(sysdate)+1/24+1’//每次间隔时间

)

删除job:dbms_job.remove(jobno)

修改job:dbms_job.what(jobno,what)

修改下次执行时间:dbms_job.next_date(job,next_date)

修改间隔时间:dbms_job.interval(job,interval)

停止job:dbms.broken(job,broken,nextdate)

启动job:dbms_job.run(jobno)

例子:

VARIABLE jobno number

begin

DBMS_JOB.SUBMIT(:jobno,

’Procdemo’,

SYSDATE, ’SYSDATE + 1/720’)

commit

end


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存