一、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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)