主要组件和步骤
- 组件
- 作业”指定需要执行的内容和执行时间。
- “计划”指定执行作业的时间和次数。
- “程序”是有关特定可执行文件、脚本或过程的元数据集合。
- 步骤
- 创建程序
- 管理-->程序--->创建
-
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name => 'CALC_STATS2',
program_action =>
'HR.UPDATE_HR_SCHEMA_STATS',
program_type =>
'STORED_PROCEDURE',
enabled => TRUE);
END;
/ - 创建并使用计划
- 管理--->调度-->创建
-
BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE(
schedule_name => 'stats_schedule',
start_date => SYSTIMESTAMP,
end_date => SYSTIMESTAMP + 30,
repeat_interval =>
'FREQ=HOURLY;INTERVAL=1',
comments => 'Every hour');
END;
/ - 创建并提交作业
- 管理-->作业-->创建
- 监视作业
- [DBA|ALL]_SCHEDULER_JOB_RUN_DETAILS 视图
- LOG_ID:日志条目的唯一标识符
- LOG_DATE:日志条目的时间戳
- OWNER:作业的所有者
- JOB_NAME:作业的名称
- STATUS:作业执行的状态
- ERROR#:遇到的第一个错误的编号
- REQ_START_DATE:作业计划启动的时间
- ACTUAL_START_DATE:作业实际启动的时间
- RUN_DURATION:作业执行的持续时间
- INSTANCE_ID:运行作业的实例
- SESSION_ID:运行作业的会话
- SLAVE_PID:用于执行作业的从属进程的进程 ID
- CPU_USED:作业运行所用的CPU 量
- ADDITIONAL_INFO:有关作业运行的附加信息
计划
- 调度
- 时间
- 事件
- 创建基于时间的作业
- 示例
-
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;
/ - job_type
- PLSQL_BLOCK:匿名 PL/SQL 块
- STORED_PROCEDURE:命名的PL/SQL、Java 或外部过程
- EXECUTABLE:可以从操作系统命令行执行的命令
- job_action 参数可以是要运行过程的名称、脚本的名称或操作系统命令的名称,也可以是匿名的 PL/SQL 代码块,具体取决于 job_type参数的值。
- 创建基于事件的调度
- 必须设置
- 队列说明(应用程序将消息入队以启动作业) queue_spec
- 事件条件(与 Oracle Streams AQ 规则条件的语法相同),如果为 TRUE 则启动作业 event_condition
- 示例:创建一个作业,如果成批装入的数据文件在上午 9:00 之前到达文件系统,则运行此作业。
-
-
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name=>'ADMIN.PERFORM_DATA_LOAD',
job_type => 'EXECUTABLE',
job_action => '/home/usr/dba/rman/report_failure.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;
-
- 基于事件的调度
- 类型
- 用户或应用程序生成的事件:应用程序可以引发由调度程序使用的事件。调度程序通过启动作业来回应事件。
- 调度程序生成的事件:调度程序可以引发事件来指示在调度程序自身内发生的状态更改。
- 创建复杂调度
- INCLUDE:向日历表达式结果中添加日期列表
- EXCLUDE:从日历表达式结果中删除日期列表
- INTERSECT:只使用两个或多个计划公用的日期
作业链
- 概述
- 链是为达到组合目标而链接在一起的一系列已命名的程序。
- 一个相关程序链中的每个位置都称为一个步骤
- 创建步骤
- 使用 CREATE_CHAIN 过程创建链
- 定义(一个或多个)链步骤
- 程序
- 另一个链(嵌套链)
- 事件
- 创建链对象后,请定义链规则
- DEFINE_CHAIN_RULE 向链中添加每个规则时均需要调用一次此过程
- 每个规则都有一个条件和操作
- 启动链
- 用 ENABLE 过程启用链。
- 要运行链,必须创建类型为“CHAIN”的作业。作业操作必须引用链名称。
- 监视作业链
- ALL_SCHEDULER_CHAINS 视图
- 链所有者和名称;链的规则集名称和规则集所有者;规则数;步骤数;是否启用链;链是否使用求值间隔;以及链是否使用用户定义的规则集
- ALL_SCHEDULER_CHAIN_RULES 视图
- 为其定义规则的链的名称和所有者;规则名、所有者和条件;以及在条件求值结果为 TRUE 时要执行的操作
- ALL_SCHEDULER_CHAIN_STEPS 视图
- 为其创建步骤的链的名称和所有者;步骤名;程序名和所有者;是否应跳过步骤;以及步骤在完成后是否应暂停
- ALL_SCHEDULER_RUNNING_CHAINS 视图
- 链名称和所有者;指向链的作业的名称和所有者;链中步骤的名称及其当前状态;链步骤遇到的错误;链步骤开始和结束的时间;完成步骤所用的时间;以及运行步骤的作业的名称
高级概念
- 概念
- “窗口”由定义好起始时间和结束时间的时间间隔表示,用于在不同时间激活不同的资源计划。
- “窗口组”表示一系列窗口,使用它可以更轻松地管理窗口。
- “作业类”定义作业的类别,这些作业共享公用资源使用要求及其他特性。
- 创建作业类
- 管理-->作业类-->创建
-
-
EXECUTE DBMS_SCHEDULER.CREATE_JOB_CLASS( -
job_class_name => 'ADMIN_JOBS', -
resource_consumer_group => 'DAYTIME_JOBS', -
logging_level => DBMS_SCHEDULER.LOGGING_OFF);
-
- 创建窗口
-
/*为十二月份创建一个使用 END_OF_YEAR 资源计划的窗口,
并且此窗口在每晚从东部标准时间 (EST) 下午 6:00 到第二天
上午 6:00 有效。*/
BEGIN
DBMS_SCHEDULER.CREATE_WINDOW(
window_name => 'DEC_NIGHTS',
resource_plan => 'END_OF_YEAR',
start_date => '01-DEC-03 06.00.00 PM EST',
repeat_interval => 'FREQ=DAILY; BYHOUR=18',
duration => '0 12:00:00',
end_date => '31-DEC-03 06.00.00 AM EST',
comments => 'Every day at 6:00 PM');
END;
/ - 区分窗口内作业的优先级
- 两个级别
- 级别区分优先级,使用的是资源计划
- 在类内区分优先级,使用的是作业的作业优先级属性
- 仅当属于同一类的两个作业同时启动时,才会考虑优先级。优先级较高的作业先启动。
- 不能确保不同作业类中的作业按其优先级运行。