1 持久的轻量级的工作
持久的轻量级的工作:
减少启动作业所需的开销和时间
磁盘占用空间小,用于作业元数据和存储运行时数据
从作业模板创建(在命令行中),如:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'my_lightweight_job2',
program_name => 'MY_PROG',
schedule_name => 'MY_SCHED',
job_style => 'LIGHTWEIGHT');
END;
/
在以上示例中,MY_PROG是作业模板,调度是从一个命名的调度应用的。
一个轻量级的工作:
是为那些需要一秒钟创造数百个job的客户准备的。对于常规作业,每个作业创建一个描述该作业的数据库对象,修改多个表,并在过程中创建redo。与这种工作需求相关的开销是巨大的。在Oracle数据库调度器中,有一个持久的轻量级作业。轻量级作业的目标是减少启动作业所需的开销和时间。为作业创建的元数据量最小。这减少了所需的时间,并在作业开始时重新创建。
在磁盘上占用的空间很小,用于作业元数据和存储运行时数据。磁盘占用空间小也使得在RAC环境中实现负载平衡成为可能。
总是从作业模板创建。作业模板必须是存储过程或程序。存储过程保存作业所需的所有信息,包括特权。可以指定几个作业属性:作业参数和调度。
必须在命令行中创建。JOB_STYLE参数在EMCC中不可用。
2 基于时间或事件的调度
若要为作业指定基于时间的计划,可以指定日历表达式或日期-时间表达式。使用日历表达式时,作业的下一个开始时间将通过使用重复间隔和作业的开始日期计算。当使用日期-时间表达式时,指定的表达式将确定作业应该下一次运行的时间。如果没有指定重复时间间隔,作业只在指定的开始日期运行一次。
如果作业使用基于事件的调度,则作业在引发事件时运行。在较高的级别上,事件可以被视为状态的变化。当布尔条件的状态从FALSE变为TRUE或TRUE变为FALSE时,就会发生事件。
调度程序使用Oracle Streams高级队列(AQ)来引发和使用事件。
注意:调度程序不能保证作业在正确的时间执行,因为系统可能超载,因此资源可能不可用。
2.1 创建Time-Based Schedule
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name=>'HR.DO_BACKUP',
job_type => 'EXECUTABLE',
job_action => '/home/usr/dba/rman/nightly_incr.sh',
start_date=> SYSDATE,
repeat_interval=>'FREQ=DAILY;BYHOUR=23', /* next night at 11:00 PM */
comments => 'Nightly incremental backups');
END;
/
使用DBMS_SCHEDULER包的CREATE_JOB过程创建作业。在默认情况下,创建作业时是禁用的,只有在显式启用作业时,作业才成为活动的和计划的。所有作业名称的形式为:[SCHEMA.]NAME。
应该使用SYSTIMESTAMP并指定一个时区,以便当时间因夏时制而改变时,作业自动调整其执行时间。
默认情况下,在当前模式中创建作业。也可以在另一个模式中创建作业
作业所有者是在其模式中创建作业的用户,而作业创建者是创建作业的用户。作业以作业所有者的权限执行。作业运行时的国家语言支持(NLS)环境与创建作业时的环境相同。JOB_TYPE参数表示作业要执行的任务类型。可能的值为:
PLSQL_BLOCK:匿名PL/SQL块
STORED_PROCEDURE:命名的PL/SQL、Java或外部过程
可执行命令:可以从操作系统命令行执行的命令
2.2 创建Event-Based Schedule
JOB_ACTION参数可以是要运行的过程的名称、脚本或操作系统命令的名称、或匿名PL/SQL代码块,具体取决于JOB_TYPE参数的值。
JOB_TYPE被指定为可执行文件,而JOB_ACTION是所需外部可执行文件的完整os依赖路径加上任意命令行参数。
外部作业是在数据库外部运行的作业。所有外部作业都以低特权的来宾用户运行,这是由数据库管理员在配置外部作业支持时确定的。因为可执行文件是作为低特权的来宾帐户运行的,所以应该验证它能够访问必要的文件和资源。大多数(但不是所有)平台支持外部工作。对于不支持外部作业的平台,创建或设置作业或程序的属性为键入可执行文件将返回错误
作业可以根据事件触发。应用程序可以通过将消息排队到Oracle Streams队列中来通知调度程序启动作业。以这种方式启动的作业称为基于事件的作业。要创建基于事件的作业,必须使用CREATE_JOB过程设置以下两个额外属性:
QUEUE_SPEC:队列规范,其中包括应用程序将消息放入队列以引发作业启动事件的队列名称,或者在安全队列中为<queue_name>、<agent_name>对
EVENT_CONDITION:基于消息属性的条件表达式,必须计算为TRUE,消息才能启动作业。如果消息有效负载是用户定义的对象类型,并且在表达式中使用TAB.USER_DATA作为对象属性的前缀,则可以在表达式中包含用户数据属性。
可以将QUEUE_SPEC和EVENT_CONDITION指定为内联作业属性,或者使用这些属性创建一个基于事件的调度,然后创建一个引用该调度的作业。
2.3 示例:
创建一个作业,如果批加载数据文件在上午9点之前到达文件系统,该作业就会运行。
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name=>'ADMIN.PERFORM_DATA_LOAD',
job_type => 'EXECUTABLE',
job_action => '/loaddir/start_my_load.sh',
start_date => SYSTIMESTAMP,
event_condition => 'tab.user_data.object_owner = ''HR'' and tab.user_data.object_name = ''DATA.TXT'' and tab.user_data.event_type = ''FILE_ARRIVAL'' and tab.user_data.event_timestamp < 9 ',
queue_spec => 'HR.LOAD_JOB_EVENT_Q');
END;
要将事件信息指定为作业属性,可以使用CREATE_JOB的替代语法,其中包括QUEUE_SPEC和EVENT_CONDITION属性。作业可以将事件信息内联包含为作业属性,也可以通过指向事件计划来指定事件信息。
示例显示了一个作业,当文件到达操作系统时启动,只要文件在上午9点之前到达。假设消息有效负载是一个具有四个属性的对象,分别为OBJECT_OWNER、OBJECT_NAME、EVENT_TYPE和EVENT_TIMESTAMP。
这个例子使用了一个用户定义的事件。因此,在此作业启动之前,当文件到达文件系统时,程序或过程必须将带有适当信息的事件对象类型放入指定的事件队列。人力资源。LOAD_JOB_EVENT_Q队列必须与用于通知调度程序事件发生的事件对象类型相同。那就是人力资源。LOAD_JOB_EVENT_Q队列必须是类型化队列,其中类型有四个属性,分别为OBJECT_OWNER、OBJECT_NAME、Event_type和EVENT_TIMESTAMP。
2.4 事件的类型
事件的类型:
User-generated or application-generated events
Scheduler-generated events
可以创建一个作业,该作业直接引用一个事件作为启动该作业的手段,而不是为该作业分配一个调度。有两种类型的事件:
用户生成的事件或应用程序生成的事件:应用程序可以引发由调度程序使用的事件。调度程序通过启动作业来响应该事件。这类事件的一个例子是:一个正在运行的作业完成;文件到达文件系统;数据库中的帐户被锁定;库存也达到了一个较低的门槛。
调度器生成的事件:调度器可以引发一个事件来指示在调度器本身内发生的状态更改。例如,调度器可以在作业开始、作业完成、作业超过分配的运行时间等情况下引发事件。事件的消费者是一个应用程序,它执行一些动作来响应事件。
可以配置一个作业,以便调度程序在作业的状态改变时引发一个事件。这可以通过设置RAISE_EVENTS作业属性来实现。默认情况下,除非更改作业的RAISE_EVENTS属性,否则作业不会引发任何状态更改事件。要更改此属性,必须首先使用CREATE_JOB过程创建作业,然后使用SET_ATTRIBUTE过程修改属性的默认值。实例表明,人力资源管理。DO_BACKUP作业被更改,因此如果作业失败,它将引发一个事件。
在为作业启用作业状态更改事件后,调度器通过将消息排队到默认事件队列SYS.SCHEDULER$_EVENT_QUEUE来引发这些事件。
默认调度程序事件队列是安全队列。根据应用程序,可能必须配置队列,以允许某些用户对其执行操作。
默认的调度器事件队列主要用于调度器生成的事件。Oracle不建议用户应用程序或用户定义事件使用此队列。




