在使用Oracle9i时,觉得oracle的任务调度好弱啊。最近浏览下oracle11g,由衷感到oracle在易用性上有了极大的提升,不但在内存管理、存储管理、SQL调优等方面变得十分简单,对任务管理也提供了统一、完整的解决方案。下面对任务管理做个概览:
Oracle11g的任务管理使用dbms_scheduler包。
1.基本的Scheduler概念
喎�"/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PHN0cm9uZz4gQSBqb2I8L3N0cm9uZz4gc3BlY2lmaWVzIHdoYXQgbmVlZHMgdG8gZXhlY3V0ZWQgYW5kIHdoZW4uIEZvciBleGFtcGxlLCB0aGUgobB3aGF0obEgY291bGQgYmUgYSBQTC9TUUwgcHJvY2VkdXJlLCBhbiBhdGl2ZSBiaW5hcnkgZXhlY3V0YWJsZSwgYSBKYXZhIGFwcGxpY2F0aW9uLCBvciBhIHNoZWxsIHNjcmlwdC4gWW91IGNhbiBzcGVjaWZ5IHRoZSBwcm9ncmFtICh3aGF0KSBhbmQgdGhlIHNjaGVkdWxlICh3aGVuKSBhcyBhIHN0YW5kLWFsb25lCiBqb2IuPC9wPgo8cD7L+c69tcRzdGFuZGFsb25lIGpvYsrH1ri9q3Byb2dyYW26zXNjaGVkdWxl1rG907fF1Npqb2LW0KOs0rK+zbrNb3JhY2xlOWnW0LXEam9i0rvR+cHLo6zA/cjno7o8L3A+CjxwPjwvcD4KPHA+QkVHSU48L3A+CjxwPkRCTVNfU0NIRURVTEVSLkNSRUFURV9KT0IoPC9wPgo8cD5qb2JfbmFtZT0mZ3Q7"HR.DO_BACKUP',
job_type =>'EXECUTABLE',
job_action=>'/home/usr/dba/rman/nightly_incr.sh',
start_date =>TRUNC(SYSDATE)+23/24,
enabled =>TRUE,
repeat_interval=> 'TRUNC(SYSDATE+1)+23/24',
/*next night at 11:00 PM */
comments=> 'Nightly incremental backups');
END;
create_job重载函数,可以直接使用program(突然看到了这种面向对象的重载,感觉又回到了写程序的美好年代):
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name=> 'CALC_STATS2',
program_action=> 'HR.UPDATE_SCHEMA_STATS',
program_type=> 'STORED_PROCEDURE',
enabled=> TRUE);
DBMS_SCHEDULER.CREATE_JOB(
job_name=>'HR.GET_STATS2',
program_name=>'HR.CALC_STATS2',
start_date=>'20-DEC-0707.00.00 AM Greenwich',
repeat_interval=>'FREQ=HOURLY;INTERVAL=2',
end_date=> '20-DEC-04 07.00.00 AM Greenwich',
comments=> 'Explicitly scheduled job');
END;
/
create_job重载函数,也可以直接使用schedule:
BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE(
schedule_name=> 'stats_schedule',
start_date =>SYSTIMESTAMP,
end_date=>SYSTIMESTAMP + INTERVAL ’30’ DAY,
repeat_interval=> 'FREQ=HOURLY;INTERVAL=4',
comments =>'Every 4 hours');
DBMS_SCHEDULER.CREATE_JOB(
job_name=> 'ADMIN.GET_STATS',
program_name=> 'ADMIN.CALC_STATS2',
schedule_name=> 'STATS_SCHEDULE');
END;
2.高级的Scheduler概念
基本的scheduler概念大部分情况下已经够用,也就是说,即使我们不知道这些高级特性,oracle会赋予一些默认值供使用。高级的schedule加入了时间窗口与任务调度的概念:
Job classes被用来分类jobs。每个job属于一个job class.这个job class会map到一个resource consumer group.活动的active resource plan 确定可以分配给每个resource consumer group的资源,继而分配到每个job class和job上。resource consumer group和resource plan是为了协调各种资源(如cpu资源),不过他是在资源用到100%时才会启用(Note:
The Management resource directives are noteffective until the machine is at 100% utilization. The Database ResourceManager controls processes only in a single instance.),可是如果真的用到100%,就不是资源调度的问题了,所以俺暂时还不确定这个资源分配是否有实际用途。
Window还是很有意思的,即时间窗口,比如可以定义一个时间段为维护时间段,可以将一批job关联到这个window上。还可以将多个windows定义为windows group,比如将NIGHT window 和WEEKEND window 组合成MAINTENANCE window group. 一个job可以被指定给MAINTENANCE window, 那么他就会在NIGHT 或者WEEKEND windows被打开时执行。
一个job可以用schedule, window 或者a window group 作为schedule, 不过他们是互斥的,只能用其中一个。