oracle scheduler(七)使用W…

Oracle Scheduler的Windows特性提供了一种时间窗口的概念,用于管理job的资源使用。Windows允许在特定时间范围内调整job的资源分配,从而在系统负载低时让job使用更多资源,而在高负载时段限制其资源使用,减少对其他业务的影响。创建Window主要通过dbms_scheduler.create_window过程,并可通过设置resource_plan, duration等参数进行管理。此外,WINDOW GROUP可以包含多个WINDOW,用于管理长时间运行的job资源调度。" 81301976,5509101,Haproxy与KeepAlived构建高可用负载均衡,"['高可用', 'haproxy', 'keepalived', '负载均衡']
摘要由CSDN通过智能技术生成

七、使用Windows

      此处所说的Windows,是指SCHEDULER 特性中的一个子项。在SCHEDULER 中,WINDOW 对应的是一个时间窗口的概念。我们知道普通的jobs 是没有运行时间管理的概念的,就是说一个job 启动之后,用户只能被动地等待其执行,一直到其执行地任务完成(或DBA 手动kill 对应进程),在此期间,执行的job 将与其它活动的进程共同竞争当前系统中的资源。

      对于大型数据库系统,系统资源那可是相当宝贵的,在9i 之前,谁想用就用,谁也管不了,其中表现最甚的就是job。你是否想起了Job Classes,没错定义Job Classes 确实可以控制job 能够使用的资源,不过单单使用Job Classes 并不能灵活的控制job 在合适的时间使用适当的资源。

      进入10g之后,SCHEDULER 中提供了WINDOW,事情终于有了缓解。WINDOW 可以指定一个时间窗口,在此期间,通过与Job Classes 的搭配组合,能够有效控制job 执行时支配(使用)的资源。比如说job 通常是在凌晨服务器负载较低时执行,那么就可以通过WINDOW 设置在此期间,允许jobs 使用更多的系统资源,而到了工作时间后,如果job 仍未执行完成,为其分配另一个有限的资源,以尽可能降低job 执行占用的资源对其它业务的影响。


1、创建Window

        创建window 有一个专门的过程:dbms_scheduler.create_window 进行处理,该过程有两种调用方式,如下:

--基于SCHEDULE

DBMS_SCHEDULER.CREATE_WINDOW (

window_name IN VARCHAR2,

resource_plan IN VARCHAR2,

schedule_name IN VARCHAR2,

duration IN INTERVAL DAY TO SECOND,

window_priority IN VARCHAR2 DEFAULT 'LOW',

comments IN VARCHAR2 DEFAULT NULL);

--基于定义的调度

DBMS_SCHEDULER.CREATE_WINDOW (

window_name IN VARCHAR2,

resource_plan IN VARCHAR2,

start_date IN TIMESTAMP WITH TIME ZONE DEFAULT NULL,

repeat_interval IN VARCHAR2,

end_date IN TIMESTAMP WITH TIME ZONE DEFAULT NULL,

duration IN INTERVAL DAY TO SECOND,

window_priority IN VARCHAR2 DEFAULT 'LOW',

comments IN VARCHAR2 DEFAULT NULL);

下列几个参数可能需要关注:

(1) Resource_plan:这一参数用来指定要使用的资源使用计划,当打开WINDOW 时,就会自动按照指定的资源使用计划中的设置分配资源,当WINDOW 关闭时,系统会自动切换回适当资源计划。这个参数在执行过程时甚至可以指定为NULL 或空值'',当设置为NULL 时,就表示使用默认的资源计划,当设置为空值''时,表示禁用资源使用计划。

(2) Duration:指定WINDOW 的有效期,比如说指定为interval '5' hour 就表示5 个小时,该参数在执行过程时必须指定参数值,否则创建会报错。

(3) Window_priority:该参数用来指定WINDOW 的优先级。因为在相同时间只有一个WINDOW 有效,因此如果在创建WINDOW 时发现重叠的情况,ORACLE 就需要根据这一参数指定的规则,来确定优先级,说白了就是先把资源给谁用,这一参数有两个可选值:HIGH 或LOW,默认值为LOW。

      正如前面CREATE_WINDOW 过程语法结构显示的那样,调用该过程有两种方式,差异就在于是指定现有定义好的调度SCHEDULE,还是在执行过程时指定调度,目标和实现的功能都是相同的,这里仅做示例,咱就挑个最复杂的方式吧,执行过程时指定调度,执行脚本如下:


SQL> begin

dbms_scheduler.create_window(

window_name => 'my_first_wd1',

resource_plan => null,

start_date => sysdate,

repeat_interval => 'FREQ=DAILY; INTERVAL=5',

duration => interval '1' hour);

end;

/

PL/SQL procedure successfully completed.


查询当前拥有的WINDOW,可以通过*_SCHEDULER_WINDOWS视图(注意只有DBA 和ALL,没有USER,因为所有定义的WINDOW 都属于SYS 用户)。除了*_SCHEDULER_WINDOWS 视图显示当前所有WINDOW外,还有:

(1) *_SCHEDULER_WINDOW_DETAILS 视图:显示WINDOW 的详细信息;

(2) *_SCHEDULER_WINDOW_LOG 视图:显示WINDOW 的日志,比如打开和关闭;

2、管理Window

修改对象属性,使用SET_ATTRIBUTE 过程;

SQL> exec dbms_scheduler.set_attribute('sys.my_first_wd1','start_date',sysdate 1);

PL/SQL procedure successfully completed.

 
ENABLE 对象,使用ENABLE 过程;

SQL> exec dbms_scheduler.enable('sys.my_first_wd1');

PL/SQL procedure successfully completed.

 
DISABLE 对象,使用DISABLE 过程;

SQL> exec dbms_scheduler.disable('sys.my_first_wd1');

PL/SQL procedure successfully completed.

 
删除对象,使用DROP_WINDOW 过程;

SQL> exec dbms_scheduler.drop_window('sys.my_first_wd1');

PL/SQL procedure successfully completed.

      除此之外呢,对于WINDOW 对象来说,由于其特殊作用,又有: 手动打开WINDOW,使用OPEN_WINDOW 过程;注意WINDOW 是依赖于其调度的,因此在手动打开WINDOW 时,必须为其指定duration 属性:

SQL> exec dbms_scheduler.open_window('sys.my_first_wd1',interval '1' hour);;

PL/SQL procedure successfully completed.

 
手动关闭WINDOW,使用CLOSE_WINDOW 过程;

SQL> exec dbms_scheduler.close_window('sys.my_first_wd1');

PL/SQL procedure successfully completed.


            关闭和打开WINDOW,都会记录日志,大家可以通过*_SCHEDULER_WINDOW_LOG 视图中获取这部分信息。


3、关于WINDOWGROUP

            除了WINDOW 外,还有一个与WINDOW 有关系的叫WINDOW GROUP,一个WINDOW GROUP 可能包含多个WINDOW。

            使用WINDOW GROUP 的本意是这样的,假如说某个job 执行的时间比较长,甚至全天24小时都在执行,对于这类job,单个WINDOW 很难有效调整其资源占用,这时间呢,就可以通过设置一个WINDOW GROUP,该WINDOW GROUP 中包含了多个WINDOW,每个WINDOW 分别负责不同时间点时的资源使用计划。

            然后在创建JOB 时,指定schedule_name 参数为WINDOW GROUP 的名称(SCHEDULE_NAME 可以指定为WINDOW GROUP , WINDOW GROUP,还可以直接指定成WINDOW ),这样,就可以通过很简单的方式,将job 与window 联系在一起了。

 
WINDOW GROUP 的创建和管理与前面介绍的方式极其相似:

(1)创建,使用CREATE_WINDOW_GROUP 过程;

(2) 删除,使用DROP_WINDOW_GROUP 过程;

(3) 添加WINDOW 成员,使用ADD_WINDOW_GROUP_MEMBER 过程;

(4) 删除WINDOW 成员,使用REMOVE_WINDOW_GROUP_MEMBER 过程;

(5) 启用,使用ENABLE 过程;

(6) 禁用,使用DISABLE 过程;


转自:http://blog.csdn.net/tianlesoftware/article/details/4715218
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值