Oracle的任务调度

什么是自动维护任务:
自动维护任务是定期自动执行的维护数据库的操作任务,比如说:为了查看优化器而从数据库对象中采集统计信息的任务.自动维护任务在维护窗口(maintenance window)中运行,需要预先定义运行的时间间隔。可以根据资源使用模式来自定义维护窗口,或者禁用指定的维护窗口,创建自己的维护窗口。
Oracle数据库中包含下面三个预定义的自动维护任务:
a、优化程序统计信息收集:用于收集数据库中所有对象的优化统计数据。收集到的统计数据被SQL查询优化器用来改进SQL语句的执行效率。
b、段指导:Oracle的主动管理空间工具,用于标识有空闲空间可以重用的段,并且给出如何重组这些段的定义。
c、自动的进行SQL优化:负责高负载SQL语句的性能,并且给出调整这些语句性能的具体的建议。

维护窗口:
维护窗口是自动维护任务运行过程中的一个连续的时间间隔,是Oracle的调度窗口,它可以是简单的、重复的时间间隔,例如每个周五的五点钟到下午的六点钟,也可以是一个复杂的时间间隔,比如每个月的最后一个工作日的中午十二点到晚上的下午六点,并且排除法定节假日。
当维护窗口打开的时候,Oracle数据库会为每一个维护任务创建一个Oracle的作业调度,用于在窗口中调度维护任务。每个作业都会被生成一个作业名,所有的自动维护任务的作业名都以ORA$AT开头的,比如说Automatic Segment Advisor作业的名称可以使ORA$AT_SA_SPC_SY_20。当自动维护任务的作业结束的时候,它将被从Oracle调度作业系统中删除。
下面是Oracle预定义的几个维护任务:
a、MONDAY_WINDOW 每周一的晚上十点到第二天两点
b、TUESDAY_WINDOW 每周二的晚上十点到第二天两点
c、WEDNESDAY_WINDOW 每周三的晚上十点到第二天两点
d、THURSDAY_WINDOW 每周四的晚上十点到第二天两点
e、FRIDAY_WINDOW 每周五的晚上十点到第二天两点
f、SATURDAY_WINDOW 每周六的晚上十点到第二天两点
g、SUNDAY_WINDOW 每周日的晚上十点到第二天两点

Oracle的调度器:
为了简化对大量任务的调度,Oracle提供了一个任务调度器,它通过执行DBMS_SCHEDULER程序包中的过程和函数来实现,调度器可以完成下面的一些任务:
1)执行PL/SQL块、PL/SQL存储过程以及java的存储过程。
2)运行数据库外可执行程序,例如应用程序、脚本、批处理文件等等(2012/10/16 22:53 陈字文,今天为什么学习任务调度的原因。)
3)使用不同的方法调度作业的执行,比如说基于时间的调度,基于事件的调度以及独立的调度等等。
4)根据业务需求对作业排列优先级。
5)管理和监控作业。
6)在集群环境下执行和管理作业。
Oracle的主要调度器对象如下:
1)作业(Job),指用于描述用户定义任务的元数据的集合。
2)链(Chains),由使用独立规则组成的多个步骤组成,可以实现独立的调度。在链中,作业可以根据其他之前执行的作业的输出结果决定何时启动。
3)调度(Schedule),指定什么时候启动作业,以及执行的次数。
4)程序(Program),指定调度执行的程序,包括PL/SQL程序块、PL/SQL存储过程和JAVA存储过程等等。
5)作业类(Job Classes),相当于创建了一个作业组,可以将具有相同特性的作业放到相同的作业类中,然后通过作业类应用Oracle中的资源使用计划特征。
6)窗口(Window),表示一个时间段,在每天(或者每周、每月等)的这个时间段中可以自动执行指定的作业。
7)窗口组(Window Group),将窗口组合起来,以易于使用窗口,并且在运行作业时提供对窗口的更多控制。

作业表是所有作业的容器,每个数据库只有一个作业表。作业表中保存所有的作业的信息,例如所有者的名称,日志级别等等,因此它也会占用一定的数据库的空间。为了节约空间,可以通过设置作业的auto_drop属性,在作业完成之后,将其自动删除。
作业协调器是一个后台的进程,它可以自动运行。在数据库实例启动的时候,作业协调器不会自动的启动,但是数据库会监控是否存在需要执行的作业或者需要打开的窗口,并且根据实际的具体情况来决定是否需要启动作业协调器。
只要有作业或者窗口在运行,作业协调器就会运行。当Oracle调度器停止工作一段时间之后,而且没有其他的作业或者窗口被调度的时候,协调器将会被自动的停止。

作业协调器的主要功能如下:
1)控制和生成作业执行器
2)查询作业表
3)根据一定的规则从作业表中读取作业,并且将他们防止到内存高速缓冲器中。这样可以减少对磁盘的访问,从而提高工作效率。
4)从内存高速缓冲器中获取作业,把他们传送到作业执行器中执行。
5)当作业执行器不再使用的时候,清理作业执行器池。
6)如果没有被调度的作业,则休眠;当有新作业要执行或者使用CREATE_JOB存储过程创建了新作业的时候要被唤醒。
7)当数据非正常关闭然后再启动的时候,恢复正在运行的作业。

用户不需要设置作业协调器何时检查作业表,系统会自动处理。作业协调器会根据CPU利用率和未完成的作业数量来自动决定启动多少个作业执行器。

作业执行器的工作方式如下:
(1)收集运行作业所需要的所有元数据。例如,程序的参数和权限信息。
(2)启动作业所有者的数据会话,开始事务,然后开始执行作业。
(3)作业完成之后,执行器会提交并且结束事务。
(4)结束会话。

当作业执行完成之后,作业执行器会执行如下几个工作:
1)如果需要,则重新调度作业
2)更新作业表的状态,判断作业是否已经完成或者需要调度再次执行
3)向作业日志表中插入记录
4)更新正在运行的作业数量、运行失败的作业数量和重试的作业数量
5)寻找新的工作,如果没有,则进入休眠

作业
作业是主要的Oracle调度器对象,它包含两个基本的因素,即需要执行什么(动作)和什么时候执行(调度)。可以通过下面的一种方式来执行作业的动作:
a、作为作业属性,指定要运行的数据库程序单元或者外部可执行文件。
b、作为作业属性,指定要运行的程序对象的名称。
作业的所有者必须拥有要运行程序的EXECUTE权限或者EXECUTE ANY PROGRAM系统权限。

可以通过下面的方法来指定作业调度:
a、设置作业对象的属性,定义作业的开始时间、结束时间和重复周期
b、设置作业对象的属性,指定一个调度对象的名称。在调度对象中定义了作业的开始时间,结束时间和重复周期。

在创建并且启用作业之后,Oracle调度器将根据其调度信息自动运行作业。可以通过 系统视图来查看作业的运行状态和作业日志。

1、作业实例
作业实例代表一个正在运行的作业,只运行一次的作业只有一个实例,能够重复运行的作业则可以有多个实例,每次作业运行都代表一个实例,比如说:一个作业被每周二安排运行一次,则在周二的时候,会有一个该作业的实例。

2、作业参数
当作业中引用一个程序对象的时候,可以为作业提供参数。直到所有的程序参数都被指定之后,作业才能被启用。例如:有一个作业要在每天晚上为每一个部门生成一份报告,而且每个部门的报告格式又不相同。则该作业中运行的程序可以带一个参数,就是部门编号。用户在运行该作业的时候都需要指定一个部门编号作为作业的参数。

3、程序、作业、和调度之间的关系
P1到P10表示十个程序(Program),J1到J24表示24个作业(Job),S1到S4表示4个调度(Schedule)。这里假定P1是使用DMBS_STATS程序包来进行分析的程序,程序有一个参数,就是要分析的表名。J1和J2两个作业都指向相同的程序P1,但是它们在调用程序P1的时候使用不同的参数,也就是需要对不同的表进行表分析。调度S1可以指定在每天的凌晨1:00开始运行,这样J1和J2的两个作业中指定的表将在每天凌晨1:00进行分析。
作业J4没有指向任何的程序和调度,也就是说,在作业中已经包含了要执行的操作和执行的时间等信息。
P2、P9和S2演示了这样的一种情况,用户可以定义程序和调度,但是暂时没有作业应用他们。但是未来创建的作业可以引用这些程序和调度。
4、作业的分类
Oracle调度器支持下面四种作业类型:
a、数据库作业(Database Jobs):只运行数据库程序单元,包括PL/SQL语句块,PL/SQL存储过程和JAVA存储过程。
b、链作业(Chains Jobs):链是一种可以独立调度的调度器机制。在最简单的情况下,链中定义了一组程序对象和他们之间的依赖关系。链作业指定一个链,而不是一个程序,由链作业来启动链。
c、外部作业(External Jobs):可以使一个运行在数据库之外的操作系统可执行文件。
d、分离作业(Detached Jobs):调度器可以在多个进程中独立的、并发的启动分离作业中的一个脚本或者应用程序。
e、轻量作业(Lightweight Jobs):指的是运行时间很短、但是运行比较频繁的作业。

设置调度的重复时间间隔
通过设置作业的repeat_interval属性可以控制作业什么时候运行和多长时间重复运行一次.对repeat_interval属性进行计算的结果是一组时间戳,在每个时间戳上调度都会运行作业.调度会根据作业的开始时间来计算重复的时间戳.如果下一个时间戳到来的时候作业仍旧在运行,那么系统会创建一个新的作业实例,但是直到当前作业执行完成之后才会开始执行新的作业实例。在Oracle中,有两种方式来设置调度的重复时间间隔,如下:
使用日历表达式
日历表达式是设置作业的repeat_interval属性的一种主要方法.日历表达式一般可以分为三个部分,即频率、时间间隔以及附加参数。
频率使用FREQ关键字来指定,这是一个必选参数;
时间间隔使用INTERVAL关键字来指定,它的取值范围为1-999,这是一个可选参数;
附加参数用于指定日期和时间,它也是可选参数,例如BYMONTH、BYWEEKNO、BYYEARDAY、BYDAY、BYHOUR、BYMINUTE、BYSECOND等等。
例如,下面的日历表达式指定每两个小时运行一次调度:
'FREQ = HOURLY;INTERVAL=2;'
指定每天运行一次的日期表达式如下:
'FREQ = DAILY;'
指定每周一、三、五运行一次的日期表达式如下:
'FREQ = WEEKLY;BYDAY=MON,WED,FRI;'
指定每年的3、6、9、12月的2号运行一次的日期表达式如下:
'FREQ = YEARLY;BYMONTH=MAR,JUN,SEP,DEC;BYMONTHDAY =2;'
指定每隔周的周五运行一次的日期表达式如下:
'FREQ = WEEKLY;INTERVAL = 2;BYDAY = FRI;'
指定每月最后一天运行的日期表达式如下:
'FREQ = MONTHLY;BYMONTHDAY=-1;'
指定每年3月10号运行的日期表达式如下:
'FREQ = YEARLY;BYMONTH = MAR;BYMONTHDAY=10;'
或者
'FREQ = YEARLY;BYDATE = 0310;'
指定每天下午4点、5点、6点运行的日期表达式如下:
'FREQ = DAILY;BYHOUR = 16,17,18;'
指定每个月第二个星期三运行的日期表达式如下:
'FREQ = MONTHLY;BYDAY=2WED;'
指定每年最后一个星期五运行的日期表达式如下:
'FREQ = YEARLY;BYDAY = -1FRI;'
指定每个月前三天每小时运行一次的日期表达式如下:
'FREQ = HOURLY;BYMONTHDAY=1,2,3;'
使用PL/SQL表达式
也可以使用PL/SQL表达式来表示调度的重复时间间隔,PL/SQL表达式必须是时间或者时间戳.例如SYSDATE、SYSTIMESTAMP或者SYSTIMESTAMP + INTERVAL '30' MINUTE等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值