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

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

10g

中新推出的SCHEDULER可能确实会让很多初接触的朋友感觉晕头晕脑,相比之前的jobs,SCHEDULER中新增的概念太多。比如说jobs,仍

然可以理解成之前版本中的jobs,不过功能更加强大(注意10g中也仍然可以使用普通jobs,这是废话,相信看本篇文章的朋友目前应该还是这样在

用),比如说program,指的是运行的程序(把要做什么单提出来了),比如说schedule,我将其翻译为调度(job我翻译为任务),定义执行的

频率或者说周期。

3.1 创建和管理Schedule s

Schedule ,中文直译的话应该理解成调度,从名字来看,它是一个逻辑实体(逻辑,还实体,好矛盾),就是说当创建了schedule之后,数据库中就肯定存在这一对象,只不过这一对象是用来描述job的执行周期。

创建schedule可以通过DBMS_SCHEDULER.CREATE_SCHEDULE过程,该过程支持的参数如下:

SQL>

desc dbms_scheduler.create_scheduleParameter

Type Mode Default? ---------------

------------------------ ---- -------- SCHEDULE_NAME

VARCHAR2 INSTART_DATE TIMESTAMP WITH

TIME ZONE IN YREPEAT_INTERVAL VARCHAR2

INEND_DATETIMESTAMP WITH TIME ZONE IN Y

COMMENTSVARCHAR2 IN Y

各参数分别代表含意如下:

SCHEDULE_NAME :指定schedule名称,注意名称不能重复。

START_DATE :指定该调度的开始时间,可为空,当为空时表示该调度暂不起用。

REPEAT_INTERVAL :指定调度的执行频率或周期。

END_DATE :指定调度的结束时间,可为空,为空时就表示该调度将一直进行。

COMMENTS :注释信息。

这其中,比较有技术含量的是REPEAT_INTERVAL参数,对于这个参数大家应该不会太陌生,因为前面介绍Jobs,也曾经提到过同名的参

数,Schedules中的REPEAT_INTERVAL参数和Jobs中的REPEAT_INTERVAL参数功能完全相同,甚至参数格式也一模一

样。

REPEAT_INTERVAL 参数的语法结构要复杂的多。其中最重要的是FREQ和INTERVAL两个关键字。

FREQ 关键字用来指定间隔的时间周期,可选参数有:YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, and SECONDLY,分别表示年、月、周、日、时、分、秒等单位。

INTERVAL 关键字用来指定间隔的频繁,可指定的值的范围从1-99。

比如说,当指定REPEAT_INTERVAL=>'FREQ=DAILYINTERVAL=1'就表示每天执行一次,如果将INTERVAL改为7就表示每7天执行一次,效果等同于FREQ=WEEKLYINTERVAL=1。

下面,创建一个schedule,指定调度为每周一次的频率,执行脚本如下:

SQL>

begin 2 DBMS_SCHEDULER.CREATE_SCHEDULE ( 3schedule_name

=>'my_first_schedule', 4start_date=>SYSDATE, 5

repeat_interval =>'FREQ=WEEKLYINTERVAL=1', 6

comments =>'Every 1 weeks') 7 END 8 /PL/SQL procedure

successfully completed.

查询当前已经创建的schedules,可以通过*_SCHEDULER_SCHEDULES视图(含DBA_,ALL_,USER_),例如,查看当前用户拥有的schedules,执行语句如下:

SQL>

select schedule_name,repeat_interval from

user_scheduler_schedulesSCHEDULE_NAME

REPEAT_INTERVAL------------------------------

------------------------------MY_FIRST_SCHEDULE

FREQ=WEEKLYINTERVAL=1

如果要修改schedule属性的话,也是使用

DBMS_SCHEDULER.SET_ATTRIBUTE过程,该过程的调用方式前面已经多次演示过,这里就不再重复举例了,仅说明一点,对于

schedule来说,能够修改的属性包括:REPEAT_INTERVAL、COMMENTS、END_DATE、START_DATE以及

EVENT_SPEC。

至于删除schedule,再简单不过,执行DBMS_SCHEDULER.DROP_SCHEDULE过程即可,例如:

SQL>EXEC DBMS_SCHEDULER.DROP_SCHEDULE('MY_FIRST_SCHEDULE')PL/SQL procedure successfully completed.


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

原文地址: https://outofmemory.cn/sjk/9743944.html

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

发表评论

登录后才能评论

评论列表(0条)

保存