• 使用调度程序来简化管理任务
• 创建作业、程序和调度
• 监视作业执行
• 使用基于时间或基于事件的调度来执行调度程序作业
• 描述窗口、窗口组、作业类和使用者组的用途
• 使用电子邮件通知
• 使用作业链来执行一系列相关任务
• 描述远程系统上的调度程序作业
• 使用高级调度程序概念来区分作业的优先级
- 简化管理任务
Oracle 环境中的许多任务都需要作业调度功能。例行的数据库维护和应用程序逻辑要求定
期调度并运行作业。企业到企业(B2B) 应用程序要求对其业务事件进行调度。DBA 需要
在指定时间窗口中调度定期维护作业。
Oracle DB 通过数据库调度程序提供高级调度功能,此调度程序是
DBMS_SCHEDULER程
序包中函数和过程的集合。可以在任何SQL 环境中,或者通过Oracle Enterprise Manager
(EM) 来调用此调度程序。
使用此调度程序,数据库管理员和应用程序开发者可以控制在数据库环境中执行各种任务
的时间和位置。这些任务可能既耗时又复杂;可以使用调度程序来管理和计划这些任务。
可以根据时间或者在发生指定事件时启动调度程序作业,而且调度程序还可以在作业状态
更改时(例如,从RUNNING变为COMPLETE)引发事件。还可以使用为达到组合目标
而链接在一起的一系列已命名的程序。
- 核心组件
核心组件和主要步骤
一个作业包含两个必需组件:
需要执行的操作,操作的发生时间或调度。“操作”是由命
令区域和作业属性中的job_type和job_action参数表示的。“时间”是在调度中表
示的,调度可以基于时间或事件,或者从属于其它作业的结果。
调度程序使用以下基本组件:
•
“作业”指定要执行的操作。它可以是PL/SQL 过程、纯二进制可执行文件、Java 应
用程序或Shell 脚本。可以将程序(内容)和调度(时间)指定为作业定义的一部分,
也可以改用现有的程序或调度。可以使用作业的参数来定制其运行时行为。
•
“调度”指定作业的执行时间和次数。调度可以基于时间或事件。可以为作业定义调
度,方法是使用一系列日期、一个事件,或两者相结合,以及表示重复间隔的附加说
明。可以单独存储作业的调度,然后对多个作业使用同一个调度。
• “程序”是有关特定可执行文件、脚本或过程的元数据集合。自动作业将执行某个任
务。使用程序,无需修改作业本身即可修改作业任务或者“内容”。可以定义程
序的参数,使用户可以修改任务的运行时行为。
- 基本工作流
使用调度程序来简化管理任务:
1. 创建程序(启用或禁用)- 可选
– 在多个作业中重用此操作
– 在无需重新创建PL/SQL 块的情况下更改作业的调度
2. 创建并使用调度
3. 创建并提交作业
可以在Oracle Enterprise Manager 的图形环境中执行所有步骤,或者通过命令行使用
DBMS_SCHEDULER PL/SQL 程序包执行所有步骤。
1. 创建程序
使用
CREATE_PROGRAM过程来创建程序。使用调度程序时,创建程序是一个可选部分。
还可以对操作进行编码,使其在CREATE_JOB过程的匿名PL/SQL 块中执行。通过单
独创建程序,可以定义一次操作,然后在多个作业中重用此操作。使用这种方法,无须
重新创建PL/SQL 块即可更改作业的调度。
默认情况下,程序是以禁用状态创建的(除非enabled参数设为TRUE)。在将禁用的
程序启用之前,作业无法执行此程序。可以通过将enabled的值指定为TRUE来指定
应以启用状态创建程序。
2. 创建并使用调度
作业的调度可以是预定义的调度(用CREATE_SCHEDULE过程创建的),也可以是在创
建作业时定义的。
调度指定有关作业运行时间的属性,例如:
• 起始时间,定义作业从哪一时间开始执行;结束时间,指定作业在哪一时间之后失效
且不再进行调度
• 指定作业重复间隔的表达式
• 通过组合现有调度创建的复杂调度
• 启动作业之前必须满足的条件或状态变化(称为事件)
通过使用调度(而不是在作业定义中指定作业的执行次数),可以管理多个作业的预定
执行,而无须更新多个作业定义。如果修改了某个调度,则使用该调度的每个作业都将自
动使用新调度。
3. 创建并运行作业
作业是一个组合,其中包括调度、要执行的操作的说明以及作业需要的所有附加参数。可
以为作业设置许多属性。属性将控制作业的执行方式。
作业操作在程序中(而不是直接在作业中)时,无需
重新创建PL/SQL 块即可更改作业调度。
每个作业必须有一个调度。调度可以是预定义的,也可
以在创建作业的过程中定义。
- 持久轻量作业
持久轻量作业:
• 减少启动作业所需的开销和时间
• 作业元数据和运行时数据在磁盘上占用很小的空间
• 是使用作业模板(在命令行中)创建的
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'my_lightweight_job2',
program_name => 'MY_PROG',
schedule_name => 'MY_SCHED',
job_style => 'LIGHTWEIGHT');
END;
/
选择合适的作业类型:
–使用常规作业可提供最大灵活性。
–需要在很短的时间内创建大量作业时,请使用持久轻量作业。
轻量作业:
• 适合需要在一秒内创建数百个作业的客户。对于常规作业,每个作业都要创建一个数
据库对象,用于描述作业、修改多个表以及在进程中创建重做。此种类型作业需求的
相关开销是很大的。在Oracle DB 调度程序中,有一种“持久轻量作业”。轻量作业
的目的是减少启动作业所需的开销和时间。将为作业创建极少的元数据。这可以减少
启动作业时所需的时间和创建的重做。
• 作业元数据和运行时数据在磁盘上占用很小的空间。在磁盘上占用的空间小还可实现
在RAC 环境中进行负载平衡。
• 始终是使用作业模板创建的。作业模板必须是一个存储过程或一个程序。存储过程可
以保存作业所需的所有信息,包括权限。只可以指定少量作业属性:作业参数和调度。
• 必须在命令行中创建。JOB_STYLE参数在EM 中不可用。
在示例中,MY_PROG是作业模板,调度是通过已命名的调度应用的。
- 使用基于时间的或基于事件的调度
要为作业指定基于时间的调度,可以指定日历表达式或日期时间表达式。使用日历表达式
时,将使用作业的重复间隔和起始日期来计算作业的下一启动时间。使用日期时间表达式
时,指定的表达式确定作业下次应运行的时间。如果没有指定重复间隔,作业将只在指定
的起始日期运行一次。
如果作业使用基于事件的调度,作业将在事件发生时运行。在较高层次上,可以将事件视
为状态的更改。布尔条件的状态从FALSE更改为TRUE,或者从TRUE更改为FALSE时,
将发生事件。
调度程序使用Oracle Streams Advanced Queuing (AQ) 来引发和使用事件。
注:调度程序不保证作业恰好在计划的时间执行,因为可能会由于系统过载而造成资源不
可用。
- 创建基于时间的作业
示例:创建一个作业,从今晚起在每晚11:00 调用备份脚本。
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过程来创建作业。默认情况下将以