Oracle Database Scheduler整理
Oracle Database Scheduler整理
edit by :2018-7-4 15:28
10g引入的這個dbms_scheduler包,替代了之前的dbms_job包,該包功能更強大,可以將job需要的各種資源分開再進行組合。
使用dbms_scheduler建立一個定時任務有兩種形式
1)建立1個SCHEDULER來定義計劃,1個PROGRAM來定義任務內容,再建立1個JOB,為這個JOB指定上面的SCHEDULER和PROGRAM。
2)直接建立JOB,在引數裡面直接指定計劃和任務內容。
1. 參考
http://www.cnblogs.com/lanzi/archive/2012/11/23/2784815.html
https://blog.csdn.net/cnham/article/details/5985172
https://blog.csdn.net/fw0124/article/details/6753715
2. 案例參考
2.1. 授予使用者許可權
要執行DBMS_SCHEDULER需要有CREATE JOB許可權。
要建立外部作業系統命令的job, 還必須有CREATE EXTERNAL JOB許可權。
要對於某個物件進行操作,必須是它的owner,或者對它具有alter許可權,或者有create any job許可權。
要建立/操作job_class,還需要有MANAGE SCHEDULER許可權。job_class都是建立在sys schema中的。
create external job
create job
GRANT SCHEDULER_ADMIN TO scott;
GRANT CREATE JOB TO scott;
GRANT MANAGE SCHEDULER TO scott;
GRANT CREATE RULE, CREATE RULE SET, CREATE EVALUATION CONTEXT TO scott;
GRANT CREATE ANY RULE, CREATE ANY RULE SET,CREATE ANY EVALUATION CONTEXT TO scott;
2.2. 注意時間格式
在使用create_job或者create_schedule前,請先檢查NLS_DATE_LANGUAGE, NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT, NLS_TIMESTAMP_TZ_FORMAT等引數的值, 透過alter session 命令來修改。也可在使用中直接指定格式。例如:
SQL>
select * from nls_session_parameters;
alter session set NLS_DATE_LANGUAGE='AMERICAN';
alter session set NLS_DATE_FORMAT='dd-mm-yyyy hh24:mi:ss';
alter session set NLS_TIMESTAMP_TZ_FORMAT='dd-mm-yyyy HH:MI:SS.FF AM TZR'
2.3. 使用定義好的儲存過程
begin
dbms_scheduler.create_job(
job_name=> 'leo.UPDATE_STATS_JOB',
program_name=> 'leo.UPDATE_STATS_2',
start_date=>'2005-06-20 11:00.00.000000 PM +8:00',
repeat_interval=>'FREQ=MONTHLY;INTERVAL=1',
end_date=>'2006-06-20 11:00.00.000000 PM +8:00',
comments=>'Monthly statistics collection job');
end;
/
2.4. 指定外部命令執行
begin
dbms_scheduler.create_job(
job_name=> 'zip_emlog',
job_type=> 'EXECUTABLE',
job_action =>'/home/leo/zip_log.sh',
enabled=>true,
start_date=>'03-07-2005 9:30:00 PM + 8:00',
repeat_interval=>'FREQ=MINUTELY;INTERVAL=30',
end_date=>'31-07-2005 9:30:00 PM + 8:00',
comments=>'Get a latest em log copy and compress it every 30 minutes');
end;
/
2.5. 使用pl/sql塊
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name => 'LEO.UPDATE_STATS',
program_type => 'PLSQL_BLOCK',
program_action => 'DECLARE sUsername varchar2(30);
cursor cur is select username from dba_users
where username not in ('SYS','SYSTEM','SYSMAN','DBSNMP')
and account_status='OPEN' and substr(username,1,5)<>'MGMT_' ;
BEGIN
OPEN cur;
FETCH cur into sUsername;
WHILE cur%Found
LOOP
DBMS_STATS.GATHER_SCHEMA_STATS (sUsername);
FETCH cur into sUsername;
END LOOP;
close cur;
END;');
END;
/
上面這個例子建立一個名為"UPDATE_STATS"的程式,它的型別是PL/SQL 塊,完成更新非系統使用者的統計資訊的工作。在這個基礎上你可以定製一個合理的計劃,來定期執行這個程式.
2.6. 使用program、scheduler、windows、job組合
---CREATE PROGRAM
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(program_name => 'P_UPDATE_STATS',
program_type => 'PLSQL_BLOCK',
program_action => 'DECLARE sUsername varchar2(30);
cursor cur is select username from dba_users
where username not in (''SYS'',''SYSTEM'',''SYSMAN'',''DBSNMP'')
and account_status=''OPEN'';
BEGIN
OPEN cur;
FETCH cur into sUsername;
WHILE cur%Found
LOOP
DBMS_STATS.GATHER_SCHEMA_STATS (sUsername);
FETCH cur into sUsername;
END LOOP;
close cur;
END;');
END;
/
BEGIN DBMS_SCHEDULER.ENABLE(name => 'P_UPDATE_STATS'); end;
SELECT * FROM DBA_SCHEDULER_PROGRAMS P where p.program_name='P_UPDATE_STATS';
---CREATE SCHEDULER
BEGIN
dbms_scheduler.create_schedule(schedule_name => 'SCH_EVERY_MORING',
start_date=>systimestamp,
--repeat_interval => 'FREQ=DAILY; INTERVAL=1;';
repeat_interval => 'FREQ=HOURLY; INTERVAL=2');
--end_date=>'31-07-2005 9:30:00 PM + 8:00'
END;
select * from dba_scheduler_schedules s where s.schedule_name='SCH_EVERY_MORING';
---CREATE WINDOWS
BEGIN
dbms_scheduler.create_window(window_name => 'EARLY_MORNING_WINDOW',
schedule_name =>'SCH_EVERY_MORING',
duration => numtodsinterval(1, 'hour'),
resource_plan => 'DEFAULT_MAINTENANCE_PLAN');
end;
select * from dba_scheduler_windows w where w.window_name='EARLY_MORNING_WINDOW';
select * from dba_scheduler_window_details w where w.window_name='EARLY_MORNING_WINDOW';
---CREATE JOB
BEGIN
dbms_scheduler.create_job(job_name => 'JOB_UPSTATS',
program_name => 'P_UPDATE_STATS',
schedule_name => 'SCH_EVERY_MORING');
END;
select *from dba_scheduler_jobs j where j.job_name='JOB_UPSTATS';
select * from dba_scheduler_job_log j where j.job_name='JOB_UPSTATS';
2.7. 使用JOB直接建立
begin
dbms_scheduler.create_job(job_name => 'UP_STAT2',
job_type => 'PLSQL_BLOCK',
JOB_ACTION => 'DECLARE sUsername varchar2(30);
cursor cur is select username from dba_users
where username not in (''SYS'',''SYSTEM'',''SYSMAN'',''DBSNMP'') and account_status=''OPEN'';
BEGIN
OPEN cur;
FETCH cur into sUsername;
WHILE cur%Found
LOOP
DBMS_STATS.GATHER_SCHEMA_STATS (sUsername);
FETCH cur into sUsername;
END LOOP;
close cur;
END;',
start_date=>to_timestamp_tz('2018-07-04 00:00:00.000 +08:00','yyyy-mm-dd hh24:mi:ss.ff tzh:tzm'),
-- start_date => '04-07-2018 02:30:00 PM +08:00',
repeat_interval => 'FREQ=DAILY; INTERVAL=1;',
enabled => true);
END;
/
select * from dba_schedu
begin
dbms_scheduler.enable(name => 'UP_STAT2');
END;
/
begin
DBMS_SCHEDULER.DISABLE(name => 'UP_STAT2', force => true);
end;
/
select job_name,state from dba_scheduler_jobs where job_name='UP_STAT2';
SELECT to_char(log_date, 'DD-MON-YY HH24:MI:SS') TIMESTAMP,
job_name,
status,
SUBSTR(additional_info, 1, 40) ADDITIONAL_INFO
FROM user_scheduler_job_run_details s
where s.job_name='UP_STAT2'
ORDER BY log_date;
SELECT job_name, job_class, operation, status FROM USER_SCHEDULER_JOB_LOG where job_name='UP_STAT2';
2.8. 使用引數定義計劃
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM (
program_name => 'PRM_CREATEDUNDATA',
program_action => 'PKG_SCHEDULER.CREATEDUNDATA',
program_type => 'STORED_PROCEDURE',
enabled => FALSE,
number_of_arguments => 5,
comments => '生成催繳資料'
);
DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME => 'PRM_CREATEDUNDATA',
ARGUMENT_POSITION => 1,
ARGUMENT_NAME => 'I_BILLINGCYCLEID',
ARGUMENT_TYPE => 'VARCHAR2',
DEFAULT_VALUE => NULL,
OUT_ARGUMENT => FALSE);
DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME => 'PRM_CREATEDUNDATA',
ARGUMENT_POSITION => 2,
ARGUMENT_NAME => 'I_BUSINESSTYPE',
ARGUMENT_TYPE => 'VARCHAR2',
DEFAULT_VALUE => NULL,
OUT_ARGUMENT => FALSE);
DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME => 'PRM_CREATEDUNDATA',
ARGUMENT_POSITION => 3,
ARGUMENT_NAME => 'I_STATE',
ARGUMENT_TYPE => 'VARCHAR2',
DEFAULT_VALUE => NULL,
OUT_ARGUMENT => FALSE);
DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME => 'PRM_CREATEDUNDATA',
ARGUMENT_POSITION => 4,
ARGUMENT_NAME => 'I_BANKCODE',
ARGUMENT_TYPE => 'VARCHAR2',
DEFAULT_VALUE => NULL,
OUT_ARGUMENT => FALSE);
DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME => 'PRM_CREATEDUNDATA',
ARGUMENT_POSITION => 5,
ARGUMENT_NAME => 'I_OPERATORCODE',
ARGUMENT_TYPE => 'VARCHAR2',
DEFAULT_VALUE => NULL,
OUT_ARGUMENT => FALSE);
DBMS_SCHEDULER.ENABLE(NAME => 'PRM_CREATEDUNDATA');
COMMIT;
END;
之後就可以在select * from sys.USER_SCHEDULER_PROGRAMS t中看到program了
3. program
3.1. create_program
引數說明:
program_name——程式名稱
program_type——程式型別(STORED_PROCEDURE,PLSQL_BLOCK,EXECUTABLE)
STORED_PROCEDURE——ORACLE 中定義好的儲存過程
PLSQL_BLOCK——是一段標準的pl/sql 程式碼
EXECUTABLE——指定外部命令的命令列資訊(含路徑資訊)
program_type有三種形式
1) -'PLSQL_BLOCK'
program_action是一個PL/SQL block. 不支援引數,number_of_arguments必須為0.必須以分號結尾。例如以下三種形式
'my_proc();'
'BEGIN my_proc(); END;'
'DECLARE arg pls_integer:= 10; BEGIN my_proc2(arg); END;'
2) -'STORED_PROCEDURE'
program_action是一個儲存過程,注意不支援INOUT or OUT引數,也不支援function.引數最多255個,可以透過SET_JOB_ARGUMENT_VALUE過程來設定。例如'"Schema"."Procedure"'.
3) -'EXECUTABLE'
program_action是一個外部作業系統的命令列程式,包含完整路徑,不能帶任何命令列引數。開始的'?'會被替換為oracle home目錄;'@'會被替換為當前oracle例項的SID。
job_type類似於program_type,只是多了'CHAIN'這種型別來建立任務鏈。
program_action——具體對應的執行內容,若為過程則為過程名
number_of_arguments----
enable——若為true則建立後啟用反之不啟用
comments——註釋
例子:
BEGIN
dbms_scheduler.create_program(program_name => 'myprogram',
program_type => 'STORED_PROCEDURE',
program_action => 'p_test1',
number_of_arguments => 1,
enabled => FALSE,
comments => '更新gi_pipe表');
END;
注:如果建立的程式需要輸入引數,則必須定義完引數後在啟用,即建立這個program時將enable設為false,否則提示:Ora-27456:程式“ ”的引數並未全部定義;然後再對該program定義引數即執行define_program_argument過程(見1.3)。
--檢視定義的program
SELECT * FROM user_scheduler_programs;
3.2. drop_program
引數說明:
program_name——要刪除的程式名稱
force——true或者false。如果為true則不管該program是否被job引用都會刪除,FALSE則若被引用無法刪除,預設為false。
例子:
BEGIN
dbms_scheduler.drop_program(program_name => 'myprogram',force => TRUE);
END;
3.3. define_program_argument
引數說明:
program_name——程式名稱
argument_position——引數位置(也可以知道引數名稱選擇argument_name)
argument_type——引數型別
default_value——引數預設值
例子:
BEGIN
dbms_scheduler.define_program_argument(program_name => 'myprogram',
argument_position => 1,
argument_name => 'p_lttid',
argument_type => 'varchar2',
default_value => 'daaa');
END;
--檢視定義的program引數
SELECT *FROM User_Scheduler_Program_Args;
3.4. define_anydata_argument
(用於定義輸入引數為複雜型別需採用sys.AnyData型別來包裝的引數)
引數說明:
program_name——程式名稱
argument_position——引數位置(也可以知道引數名稱選擇argument_name)
argument_type——引數型別為sys.AnyData
default_value——引數預設值
3.5. define_metadata_argument
有效的metadata attributes有: 'job_name', 'job_subname', 'job_owner', 'job_start', 'window_start', 'window_end', and 'event_message'.
Metadata Attribute Data Type Description
job_name VARCHAR2 當前執行的job名稱
job_subname VARCHAR2 當前執行的job子名稱
job_owner VARCHAR2 當前執行的job所有者
job_start TIMESTAMP WITH TIME ZONE job啟動的時間
window_start TIMESTAMP WITH TIME ZONE window開啟的時間
window_end TIMESTAMP WITH TIME ZONE window關閉的時間
event_message 事件觸發job啟動的資訊
例子:(以下metadata_attribute設定為job_name,即以job_start這個值作為輸入引數)
BEGIN
dbms_scheduler.define_metadata_argument(program_name => 'myprogram',
argument_position => 1,
argument_name => 'p_lttid',
metadata_attribute => 'job_start');
END;
3.6. drop_program_argument
例子:
BEGIN
dbms_scheduler.drop_program_argument(program_name =>'myprogram', argument_position => 1);
END;
4. schedule
4.1. create_schedule
引數說明:
repeat_interval——執行頻率
end_date和comments預設可以不填
例子:
BEGIN
dbms_scheduler.create_schedule(schedule_name => 'myscheduler',
repeat_interval => 'FREQ=MINUTELY;INTERVAL=2');
END;
4.2. repeat_interval常用例子
repeat_interval => 'FREQ=HOURLY; INTERVAL=2'
每隔2小時執行一次job
repeat_interval => 'FREQ=DAILY'
每天執行一次job
repeat_interval => 'FREQ=WEEKLY; BYDAY=MON,WED,FRI"
每週的1,3,5執行job
repeat_interval => 'FREQ=YEARLY; BYMONTH=MAR,JUN,SEP,DEC; BYMONTHDAY=30'
每年的3,6,9,12月的30號執行job
a) 05/02 和 09/22 的 8:00 a.m., 1:00 p.m., 6:00 p.m.
'freq=daily;byhour=8,13,18;byminute=0;bysecond=0;bydate=0502,0922'
b) 每個月的最後一個工作日(注意,INTERVAL如果不指定,預設為1)
'FREQ=MONTHLY;BYDAY=MON,TUE,WED,THU,FRI;BYSETPOS=-1'
c) 1/10開始的5天,即1/10~1/14
BYDATE=0110+SPAN:5D
+表示從指定日期開始;-表示到指定日期結束;
^表示圍繞指定日期的n天,如果n為偶數,調整為n+1。
d) 以下三種表示方法等同
BYDATE=0205-OFFSET:2W
BYDATE=0205-14D (the OFFSET: keyword is optional)
BYDATE=0122
4.3. create_event_schedule
建立基於事件的排程,用於當一個特殊事件被丟擲時啟動一個job。
Event型別 描述
job_started job啟動
job_succeeded job啟動成功
job_failed job失敗
job_broken 被禁止或狀態改為broken
job_completed job執行完成即完成了限制的最大執行次數或者到達執行指定的結束時間
job_stopped 停止job
job_sch_lim_reached 達到了scheduler的限制設定的值
job_disabled 禁止job
job_chain_stalled A job running a chain was put into the CHAIN_STALLED state. A running chain becomes
stalled if there are no steps running or scheduled to run and the chain evaluation_interval is set to NULL.
No progress will be made in the chain unless there is manual intervention.
job_all_events Not an event, but a constant that provides an easy way for you to enable all events
job_run_completed job執行或者失敗或者成功或者被停止
引數:
event_condition——tab.user_data
queue_spec——必須先建立一個queue,dbms_aqadm.create_queue
BEGIN
dbms_scheduler.create_event_schedule(schedule_name => 'acc_mgr_change',
start_date => systimestamp,
event_condition=>'tab.user_data.event_name= ''acc_mgr_change''',
queue_spec => 'proc_queue');
end;
4.4. drop_schedule
例子:
BEGIN
DBMS_SCHEDULER.drop_schedule(schedule_name => 'myscheduler');
END;
5. job
5.1. create_job
引數說明:
job_type: 類同上述建立program
job_class DEFAULT 'DEFAULT_JOB_CLASS'
enabled 預設FALSE,其建立後要想執行該job必須先執行enable過程
auto_drop 預設TRUE,即當job執行完畢都到期是否直接刪除job
comments 預設NULL
job_style 預設REGULAR
credential_name 預設 NULL
destination_name 預設 NULL
--不採用program和scheduler直接建立job
BEGIN
dbms_scheduler.create_job(job_name => 'myjob',
job_type => 'STORED_PROCEDURE',
job_action => 'p_test1',
start_date => '',
repeat_interval => 'FREQ=DAILY;INTERVAL=2',
enabled => TRUE,
comments => 'My new job');
END;
--根據program和scheduler建立job
BEGIN
dbms_scheduler.create_job(job_name => 'myjob',
program_name => 'myprogram',
schedule_name => 'myscheduler');
END;
5.2. run_job
BEGIN
dbms_scheduler.run_job(job_name => 'myjob2');
END;
5.3. stop_job
BEGIN dbms_scheduler.stop_job(job_name => 'myjob');END;
5.4. copy_job
BEGIN dbms_scheduler.copy_job(old_job =>'myjob' ,new_job =>'myjob2' );END;
5.5. drop_job
BEGIN dbms_scheduler.drop_job(job_name => 'myjob');END;
5.6. set_job_argument_value
設定job的輸入引數值,設定後會覆蓋原先定義該引數設定的預設值
BEGIN
dbms_scheduler.set_job_argument_value(job_name => 'myjob2',
argument_position => 1,
argument_value => 'qwerer');
END;
5.7. set_job_anydata_value
方法類似set_job_argument_value,只是設定的引數值類似是sys.anydata
5.8. reset_job_argument_value
重置job引數值,將其置為空
6. group(11g才有的)
6.1. create_group
引數:
group_type——組型別,該組的所有成員必須是同一型別,已有的型別有三種:
1) DB_DEST:即成員為目標資料庫,執行遠端資料庫的job;
2) EXTERNAL_DEST(External destination):Members are external destinations, for running remote external jobs;
3) WINDOW:Members are Scheduler windows
建立時可以指定成員也可不指定,新增成員透過add_group_member過程新增。
BEGIN
dbms_scheduler.create_group(group_name =>,
group_type =>,
MEMBER =>,
comments =>);END;
6.2. drop_group
刪除組
6.3. add_group_member
為組新增成員
6.4. remove_group_member
移除組成員
6.5. create_database_destination
建立目標資料庫,用於執行遠端job
AGENT——The external destination name of the Scheduler agent to connect. Equivalent to an agent name.
The external destination must already exist. The external destination representing an agent is
created automatically on a database instance when the agent registers with that instance.
An agent‘s name is specified in its agent configuration file. If it is not specified, it defaults
to the first part (before the first period) of the name of the host it resides on.
DBMS_SCHEDULER.CREATE_DATABASE_DESTINATION (
destination_name IN VARCHAR2,--目標資料庫名稱
agent IN VARCHAR2,--代理名稱,事先建立好的
tns_name IN VARCHAR2,--tns名稱
comments IN VARCHAR2 DEFAULT NULL);
6.6. drop_database_destination
6.7. drop_agent_destination
7. job class
Job Classes 相當於建立了一個job組,DBA可以將那些具有相同特性的job,放到相同的Job Classes中,
然後透過對Job Class應用ORACLE中的"資源使用計劃"特性,就可以對這些job執行過程中所需要的資源分配情況進行管理。
7.1. create_job_class
引數:
resource_consumer_group——指定該jobclass所使用的資源分配方式。具體建立方法見dbms_resource_manager.create_consumer_group。
1) jobclass與resource_consumer_group為多對1關係;
2) 若為該jobclass指定的resource_consumer_group被刪除,則使用預設的resource_consumer_group;
3) 若沒為jobclass指定具體的resource_consumer_group,則使用預設的resource_consumer_group;
4) 若為該jobclass指定的resource_consumer_group不存在,則會提示錯誤;
5) 若為該jobclass指定了resource_consumer_group,則service引數必須設定為空(即這兩個引數只能設定其中一個)。
service——一般用於rac環境指定jobclass執行於哪個節點。
logging_level——日誌記錄級別(DBMS_SCHEDULER.LOGGING_OFF,DBMS_SCHEDULER.LOGGING_RUNS,DBMS_SCHEDULER.LOGGING_FULL)
log_history——日誌存放時間,預設30
例子:
BEGIN
dbms_scheduler.create_job_class(job_class_name =>,
resource_consumer_group =>,
service =>,
logging_level =>,
log_history =>,
comments =>);
END;
7.2. drop_job_class
--刪除多個job class用逗號隔開
BEGIN
dbms_scheduler.drop_job_class(job_class_name => '');
END;
8. window
通常job啟動後,使用者只能被動地等待其執行,一直到其執行地任務完成(或DBA手動kill對應程式),在此期間,執行的job將與其它活動的程式共同競爭當前系統中的資源。在9i之前就是這樣。在Job Classes中也可以控制job能夠使用的資源,不過單單使用Job Classes並不能靈活的控制job在合適的時間使用適當的資源。進入10g之後,採用dbms_scheduler的WINDOW可以緩解該問題。WINDOW 可以指定一個時間視窗,在此期間,透過與Job Classes的搭配組合,能夠有效控制job執行時支配(使用)的資源。比如說job通常是在凌晨伺服器負載較低時執行,那麼就可以透過WINDOW設定在此期間,允許jobs使用更多的系統資源,而到了工作時間後,如果job仍未執行完成,為其分配另一個有限的資源,以儘可能降低job執行佔用的資源對其它業務的影響。
8.1. create_window
引數:
resource_plan——資源計劃,即透過 dbms_resource_manager.create_plan來建立。
schedule_name——排程名稱,基於已經建立好的排程建立window。
duration——時間視窗開啟後持續的時間,建立時必須設定該值,因為沒有預設值,設定範圍從1分鐘到99天。
window_priority——window優先順序,如果同一時間出現多個window時則根據優先順序決定執行哪個。
--建立一個基於排程的window
BEGIN
dbms_scheduler.create_window(window_name =>,
resource_plan =>,
schedule_name =>,
duration =>,
window_priority =>,
comments =>);
END;
--不基於時間排程建立window
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);
8.2. drop_window
刪除一個window。
8.3. open_window
開啟一個window。
8.4. close_window
關閉一個window。
9. window group
一個WINDOW GROUP可能包含多個WINDOW。使用WINDOW GROUP的本意是這樣的,假如說某個job執行的時間比較長,甚至全天24小時都在執行,對於這類job,單個WINDOW很難有效調整其資源佔用,因此就可以透過設定一個WINDOW GROUP,該WINDOW GROUP中包含了多個WINDOW,每個WINDOW分別負責不同時間點時的資源使用計劃。然後在建立JOB時,指定schedule_name引數為WINDOW GROUP的名稱,當然也可以直接指定window名稱(window已經包含了排程資訊了)。
9.1. create_window_group
BEGIN
dbms_scheduler.create_window_group(group_name =>,
window_list =>,
comments =>);
END;
9.2. add_window_group_member
增加一個window
BEGIN
dbms_scheduler.add_window_group_member(group_name => ,window_list => );
END;
9.3. remove_window_group_member
移除一個window
9.4. drop_window_group
刪除一個window
10. chain
CHAIN可以被視做多個program放到同一個鏈中,這樣的話就可以指定這些program執行的先後順序。
10.1. create_chain
DBMS_SCHEDULER.CREATE_CHAIN (
chain_name IN VARCHAR2,
rule_set_name IN VARCHAR2 DEFAULT NULL,
evaluation_interval IN INTERVAL DAY TO SECOND DEFAULT NULL,
comments IN VARCHAR2 DEFAULT NULL);
10.2. define_chain_rule
定義規則
舉例,如my_step1執行完則執行my_step2,若my_step2執行完則結束
BEGIN
dbms_scheduler.define_chain_rule(chain_name => 'my_chain1',
condition => 'TRUE',
action => 'start my_step1',
rule_name => 'my_rule1');
dbms_scheduler.define_chain_rule(chain_name => 'my_chain1',
condition => 'my_step1 completed',
action => 'start my_step2',
rule_name => 'my_rule2');
dbms_scheduler.define_chain_rule(chain_name => 'my_chain1',
condition => 'my_step2 completed',
action => 'end 0',
rule_name => 'my_rule3');
END;
10.3. define_chain_step
BEGIN
dbms_scheduler.define_chain_step(chain_name => 'my_chain1',
step_name => 'my_step1',
program_name => 'p_p2');
dbms_scheduler.define_chain_step(chain_name => 'my_chain1',
step_name => 'my_step2',
program_name => 'p_p3');
END;
10.4. define_chain_event_step
BEGIN
dbms_scheduler.define_chain_event_step(chain_name =>,
step_name =>,
event_schedule_name =>,
timeout =>);
END;
10.5. drop_chain_rule
dbms_scheduler.drop_chain_rule(chain_name => ,rule_name => );
10.6. drop_chain_step
dbms_scheduler.drop_chain_step(chain_name => ,step_name => );
10.7. alter_chain
dbms_scheduler.alter_chain(chain_name => ,step_name => ,attribute => ,value => );
10.8. drop_chain
10.9. analyze_chain
dbms_scheduler.analyze_chain(chain_name => ,rules => ,steps => ,step_pairs => );
10.10. alter_running_chain
dbms_scheduler.alter_running_chain(job_name => ,step_name => ,attribute => ,value => );
10.11. evaluate_running_chain
dbms_scheduler.evaluate_running_chain(job_name => );
10.12. run_chain
dbms_scheduler.run_chain(chain_name => ,start_steps => ,job_name => );
11. credential
建立使用者名稱密碼,用於認證job執行
11.1. create_credential
BEGIN
dbms_scheduler.create_credential(credential_name =>,
username =>,
password =>,
database_role =>,
windows_domain =>,
comments =>);
END;
11.2. drop_credential
11.3. put_file
BEGIN
dbms_scheduler.put_file(destination_file =>,
destination_host =>,
credential_name =>,
file_contents =>,
destination_permissions =>);
END;
11.4. get_file
11.5. create_file_watcher
BEGIN
dbms_scheduler.create_file_watcher(file_watcher_name =>,
directory_path =>,
file_name =>,
credential_name =>,
destination =>,
min_file_size =>,
steady_state_duration =>,
comments =>,
enabled =>);
END;
11.6. drop_file_watcher
11.7. add_job_email_notification
BEGIN
dbms_scheduler.add_job_email_notification(job_name =>,
recipients =>,
sender =>,
subject =>,
BODY =>,
events =>,
filter_condition =>);
END;
11.8. remove_job_email_notification
12. 通用屬性
12.1. DISABLE
BEGIN dbms_scheduler.disable(NAME => 'myjob2');END;
12.2. enable
BEGIN dbms_scheduler.enable(NAME => 'myprogram'); END;
BEGIN dbms_scheduler.enable(NAME => 'myjob2'); END;
如果為TRUE, 建立時候檢查program/job有效性,如果透過檢查把program/job置為ENABLED.
在program/job使用前必須透過ENABLE過程把它置為ENABLED。
如果program為disabled,僅僅enable一個job,那麼job會按計劃執行,但是會失敗。
12.3. auto_drop
如果為TRUE, 在job完成之後或者被自動disabled之後job將被自動刪除。
如果滿足以下條件,job被視為完成。
a) 過了end_date。
b) 達到了最大執行次數(max_runs,可以透過SET_ATTRIBUTE來指定)
c) 非重複任務,即只執行一次的任務,並且已經執行了1次。
如果滿足以下條件,job被視為自動disabled.
a) 達到了最大執行失敗次數(max_failures,可以透過SET_ATTRIBUTE來指定)
12.4. set_attribute
attribute:是指設定job的屬性,屬性有:
1) logging_level——記錄的日誌資訊,有三個值(DBMS_SCHEDULER.LOGGING_OFF,DBMS_SCHEDULER.LOGGING_RUNS,DBMS_SCHEDULER.LOGGING_FULL)
2) restartable——設定job失敗是否要重啟
3) max_failures——允許job失敗的次數,範圍1到1000000,預設為空。
4) max_runs——job執行的最大次數,範圍1到1000000,預設為空(即意味著job會重複執行,或者到達job執行的end_date,或者達到指定失敗的次數)。一旦達到設定的最大值,job將會disable並且狀態變更為COMPLETED
5) max_run_duration——設定job執行的有效時間,如果設定了某個值,則在到達該值時排程會報JOB_OVER_MAX_DUR事件,然後由事件處理器決定是否要繼續。
6) instance_stickiness——只用於rac資料庫。預設為true,設定為true,則job會執行在負載最輕的節點上;如果某節點關閉或負載太重,則不會啟動新job,而是有另一個節點來執行該job。
7) stop_on_window_close——window關閉的時候停止job,預設為false。因此預設情況下關閉了window,job還是會繼續執行,但是要注意,window關閉則意味著資源使用計劃就會變化。
8) job_priority——在同一個class,job執行的優先順序,預設為3.
9) schedule_limit——允許啟動job延遲的時間,設定值從1分鐘到99天。超過了延遲的時間則不再啟動job。如果不設定該值,則只要得到允許所需的資源就會啟動。另外,在延遲的這段時間裡,job的執行次數或失敗次數 會跳過,不計算這段時間的。
10) program_name——job執行的物件。如果設定了該屬性,則job_action, job_type,number_of_arguments要設定為空。
11) job_action——job執行物件內容
12) job_type——job執行物件型別('PLSQL_BLOCK', 'STORED_PROCEDURE', 'EXECUTABLE', and 'CHAIN')。如果設定了該值,那麼program_name引數必須設定為空 。
13) number_of_arguments——引數個數。如果設定了該值,那麼program_name引數必須設定為空。
14) schedule_name——排程名,如果設定了該值,則end_date, start_date and repeat_interval需設定為空。
15) repeat_interval——執行間隔,設定了該值,則schedule_name需為空。
16) start_date——執行開始時間,設定了該值,則schedule_name需為空。
17) end_date——不再執行job的時間,設定了該值,則schedule_name需為空。
18) job_class——jobclass
19) comments——備註
20) auto_drop——當job狀態為completed則自動刪除該job
21) event_spec——需含兩個值(event condition和queue specification)
22) raise_events——設定當job為什麼狀態時丟擲,具體的時間型別見event型別。
23) log_history-----設定log_history為90天,預設30天;BEGIN dbms_scheduler.set_scheduler_attribute('log_history', '90');END;
12.5. start_date
實際上是schedule生效的日期,
對於一個定時執行的schedule,實際上的開始日期取決於repeat_interval引數。
如果start_date為null,等同於job被enable的時刻。
Oracle取start_date來作為repeat_interval的default值。
例如,如果指定start_date為1/31/2010 9:45:58,指定repeat_interval為'FREQ=YEARLY',
等同於'freq=yearly;bymonth=1;bymonthday=31;byhour=9;byminute=45;bysecond=58'
不能給repeat_interval指定時區資訊,Oracle取start_date的時區資訊作為指定的時區。
12.6. set_attribute_null
12.7. get_attribute
13. scheduler attribute
設定排程屬性的值
13.1. set_scheduler_attribute
attribute型別有:default_timezone,email_server,email_sender,email_server_credential,email_server_encryption, event_expiry_time ,log_history,max_job_slave_processes(沒使用)
BEGIN
dbms_scheduler.set_scheduler_attribute(attribute => ,value => );
END;
13.2. get_scheduler_attribute
BEGIN
dbms_scheduler.get_scheduler_attribute(attribute => ,value => );
END;
13.3. add_event_queue_subscriber
BEGIN
dbms_scheduler.add_event_queue_subscriber(subscriber_name => );
END;
13.4. remove_event_queue_subscriber
BEGIN
dbms_scheduler.remove_event_queue_subscriber(subscriber_name => );
END;
13.5. purge_log
BEGIN
dbms_scheduler.purge_log(log_history => ,which_log => ,job_name => );
END;
14. dbms_scheduler包一些檢視
--*代表all或dba或user
14.1. 檢視job的檢視
*_scheduler_jobs --檢視job
*_scheduler_job_args --檢視job的所有輸入引數
*_scheduler_job_classes --檢視job的類資訊
*_scheduler_job_dests --檢視job狀態
*_scheduler_job_log --檢視job日誌
*_scheduler_job_run_details --檢視job執行的詳細資訊
all_scheduler_running_jobs
14.2. 檢視chain的一些檢視
*_scheduler_chains
*_scheduler_chain_rules
*_scheduler_chain_steps
*_scheduler_running_chains --檢視正在執行的chains
14.3. 檢視program的檢視
*_scheduler_programs --檢視程式
*_scheduler_program_args --檢視程式引數
14.4. 檢視排程組資訊
*_scheduler_groups
*_scheduler_group_members
14.5. 檢視window的檢視
(這類檢視只有dba和all開頭的)
*_scheduler_windows --檢視window
*_scheduler_window_details --檢視window詳細資訊
*_scheduler_window_groups --檢視window組
*_scheduler_window_log --檢視window日誌
*_scheduler_wingroup_members ----檢視window成員
14.6. 檢視scheduler檢視
*_scheduler_schedules --檢視排程
*_scheduler_global_attribute --顯示所有的排程屬性
*_scheduler_credentials
*_scheduler_db_dests
*_scheduler_dests
*_scheduler_external_dests
*_scheduler_file_watchers
*_scheduler_notifications
*_scheduler_remote_databases
*_scheduler_remote_jobstate
14.7. 檢驗後續執行時間
dbms_scheduler提供了一個過程可以很方便的檢驗指定的計劃(repeat_interval)。
DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING (
calendar_string IN VARCHAR2,
start_date IN TIMESTAMP WITH TIME ZONE,
return_date_after IN TIMESTAMP WITH TIME ZONE,
next_run_date OUT TIMESTAMP WITH TIME ZONE);
下面建立一個過程evaluate_repeat_interval,
傳入repeat_interval字串和計算的次數,會把每次的執行時間列印出來。
create or replace procedure evaluate_repeat_interval(
p_repeat_interval in varchar2,
p_number_of_evaluation in int,
p_start_date in timestamp with time zone default sysdate
)
as
l_return_date_after timestamp with time zone;
l_next_run_date timestamp with time zone;
begin
l_return_date_after := p_start_date;
for i in 1..p_number_of_evaluation loop
dbms_scheduler.evaluate_calendar_string(
calendar_string=>p_repeat_interval,
start_date=>p_start_date,
return_date_after=>l_return_date_after,
next_run_date=>l_next_run_date);
dbms_output.put_line(l_next_run_date);
l_return_date_after := l_next_run_date;
end loop;
end;
--呼叫的例子1:每個月的最後一天
begin
evaluate_repeat_interval(
p_repeat_interval=>'FREQ=MONTHLY;BYMONTHDAY=-1',
p_number_of_evaluation=>3,
p_start_date=>to_timestamp_tz('2012-01-01 00:00:00.000 +08:00',
'yyyy-mm-dd hh24:mi:ss.ff tzh:tzm'));
end;
--執行結果
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29519108/viewspace-2157322/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Scheduler in Oracle Database 10g(轉)OracleDatabase
- ORACLE database vaultOracleDatabase
- Oracle clone databaseOracleDatabase
- Oracle Database Cloud - Database as a Service Quick StartOracleDatabaseCloudUI
- Oracle Physical Database LimitsOracleDatabaseMIT
- Computer programming and database - 考試整理Database
- Oracle 12.2 使用Database Link優化Standby Database WorkloadOracleDatabase優化
- Oracle定時任務dbms_schedulerOracle
- Oracle 19c Concepts(01):Introduction to Oracle DatabaseOracleDatabase
- Oracle 19c Concepts(13):Oracle Database InstanceOracleDatabase
- Oracle OCP(35):Database 安裝OracleDatabase
- oracle 10g flashback databaseOracle 10gDatabase
- Oracle DG Standby Database型別OracleDatabase型別
- Oracle DG建立Physical Standby DatabaseOracleDatabase
- Oracle DG建立Logical Standby DatabaseOracleDatabase
- oracle排程程式作業dbms_schedulerOracle
- oracle使用DBMS_SCHEDULER排程作業Oracle
- Oracle 12C Database File Mapping for Oracle ASM FilesOracleDatabaseAPPASM
- Oracle OCP(38):Database 物理結構OracleDatabase
- 關於Oracle Database Vault介紹OracleDatabase
- [翻譯]-Detect And Repair Corruption in an Oracle DatabaseAIOracleDatabase
- Oracle 19c Database Management ToolsOracleDatabase
- Oracle 19c Concepts(00):Changes in This Release for Oracle Database ConceptsOracleDatabase
- 【Oracle】Windows安裝oracle11gR1 database 11.1.0.6OracleWindowsDatabase
- oracle11g: Scheduler Maintenance Tasks or Autotasks (Doc ID 756734.1)OracleAINaN
- Oracle OCP(37):Database 體系結構OracleDatabase
- Converting Oracle Database from Linux to Windows using RMANOracleDatabaseLinuxWindows
- Oracle database 升級(文件)to 10.2.0.4 from 10.2.0.1OracleDatabase
- Migration Of An Oracle Database Across OS Platforms [ID 733205.1]OracleDatabaseROSPlatform
- Sqlcl 連線Oracle DataBase 19cSQLOracleDatabase
- 1 Oracle Database 19c 新特性OracleDatabase
- Oracle 19c Concepts(18):Concepts for Database AdministratorsOracleDatabase
- Oracle 19c Concepts(19):Concepts for Database DevelopersOracleDatabaseDeveloper
- Oracle OCP(39):Database 記憶體結構OracleDatabase記憶體
- [20181007]Scalable sequences oracle database 12c.txtOracleDatabase
- Oracle Database 19c安裝Sample SchemasOracleDatabase
- G009-ORACLE-ASK Using In-Database ArchivingOracleDatabase
- 1 Oracle Database Release 20c New FeaturesOracleDatabase