很多情况下,数据库管理员或用户需要自动调度和运行很多类型的作业,例如,执行维护工作(如数据库备份);数据加载和验证例程;
生成报表;收集优化程序统计信息或执行业务流程。可以使用调度程序功能指定任务在将来某个时间点运行。作业可以在数据库中、在驻留数据库实例的机器上甚至在远程机器上运行。
可以结合使用调度程序和Resource Manager(资源管理器)。调度程序可以激活Resource Manager计划,并按照为各种Resource Manager
使用者组指定的优先级来运行作业。
调度程序是在Oracle 10g版本中引入的,在11g版本中得到了大大增强。较早的数据库版本通过DBMS_JOB功能提供作业调度功能。为了达 达到向后兼容的目的,当前版本依然支持此功能,但它的功能多样性远不及调度程度。
1、调度程序体系结构
数据字典包含一个作为所有调度程序作业的存储点的表。可以通过DBA_SCHEDULER_JOBS视图查询此表。作业队列协调器后台进程CJQ0监视此表,根据需要启动作业队列进程Jnnn来运行作业。如果在任何定义的、活动的调度程序作业,就自动启动CJBQ0进程。根据需要启动Jnnn进程,但是最大数量受JOB_QUEUE_PROCESSES实例参数限制,该参数可以是0-1000(默认值)的任何值。如果将值设为0,那么将不会运行调程。
作业队列协调器从作业队列表中选取作业,将它们传递给作业队列进程执行。它还根据需要启动和终止作业队列进程。要查看当前正在运行的进程,可查询V$PROCESS视图。
select program from v$process where program like '%J%';
定义为过程的作业在数据库中运行。作业也可以定义为操作系统命令或shell脚本:这些将作为外部操作系统任务运行。作业的触发因素 可以是时间或事件。基于时间的作业根据时间表可能运行一次或重复运行。基本事件的作业在特定条件出现时运行。有一些预配置的事件, 也可以使用用户定义的事件。作业可以连接成链,根据作业成功与否对分支使用简单规则。
调度程度的一项高级功能是将期与Resource Manager相关联。某些作业可能需要优先运行,为此,可以链接作业与Resource Manager
使用都组,以便达到这个目的。还可以使用调度程序激活Resource Manager计划,而不需要通过更改ESOURCE_MANAGER_PLAN实例参数或使 用DBMS_RESOURCE_MANAGER.SWITCH_PLAN过程调用手动激活计划。
可以使用一个API-DBMS_SCHEDULER包来配置调度程序,通过一组数据字典视图监视它,或是用Database Control管理它。
2、调度程序对象
调度程序对象中最基本的对象是作业。作业可以是完全自包含的:它可以定义要执行的动作和执行时间。在更高级的配置中,作业只是由大量各种类型的调度程序对象组成的结构的一部分。
2.1 作业
作业(job)指定了要执行的动作以及执行动作的时间。
“ 要执行的动作”可以是匿名的PL/SQL块(可能由单条SQL语句构成)、PL/SQL存储过程(可调用JAVA存储过程或外部过程)、
或在服务器的文件系统中存储任何可执行文件(既可以是二进制可执行文件,也可以是SHELL脚本)。特别强大的功能(超出OCP 课程的范围)是远程外部作业,该作业在一台单独的机器上运行。
“执行动作的时间”指定了启动作业时的时间戳以及用于今后运行的重复时间间隔,或是触发事件。
DBMS_SCHEDULER.CREATE_JOB
2.2 程序
程序(program)在作业与其将要执行的动作之间提供了一个抽象层。程序是使用DBMS_SCHEDULER.CREATE_PROGRAM过程创建的。
通过从作业定义中取出作业内容并在程序中加以定义,就可以在不同的作业中引用相同的程序,从而不必进行多次定义就可以将
它与不同的时间表和作业类关联在一起。需要记住的是:就是作业而言,只有启用程序才能使用它。默认是不启用。
2.3 时间表
时间表(schedule)是指定作业运行时间与频率的规范。时间表的基本原理是从作业中取出执行作业的时间,然后将其与不同的的
作业关联。是时间表是使用DBMS_SCHEDULER.CREATE_SHEDULE