Oracle Database Scheduler整理

studywell發表於2018-07-04

Oracle Database Scheduler整理

edit by :2018-7-4 15:28

10g引入的這個dbms_scheduler包,替代了之前的dbms_job包,該包功能更強大,可以將job需要的各種資源分開再進行組合。

使用dbms_scheduler建立一個定時任務有兩種形式

1)建立1SCHEDULER來定義計劃,1PROGRAM來定義任務內容,再建立1JOB,為這個JOB指定上面的SCHEDULERPROGRAM

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.  使用programschedulerwindowsjob組合

---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_PROCEDUREPLSQL_BLOCKEXECUTABLE

      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_datecomments預設可以不填

例子:

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——必須先建立一個queuedbms_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

--不採用programscheduler直接建立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;

--根據programscheduler建立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.  group11g才有的)

6.1.  create_group

引數:

group_type——組型別,該組的所有成員必須是同一型別,已有的型別有三種:

1)      DB_DEST:即成員為目標資料庫,執行遠端資料庫的job

2)      EXTERNAL_DESTExternal destination):Members are external destinations, for running remote external jobs

3)      WINDOWMembers 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)      jobclassresource_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_OFFDBMS_SCHEDULER.LOGGING_RUNSDBMS_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_schedulerWINDOW可以緩解該問題。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

如果programdisabled,僅僅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_OFFDBMS_SCHEDULER.LOGGING_RUNSDBMS_SCHEDULER.LOGGING_FULL

2)      restartable——設定job失敗是否要重啟

3)      max_failures——允許job失敗的次數,範圍11000000,預設為空。

4)      max_runs——job執行的最大次數,範圍11000000,預設為空(即意味著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。因此預設情況下關閉了windowjob還是會繼續執行,但是要注意,window關閉則意味著資源使用計劃就會變化。

8)      job_priority——在同一個classjob執行的優先順序,預設為3.

9)      schedule_limit——允許啟動job延遲的時間,設定值從1分鐘到99天。超過了延遲的時間則不再啟動job。如果不設定該值,則只要得到允許所需的資源就會啟動。另外,在延遲的這段時間裡,job的執行次數或失敗次數                會跳過,不計算這段時間的。

10)   program_name——job執行的物件。如果設定了該屬性,則job_action, job_typenumber_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 conditionqueue specification

22)   raise_events——設定當job為什麼狀態時丟擲,具體的時間型別見event型別。

23)   log_history-----設定log_history90天,預設30天;BEGIN    dbms_scheduler.set_scheduler_attribute('log_history', '90');END;

12.5.    start_date

實際上是schedule生效的日期,

對於一個定時執行的schedule,實際上的開始日期取決於repeat_interval引數。

如果start_datenull,等同於jobenable的時刻。

Oraclestart_date來作為repeat_intervaldefault值。

例如,如果指定start_date1/31/2010 9:45:58,指定repeat_interval'FREQ=YEARLY'

等同於'freq=yearly;bymonth=1;bymonthday=31;byhour=9;byminute=45;bysecond=58'

不能給repeat_interval指定時區資訊,Oraclestart_date的時區資訊作為指定的時區。

12.6.    set_attribute_null

12.7.    get_attribute

13.      scheduler attribute

設定排程屬性的值

13.1.    set_scheduler_attribute

attribute型別有:default_timezoneemail_serveremail_senderemail_server_credentialemail_server_encryption                event_expiry_time log_historymax_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包一些檢視

--*代表alldbauser

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的檢視

(這類檢視只有dbaall開頭的)

*_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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章