Schezules&Programs&Jobs的区别

原创 2011年01月16日 11:07:00

Schedules调度Programs执行的Jobs

  通过schedule调度program的执行的job,看到这样的形容是不是让你彻底晕头了,就说明你还是没搞明白10g中SCHEDULERS特性管理的jobs的含意,让我更直白地给你描述描述。10g版本中SCHEDULER将JOB分成了多个部分,program负责做什么,schedule负责啥时候做,job就简单了,一个字:做。

  下面我们通过实例来演示,如何创建通过schedule调度program的执行的job吧。

  首先,创建一个program,操作如下:

SQL> BEGIN

  2  DBMS_SCHEDULER.CREATE_PROGRAM (

  3     program_name           => ¨my_program1¨,

  4     program_action         => ¨/bin/date¨,

  5     program_type           => ¨EXECUTABLE¨,

  6     enabled                => TRUE);

  7  END;

  8  /

PL/SQL procedure successfully completed.
  通过上述语句,我们定义了一个program,执行操作系统命令date,并输入到dt.log文件中。

  接下来定义一个schedule,操作如下:

SQL> begin

  2  DBMS_SCHEDULER.CREATE_SCHEDULE (

  3    schedule_name     => ¨my_first_schedule¨,

  4    start_date        => SYSDATE,

  5    repeat_interval   => ¨FREQ= DAILY ; INTERVAL=1¨,

  6    comments          => ¨Every 1 weeks¨);

  7  END;

  8  /

PL/SQL procedure successfully completed.
  定义调试为每周执行一次。此处repeat_interval可根据实现情况进行修改。

  最后,创建job,按照指定的schedule,执行program,操作如下:

SQL> BEGIN

  2  DBMS_SCHEDULER.CREATE_JOB (

  3     job_name           =>  ¨execOScmd¨,

  4     program_name       =>  ¨my_program1¨,

  5     schedule_name      =>  ¨my_first_schedule¨,

  6     enabled            =>  true);

  7  END;

  8  /

PL/SQL procedure successfully completed.
  创建job时,start_date,repeat_interval,job_action等均无须指定,因为这些参数将由program和schedule来控制。

  这样,操作完成后,ORACLE就会自动定时(当前设置为每周执行一次)program中定义的操作。

  要查看当前的执行情况,通过*_scheduler_job_run_details即可查询(*_scheduler_job_log也可以,不过该视图中信息不如detail中全面)。例如,查看刚刚创建的"EXECOSCMD"任务的执行情况,执行命令如下:

SQL> select log_id, log_date, status, additional_info

  2    from user_scheduler_job_run_details

  3   where job_name = ¨EXECOSCMD¨

  4  ;

    LOG_ID LOG_DATE             STATUS     ADDITIONAL_INFO

---------- -------------------- ---------- ------------------------------

     13760 17-AUG-09 02.47.53.7 SUCCEEDED

           34050 PM +08:00

 

================================
(12)使用Window和Window Group

七、使用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);
  刨开那些看着眼熟的,已经认识的,看参数名就知道其所代表含义的之外,下列几个参数可能需要关注:

Resource_plan :这一参数用来指定要使用的资源使用计划,当打开WINDOW时,就会自动按照指定的资源使用计划中的设置分配资源,当WINDOW关闭时(没错,window是会关闭的,要不怎么说有效控制资源的使用情况泥),系统会自动切换回适当资源计划。这个参数在执行过程时甚至可以指定为NULL或空值¨¨,当设置为NULL时,就表示使用默认的资源计划,当设置为空值¨¨时,表示禁用资源使用计划。
Duration :指定WINDOW的有效期,比如说指定为interval ¨5¨ hour就表示5个小时,该参数在执行过程时必须指定参数值,否则创建会报错。
Window_priority :该参数用来指定WINDOW的优先级。因为在相同时间只有一个WINDOW有效,因此如果在创建WINDOW时发现重叠的情况,ORACLE就需要根据这一参数指定的规则,来确定优先级,说白了就是先把资源给谁用,这一参数有两个可选值:HIGH或LOW,默认值为LOW。
  正如前面CREATE_WINDOW过程语法结构显示的那样,调用该过程有两种方式,差异就在于是指定现有定义好的调度SCHEDULE,还是在执行过程时指定调度,目标和实现的功能都是相同的,这里仅做示例,咱就挑个最复杂的方式吧,执行过程时指定调度,执行脚本如下:

SQL> begin

  2    dbms_scheduler.create_window(window_name     => ¨my_first_wd1¨,

  3                                 resource_plan   => null,

  4                                 start_date      => sysdate,

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

  6                                 duration        => interval ¨1¨ hour);

  7  end;

  8  /

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

*_SCHEDULER_WINDOW_DETAILS 视图:显示WINDOW的详细信息;
*_SCHEDULER_WINDOW_LOG 视图:显示WINDOW的日志,比如打开和关闭;
2、管理Window

  通过前面那些SCHEDULER对象的学习,相当大家已经了解了ORACLE SCHEDULER中对象的特点,对于多数对象的管理,不外乎下列几种:

修改对象属性,使用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、关于WINDOW GROUP

  除了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 的创建和管理与前面介绍的方式极其相似:

创建,使用CREATE_WINDOW_GROUP过程;
删除,使用DROP_WINDOW_GROUP过程;
添加WINDOW成员,使用ADD_WINDOW_GROUP_MEMBER过程;
删除WINDOW成员,使用REMOVE_WINDOW_GROUP_MEMBER过程;
启用,使用ENABLE过程;
禁用,使用DISABLE过程;
  这些过程的调用方式也都非常简单,这里就不着重演示了,感兴趣的朋友不妨自行尝试

/ ./ ../的区别

/   网站根路径  ./  当前路径 ../ 上一级路径 例如以上 本地静态网站 index页面地址  127.0.0.1/bootstrap_test/index.html 需要引入 ...
  • u013476542
  • u013476542
  • 2017年03月06日 16:38
  • 6128

.*? 和 .*的区别

在看js代码的时候,有时候会遇到 .*? 这样的写法,那么连续两个限制符是什么意思呢?我们先来回顾一下正则表达式的基本知识。基本语法 符号 用法 . 匹配除“\r\n”之外的任何单个字符...
  • foreverling_ling
  • foreverling_ling
  • 2016年11月09日 17:23
  • 1888

&&和&的区别,||和|的区别

“&”和“&&”的区别: 单&时,左边无论真假,右边都进行运算; 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。 “|”和“||”的区别同理,双或时,左边为真,右边不参与...
  • daijiguo
  • daijiguo
  • 2015年03月04日 10:13
  • 363

${}和#{}的区别

mybatis中${}和#{}区别
  • zouxucong
  • zouxucong
  • 2016年10月17日 11:53
  • 13282

==和===有什么区别

”==”与”===”是不同的,一个是判断值是否相等,一个是判断值及类型是否完全相等。 下面的规则用于判定===运算符比较的两个值是否相等的判断条件 •如果两个值的类型不同,它们就不相同。 •如果...
  • lmwyc123
  • lmwyc123
  • 2015年07月16日 22:55
  • 1721

&与&& ,|与||的区别

&&和||是短路运算符,&和|是非短路运算符 &&与& 区别:两者都表示“与”运算,但是&&运算符第一个表达式不成立的话,后面的表达式不运算,直接返回。而&对所有表达式都得判断。 || 与|:两者都...
  • fumier
  • fumier
  • 2015年03月25日 08:30
  • 10589

Java 中 Equals和==的区别

在谈论equals和==的区别前,我们先简单介绍一下JVM中内存分配的问题。 在JVM中 内存分为栈内存和堆内存。二者有什么区别呢? 当我们创建一个对象(new Object)时,就会调用它的构造函数...
  • tcytcy123
  • tcytcy123
  • 2016年03月09日 16:19
  • 17299

<%= %>、<% %>、<%@ %>、<%:%>和<%# %>的区别

里面放的变量名,未经过encode 里面放的变量名,经过encode 中间一般放函数或者方法,典型的asp程序写法。   这里是数据的绑定 只能用在数据绑定控件中。 ...
  • zyh_1988
  • zyh_1988
  • 2016年06月07日 21:51
  • 2529

Mybatis中#{}和${}的区别

http://weijun726.blog.163.com/blog/static/87342299201362652950398/
  • yangfengjueqi
  • yangfengjueqi
  • 2017年05月12日 13:32
  • 1200

请解释&和&&、|和||的区别?

· 与操作:与操作分为两种,一种是普通与,另外一种是短路与: |- 普通与(&):表示所有的判断条件都要执行,不管前面是否满足; |- 短路与(&&):如果前面的条件已经是false了,那么后面的...
  • heifan2014
  • heifan2014
  • 2016年10月22日 11:42
  • 848
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Schezules&Programs&Jobs的区别
举报原因:
原因补充:

(最多只允许输入30个字)