Oracle DB 使用調度程序自動執行任務

• 使用調度程序來簡化管理任務

• 創建作業、程序和調度

• 監視作業執行

• 使用基於時間或基於事件的調度來執行調度程序作業

• 描述窗口、窗口組、作業類和使用者組的用途

• 使用電子郵件通知

• 使用作業鏈來執行一系列相關任務

• 描述遠程系統上的調度程序作業

• 使用高級調度程序概念來區分作業的優先級

  • 簡化管理任務

Oracle 環境中的許多任務都需要作業調度功能。例行的數據庫維護和應用程序邏輯要求定 期調度並運行作業。企業到企業(B2B) 應用程序要求對其業務事件進行調度。DBA 需要 在指定時間窗口中調度定期維護作業。

Oracle DB 通過數據庫調度程序提供高級調度功能,此調度程序是DBMS_SCHEDULER程 序包 中函數和過程的集合。可以在任何SQL 環境中,或者通過Oracle Enterprise Manager  (EM) 來調用此調度程序。

使用此調度程序,數據庫管理員和應用程序開發者可以控制在數據庫環境中執行各種任務 的時間和位置。這些任務可能既耗時又複雜;可以使用調度程序來管理和計劃這些任務。 可以根據時間或者在發生指定事件時啓動調度程序作業,而且調度程序還可以在作業狀態 更改時(例如,從RUNNING變爲COMPLETE)引發事件。還可以使用爲達到組合目標 而鏈接在一起的一系列已命名的程序。

  • 核心組件

核心組件和主要步驟

一個作業包含兩個必需組件: 需要執行的操作,操作的發生時間或調度 。“操作”是由命 令區域和作業屬性中的job_type和job_action參數表示的。“時間”是在調度中表 示的,調度可以基於時間或事件,或者從屬於其它作業的結果。

調度程序使用以下基本組件:

•   “作業”指定要執行的操作 。它可以是PL/SQL 過程、純二進制可執行文件、Java 應 用程序或Shell 腳本。可以將程序(內容)和調度(時間)指定爲作業定義的一部分,

也可以改用現有的程序或調度。可以使用作業的參數來定製其運行時行爲。

•   “調度”指定作業的執行時間和次數。 調度可以基於時間或事件。可以爲作業定義調 度,方法是使用一系列日期、一個事件,或兩者相結合,以及表示重複間隔的附加說

明。可以單獨存儲作業的調度,然後對多個作業使用同一個調度。

• “程序”是有關特定可執行文件、腳本或過程的元數據集合。 自動作業將執行某個任務。使用程序,無需修改作業本身即可修改作業任務或者“內容”。可以定義程 序的參數,使用戶可以修改任務的運行時行爲。

  • 基本工作流

使用調度程序來簡化管理任務:

1. 創建程序(啓用或禁用)- 可選

– 在多個作業中重用此操作

– 在無需重新創建PL/SQL 塊的情況下更改作業的調度

2. 創建並使用調度

3. 創建並提交作業

可以在Oracle Enterprise Manager 的圖形環境中執行所有步驟,或者通過命令行使用 DBMS_SCHEDULER PL/SQL 程序包執行所有步驟。

1. 創建程序

使用 CREATE_PROGRAM 過程來創建程序。使用調度程序時,創建程序是一個可選部分。 還可以對操作進行編碼,使其在CREATE_JOB過程的匿名PL/SQL 塊中執行。通過單 獨創建程序,可以定義一次操作,然後在多個作業中重用此操作。使用這種方法,無須 重新創建PL/SQL 塊即可更改作業的調度。

默認情況下,程序是以禁用狀態創建的(除非enabled參數設爲TRUE)。在將禁用的 程序啓用之前,作業無法執行此程序。可以通過將enabled的值指定爲TRUE來指定應以啓用狀態創建程序。

2. 創建並使用調度

作業的調度可以是預定義的調度(用CREATE_SCHEDULE過程創建的),也可以是在創 建作業時定義的。

調度指定有關作業運行時間的屬性,例如:

• 起始時間,定義作業從哪一時間開始執行;結束時間,指定作業在哪一時間之後失效 且不再進行調度

• 指定作業重複間隔的表達式

• 通過組合現有調度創建的複雜調度

• 啓動作業之前必須滿足的條件或狀態變化(稱爲事件)

通過使用調度(而不是在作業定義中指定作業的執行次數),可以管理多個作業的預定 執行,而無須更新多個作業定義。如果修改了某個調度,則使用該調度的每個作業都將自 動使用新調度。

3. 創建並運行作業

作業是一個組合,其中包括調度、要執行的操作的說明以及作業需要的所有附加參數。可 以爲作業設置許多屬性。屬性將控制作業的執行方式。

作業操作在程序中(而不是直接在作業中)時,無需 重新創建PL/SQL 塊即可更改作業調度。

每個作業必須有一個調度。調度可以是預定義的,也可 以在創建作業的過程中定義。

  • 持久輕量作業
持久輕量作業:

• 減少啓動作業所需的開銷和時間

• 作業元數據和運行時數據在磁盤上佔用很小的空間

• 是使用作業模板(在命令行中)創建的

BEGIN

DBMS_SCHEDULER.CREATE_JOB (

job_name => 'my_lightweight_job2', 

program_name => 'MY_PROG', 

schedule_name => 'MY_SCHED',

job_style => 'LIGHTWEIGHT');

END;
/

選擇合適的作業類型:

–使用常規作業可提供最大靈活性。

–需要在很短的時間內創建大量作業時,請使用持久輕量作業。

輕量作業:

• 適合需要在一秒內創建數百個作業的客戶。對於常規作業,每個作業都要創建一個數 據庫對象,用於描述作業、修改多個表以及在進程中創建重做。此種類型作業需求的 相關開銷是很大的。在Oracle DB 調度程序中,有一種“持久輕量作業”。輕量作業的目的是減少啓動作業所需的開銷和時間。將爲作業創建極少的元數據。這可以減少啓動作業時所需的時間和創建的重做。

• 作業元數據和運行時數據在磁盤上佔用很小的空間。在磁盤上佔用的空間小還可實現 在RAC 環境中進行負載平衡。

• 始終是使用作業模板創建的 。作業模板必須是一個存儲過程或一個程序。存儲過程可 以保存作業所需的所有信息,包括權限。只可以指定少量作業屬性:作業參數和調度。

• 必須在命令行中創建。JOB_STYLE參數在EM 中不可用。

在示例中,MY_PROG是作業模板,調度是通過已命名的調度應用的。

  • 使用基於時間的或基於事件的調度

要爲作業指定基於時間的調度,可以指定日曆表達式或日期時間表達式。使用日曆表達式 時,將使用作業的重複間隔和起始日期來計算作業的下一啓動時間。使用日期時間表達式 時,指定的表達式確定作業下次應運行的時間。如果沒有指定重複間隔,作業將只在指定 的起始日期運行一次。

如果作業使用基於事件的調度,作業將在事件發生時運行。在較高層次上,可以將事件視 爲狀態的更改。布爾條件的狀態從FALSE更改爲TRUE,或者從TRUE更改爲FALSE時, 將發生事件。

調度程序使用Oracle Streams Advanced Queuing (AQ) 來引發和使用事件。

注:調度程序不保證作業恰好在計劃的時間執行,因爲可能會由於系統過載而造成資源不 可用。

  • 創建基於時間的作業

示例:創建一個作業,從今晚起在每晚11:00 調用備份腳本。

BEGIN

DBMS_SCHEDULER.CREATE_JOB(

job_name=>'HR.DO_BACKUP',

job_type => 'EXECUTABLE',

job_action => 

'/home/usr/dba/rman/nightly_incr.sh',

start_date => SYSDATE,

repeat_interval =>'FREQ=DAILY;BYHOUR=23', 

/* next night at 11:00 PM */

comments => 'Nightly incremental backups');

END;
/

創建基於時間的作業

可以使用DBMS_SCHEDULER程序包的 CREATE_JOB 過程來創建作業。默認情況下將以 禁用狀態創建作業,僅當顯式啓用時,這些作業才生效並可以調度。所有作業名稱都採用 以下形式:[schema.]name。

應該使用SYSTIMESTAMP並指定時區,這樣當時間因夏時制更改時,作業能夠自動調整 其執行時間。

默認情況下,將在當前方案中創建作業。可以通過指定方案的名稱在另一個方案中創建作 業,如示例所示。作業所有者是在其方案中創建作業的用戶,而作業創建者是創建作業的用戶。作業將按作業所有者的權限來執行。作業運行時的國家語言支持(NLS)  環境與創建作業時的環境相同。job_type參數指示作業將要執行的任務的類型。可能的 值包括:

• PLSQL_BLOCK:匿名PL/SQL 塊

• STORED_PROCEDURE:命名的PL/SQL、Java 或外部過程

• EXECUTABLE:可以從操作系統(OS) 命令行執行的命令

job_action參數可以是要運行的過程的名稱、腳本的名稱或操作系統命令的名稱,也可 以是匿名的PL/SQL 代碼塊,具體取決於job_type參數的值。

在示例中,job_type被指定爲EXECUTABLE,job_action是所需的外部 可執行文件加上任何命令行參數(可選)的操作系統相關完整路徑。

外部作業是指在數據庫外部運行的作業。所有外部作業均作爲低權限的來賓用戶運行,這 一點已在數據庫管理員配置外部作業支持時確定。因爲可執行文件作爲低權限的來賓帳戶 運行,所以應確保其有權訪問必要的文件和資源。大多數(但不是所有)平臺都支持外部 作業。對於不支持外部作業的平臺,如果將作業或程序的屬性創建或設置爲EXECUTABLE 類型,將返回錯誤。

  • 創建基於事件的調度

要創建基於事件的作業,必須設置:

• 隊列說明(應用程序將消息入隊以啓動作業)

• 一個事件條件(與Oracle Streams AQ 規則條件的 語法相同),如果爲TRUE則啓動作業

可以基於事件觸發作業。應用程序可以通知調度程序啓動作業,方法是將消息入隊到 Oracle Streams 隊列中。以這種方法啓動的作業稱爲基於事件的作業。要創建基於事件的 作業,必須用CREATE_JOB過程設置以下兩個附加屬性:

• queue_spec:對隊列的指定,包括應用程序將消息放入其中以引發作業啓動事件的 隊列的名稱;對於安全隊列,則爲<queue_name>、<agent_name> 對。

• event_condition:基於消息屬性的條件表達式,此表達式的求值結果必須爲TRUE,消息才能啓動作業。只要消息有效負載是用戶定義的對象類型,並且將表達式中的對象屬性加了tab.user_data前綴,就可以在表達式中包含用戶數據屬性。

可以將queue_spec和event_condition指定爲內嵌作業屬性,或者用這兩個屬性 創建基於事件的調度,然後創建一個引用此調度的作業。

  • 使用Oracle Enterprise Manager  創建基於事件的調度

使用Oracle Enterprise Manager 創建基於事件的調度

使用“Create Schedule(創建調度)”頁,可以從標準的、基於時間的調度和基於事件的 調度之中選擇一種來創建。如果選擇基於事件的調度,則界面將更改,然後可以指定隊 列名、代理名和事件條件以及其它調度屬性。

注:對於與event_condition匹配的事件的每個實例,調度程序都會運行基於事件的作業。但是,將忽略作業已經運行後發生的事件;事件將被使用,但不會觸發作業再次 運行。

  • 創建基於事件的作業

示例:創建一個作業,如果成批裝入的數據文件在上午9:00  前到達文件系統,則運行此作業。

BEGIN

DBMS_SCHEDULER.CREATE_JOB(

job_name=>'ADMIN.PERFORM_DATA_LOAD',

job_type => 'EXECUTABLE',

job_action => '/loaddir/start_my_load.sh',

start_date => SYSTIMESTAMP,

event_condition   => 'tab.user_data.object_owner = 

''HR'' and tab.user_data.object_name = ''DATA.TXT'' 

and tab.user_data.event_type = ''FILE_ARRIVAL'' 

and tab.user_data.event_timestamp < 9 ',

queue_spec   => 'HR.LOAD_JOB_EVENT_Q');

END;

創建基於事件的作業

要將事件信息指定爲作業屬性,請使用CREATE_JOB的替代語法,其中包括queue_spec和event_condition屬性。作業可以包含作爲作業屬性的內嵌事件信息, 或可以通過指向事件調度來指定事件信息。顯示的示例使用了內嵌的基於事件的 調度。

示例顯示了一個作業,只要有文件在上午9:00 前到達操作系統,就會啓動此 作業。假定消息有效負載是一個對象,該對象包括四個名稱分別爲object_owner、object_name、event_type和event_timestamp的屬性。

本例使用的是用戶定義的事件。因此,文件在到達了文件系統後,必須有一個程序或過程 將包含正確信息的事件對象類型入隊到指定的事件隊列中,才能啓動此作業。

HR.LOAD_JOB_EVENT_Q隊列必須與用於將事件的發生通知調度程序的事件對象類型相 同。即,HR.LOAD_JOB_EVENT_Q隊列必須是類型化隊列,其中的類型包括四個名稱爲 object_owner、object_name、event_type和event_timestamp的屬性。

  • 基於事件的調度
事件類型:

• 用戶或應用程序生成的事件

• 調度程序生成的事件

由調度程序作業引發的事件:

• JOB_STARTED

• JOB_SUCCEEDED

• JOB_FAILED
• JOB_BROKEN

• JOB_COMPLETED

• JOB_STOPPED

• JOB_SCH_LIM_REACHED

• JOB_DISABLED 

• JOB_CHAIN_STALLED 

• JOB_ALL_EVENTS 

• JOB_RUN_COMPLETED 

• JOB_OVER_MAX_DUR

引發事件的示例:

DBMS_SCHEDULER.SET_ATTRIBUTE('hr.do_backup', 

'raise_events', DBMS_SCHEDULER.JOB_FAILED); 

基於事件的調度

你可以創建一個作業,但不向作業分配調度,而是通過直接引用事件來啓動作業。有兩種 類型的事件:

• 用戶或應用程序生成的事件:應 用程序可以引發由調度程序使用的事件。調度程序通 過啓動作業來回應事件。此類事件的示例:正在運行的作業完成;文件到達文件系統; 數據庫內的帳戶被鎖定;以及庫存到達下限閾值。

• 調度程序生成的事件: 調度程序可以引發事件來指示在調度程序自身內發生的狀態更 改。例如,在作業啓動時、作業完成時、作業超出其分配的運行時間時等條件下,調 度程序均可以引發事件。事件的使用者是一個應用程序,該應用程序將執行某個操作 以便對事件做出響應。

你可以對作業進行配置,使調度程序在作業的狀態更改時引發事件。可以通過設置raise_events作業屬性來完成此操作。默認情況下,在變更作業的raise_events 屬性之前,作業不會引發任何狀態更改事件。要變更此屬性,必須先使用CREATE_JOB 過程創建作業,然後使用SET_ATTRIBUTE過程修改此屬性的默認值。本例顯示hr.do_backup作業已變更,使得該作業在失敗時引發事件。 爲作業啓用作業狀態更改事件後,調度程序將引發這些事件,方法是將消息入隊到默認的 事件隊列SYS.SCHEDULER$_EVENT_QUEUE中。

默認的調度程序事件隊列是一個安全隊列。可能需要配置隊列,才能允許特定用戶在此隊 列上執行操作,具體取決於應用程序。

默認的調度程序事件隊列主要用於調度程序生成的事件。Oracle 建議你不要將此隊列用於 用戶應用程序或用戶定義的事件。

  • 創建複雜調度
創建複雜調度

調度是數據庫中的對象。創建調度時,將自動保存這些調度。可以使用調度的組合來創建 更復雜的調度。通過組合調度,可以向日歷表達式中添加特定日期,或者從日曆表達式中 排除特定日期。

定義調度的重複間隔時可以使用下列選項:

• INCLUDE:向日歷表達式結果中添加日期列表

• EXCLUDE:從日曆表達式結果中刪除日期列表

• INTERSECT:只使用兩個或多個調度共有的日期

創建要組合使用的調度時,可以對日期列表進行編碼,方法是包含形式爲[YYYY]MMDD 的硬編碼日期,或者包含用CREATE_SCHEDULE過程創建的已命名調度。例如,可以對 調度的重複間隔使用下列值來指定日期列表:

0115,0315,0325,0615,quarter_end_dates,1215

此字符串表示日期1 月15 日、3 月15 日、3 月25 日、6 月15 日、12 月15 日以及QUARTER_END_DATES調度所指定的日期列表。

如果未在調度中指定硬編碼日期的可選年份,則包括每一年的這些日期。

持久輕量作業的作業元數據和運行時數據在磁盤上佔用 很小的空間。 持久輕量作業是使用作業模板創建的。

  • 使用電子郵件通知

• 作業狀態更改電子郵件通知

• 是由作業狀態事件觸發的

• 多個通知,多個收件人

• *_SCHEDULER_NOTIFICATIONS視圖

使用調度程序電子郵件通知:

1. 指定你將用來發送電子郵件的SMTP 服務器的地址:

DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE

('email_server','host[:port]');

2. 還可以設置默認的發件人電子郵件地址:

DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE

('email_sender','valid email address');

3. 爲指定作業添加電子郵件通知。 (續)

使用作業電子郵件通知功能,可以向現有作業添加電子郵件通知,以便作業中發生受關 注事件後向指定的電子郵件地址發送通知。對於每個作業,可以爲不同的事件添加通知。 可以將電子郵件通知發送給多個收件人。

要啓用電子郵件通知功能,你必須:

1.設置email_server調度程序屬性。

2.此外,還可以使用email_sender調度程序屬性指定電子郵件通知的默認發件人 電子郵件地址。

3.創建作業後,執行DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION過程, 爲作業添加一個或多個通知。

數據字典通過*_SCHEDULER_NOTIFICATIONS視圖支持電子郵件通知。

  • 添加和刪除電子郵件通知

DBMS_SCHEDULER. ADD_JOB_EMAIL_NOTIFICATION   (

job_name  IN VARCHAR2,

recipients  IN VARCHAR2,--- 逗號分隔的 電子郵件地址列表

sender  IN VARCHAR2 DEFAULT NULL,

subject IN VARCHAR2

DEFAULT dbms_scheduler.default_notification_subject,

body IN VARCHAR2

DEFAULT dbms_scheduler.default_notification_body,

events  IN VARCHAR2--- 必需的逗號分隔列表

DEFAULT 'JOB_FAILED,JOB_BROKEN,JOB_SCH_LIM_REACHED,

JOB_CHAIN_STALLED,JOB_OVER_MAX_DUR',

filter_condition  IN VARCHAR2 DEFAULT NULL);

DBMS_SCHEDULER. REMOVE_JOB_EMAIL_NOTIFICATION   (

job_name  IN VARCHAR2,

recipients  IN VARCHAR2 DEFAULT NULL,

events  IN VARCHAR2 DEFAULT NULL);

添加和刪除電子郵件通知

使用DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION過程添加一個或多個作業 電子郵件通知。只要作業生成了列出的任一事件,系統就會將電子郵件發送至指定的收件 人地址。作業將自動修改以便引發這些事件。如果指定了過濾條件,則只有與 FILTER_CONDITION中的規範匹配的事件將生成電子郵件。

如果未設置EMAIL_SERVER調度程序屬性或指定的作業不存在,則該過程將失敗。調用 該過程的用戶必須是作業的所有者,必須具有CREATE ANY JOB系統權限,或已經被授 予了對作業的ALTER權限。

• 通知電子郵件的主題可以包含值將被替換的下列變量:%job_owner%、%job_name%、%event_type%、%event_timestamp%、%log_id%、

%error_code%、%error_message%、%run_count%、%failure_count%、%retry_count%、%job_subname%、%job_class_name%。

• 通知電子郵件的正文可以包含SUBJECT中有效的任何變量。

• 逗號分隔的事件列表不能爲空。

• 如果filter_condition爲空(默認值),則只要指定事件出現,系統就會向所有指定的 收件人地址發送通知。

使用DBMS_SCHEDULER.REMOVE_JOB_EMAIL_NOTIFICATION過程刪除指定作業的 一個或多個電子郵件通知。

  • 創建作業鏈
1. 創建鏈對象。
2. 定義鏈步驟。
3. 定義鏈規則。
4. 啓動鏈:
– 啓用鏈。

– 創建指向鏈的作業。

鏈是爲達到組合目標而鏈接在一起的一系列已命名的程序。這被稱爲“依存調度”。鏈的 示例如下所示:

運行程序A 然後運行程序B,如果程序A 和程序B 成功完成,則只運行程序C,否則運 行程序D。

在相互依賴的程序構成的鏈中,每個位置都稱爲一個步驟。通常情況下,鏈的一系列初始 步驟啓動之後,後續步驟的執行依賴於一個或多個之前步驟的完成。要創建並使用鏈,請 依次完成下列步驟。如果沒有特別說明,則提到的所有過程都是DBMS_SCHEDULER程序 包的一部分。

1.使用CREATE_CHAIN過程創建鏈。 可以選擇用方案名稱來限定鏈名稱(如myschema.myname)。

2.定義(一個或多個)鏈步驟。 定義步驟時需要命名此步驟並指定步驟中發生的操作。

每個步驟都可以指向下列項之一:

- 程序

- 另一個鏈(嵌套鏈)

- 事件

通過調用DEFINE_CHAIN_STEP過程來定義指向程序或嵌套鏈的步驟。

要定義等待事件發生的步驟,請使用DEFINE_CHAIN_EVENT_STEP過程。過程參數可以指向事件調度,也可以包括內嵌隊列說明和事件條件。指向事件的步驟會一直等待,直到指定事件被引發。如果此事件發生,則步驟將成功完成。

3.創建鏈對象後,請定義鏈規則。 鏈規則定義各步驟運行的時間,並定義各步驟之間的 依賴關係。每個規則都有一個“條件”和一個“操作”:

- 如果條件的求值結果爲TRUE,則執行操作。條件中可以包含在SQL WHERE子句中有效的任何語法。條件通常基於前面一個或多個步驟的結果。例如,你可能希 望使某步驟在前兩個步驟全部成功的情況下運行,而使另一個步驟在前兩個步驟 未全部成功的條件下運行。

- 操作指定在觸發規則時要執行的內容。

典型操作是運行指定的步驟。可能的操作包括啓動或停止步驟。還可以選擇結束 作業鏈的執行、返回一個值或者返回步驟名和錯誤代碼。

添加到鏈中的所有規則共同確定了鏈的整體行爲。在作業啓動時以及在每個步驟結束 時,將對所有規則求值以確定接下來發生的操作。請使用DEFINE_CHAIN_RULE過程向鏈中添加規則。向鏈中添加每個規則時均需要調用一次此過程。

4.啓動 鏈包括兩個操作:

- 用ENABLE過程啓用鏈。(鏈總是以禁用狀態創建,因此可以在任何作業執行該 鏈之前向其中添加步驟和規則。)啓用一個已啓用的鏈不會返回錯誤。

- 要運行鏈,必須創建'CHAIN'類型的作業。作業操作必須引用鏈名稱。可以爲 此作業使用基於事件的調度或基於時間的調度。

  • 鏈的示例

在此鏈示例中,請考慮在批量數據加載期間出現的所有任務和條件。首先,必須有要加載 的數據。然後加載數據,同時觀察文件系統以確保在加載期間不會發生空間不足的情況。

在數據加載完成後,需要重建在更新後的表上定義的索引。然後針對新加載數據運行報表。

該幻燈片顯示了一個依存調度示例。

  • 高級調度程序概念

使用高級調度程序功能,可以對調度的各個方面施加更強的控制,例如作業窗口和區分作 業優先級。

• “窗口”由定義好起始時間和結束時間的時間間隔表示,用於在不同時間激活不同的資源計劃。這使你可以更改某一時段(如一天或銷售年度內的某一時間段)的資源 分配。

• “窗口組”表示一系列窗口,使用它可以更輕鬆地管理窗口。可以將窗口或窗口組用於作業的調度,以確保作業僅在窗口及其關聯資源計劃有效時運行。

• “作業類”定義了一類作業,這些作業具有共同的資源使用要求和其它特性。作業類將作業分組到更大的實體中。

• 與作業類關聯的“資源使用者組”確定分配給作業類中作業的資源。

• 使用“資源計劃”,用戶可以在各資源使用者組中區分資源(特別是CPU)的優先級。

注:灰色對象不是調度程序對象。

  • 作業類

• 爲其中的成員作業分配一組相同的屬性值

• 是由CREATE_JOB_CLASS過程創建的

• 在作業類中指定作業(使用SET_ATTRIBUTE過程)

• 屬於SYS方案

• 爲成員作業設置資源分配

• 將服務屬性設置爲所需的數據庫服務名稱

• 將作業分組以區分優先級

作業類

作業類是參與的成員作業的策略。每個作業類指定一組屬性,例如日誌記錄級別。爲作業 類分配作業時,作業可以繼承這些屬性。例如,可以指定用相同的策略來清除所有工資單 作業的日誌項。

• 可以使用CREATE_JOB_CLASS過程來創建作業類。類始終屬於sys方案。要創建類,必須具有MANAGE SCHEDULER權限。存在一個名爲DEFAULT_JOB_CLASS的默認作業類,此作業類是隨數據庫一起創建的。

• 創建了作業類之後,可以在創建作業時或者在創建作業之後,將作業指定爲此作業類 的成員,方法是使用DBMS_SCHEDULER程序包中的SET_ATTRIBUTE過程。如果 沒有將作業與某個作業類相關聯,則作業屬於該默認作業類。

• 將作業類的服務屬性設置爲所需的數據庫服務名稱。這決定了Real Application Clusters 環境中運行成員作業的實例和指定給成員作業的系統資源(後者可選)。

• 爲成員作業設置資源分配 。作業類可以將數據庫資源管理器與調度程序關聯起來,因 爲每個作業類可以將一個資源使用者組指定爲一個屬性。這樣成員作業就屬於指定的 使用者組,並根據當前資源計劃中的設置分配資源。此外,還可以將resource_consumer_group屬性保留爲NULL並將作業類的服務屬性設置爲所需 的數據庫服務名稱。然後,該服務可以映射到資源使用者組。如果同時設置了resource_consumer_group和服務屬性並且指定的服務映射到資源使用者組,則 優先使用resource_consumer_group屬性中指定的資源使用者組。如果創建作 業類時未指定資源使用者組,則作業類將映射到DEFAULT_CONSUMER_GROUP資源 使用者組。啓用了資源管理器後,對於默認作業類中的作業或者與默認資源使用者組 關聯的作業類中的作業,可能無法爲其分配足夠的資源以完成各自的任務。

• 爲作業分組以區分優先級。 可以爲同一作業類中的單個作業分配1 到5 之間的優先級 值,這樣如果將該類中的兩個作業安排在同一時間啓動,優先級較高的作業優先。這 樣可以確保次要作業不會阻礙重要作業及時完成。如果爲兩個作業指定的優先級值相 同,啓動日期較早的作業優先。如果沒有爲作業指定優先級值,則其優先級默認爲3。

  • 窗口
調度程序窗口:

• 可以在不同時間段啓動作業或更改資源在作業間的分配

• 一次只有一個是活動的

• 是使用CREATE_WINDOW過程創建的

作業的優先級可以隨時間而變化。例如,在夜間可能要將大部分數據庫資源分配給數據倉 庫加載作業,而在白天則將較大一部分資源分配給應用程序作業。要實現這一點,可以使 用調度程序窗口來更改數據庫資源計劃。

• 調度程序窗口可以在一天、一週等的不同時間段自動啓動作業或更改資源在作業間的 分配。窗口由定義好起始時間和結束時間的時間間隔表示,例如“從凌晨12:00 到早上6:00”。

• 在任意給定時間內,只能存在一個有效的窗口。

• 可以使用CREATE_WINDOW過程創建窗口。

調度程序窗口使用作業類來控制資源分配。每個窗口指定了在該窗口打開(生效)時激活 的資源計劃,而每個作業類指定了資源使用者組或可以映射到使用者組的數據庫服務。因 此,在窗口中運行的作業所擁有的資源是根據其作業類的使用者組和窗口的資源計劃分配 的(如圖形所示)。

  • 區分窗口內作業的優先級

區分作業優先級:

• 在類級別(通過資源計劃)

• 在作業級別(使用作業優先級屬性)

• 不能擔保不同作業類中的作業的優先級

在一個數據庫中創建多個作業時,你需要通過某種方式來根據你的業務需求安排作業處理, 並指定哪些作業具有最高優先級。對於特定窗口,可能有多種類別的作業在運行,每一類 都具有各自的優先級。

可以在兩個級別區分優先級:類級別和作業級別。

• 首先是在類級別區分優先級,使用的是資源計劃。完全根據類資源分配情況來區分屬 於不同類的作業的優先級。

• 其次是在類內區分優先級,使用的是作業的作業優先級屬性。

僅當屬於同一個類的兩個作業同時啓動時,纔會考慮優先級。優先級較高的作業先啓動。

不能確保不同作業類中的作業按其優先級運行。例如,APPL_JOBS作業類中的高優先級 作業不一定在ADMIN_JOBS作業類中的低優先級作業之前啓動,即使它們共享同一個計 劃時也是如此。如果APPL_JOBS作業類有較低級別的資源可用,則該類中的高優先級作 業必須等待資源可用,即使在其它作業類中存在可用於低優先級作業的資源時也是如此。

  • 創建作業數組

1. 聲明sys.job和sys.job_array類型的變量:

DECLARE

newjob sys.job;

newjobarr sys.job_array;

2. 初始化作業數組:

BEGIN 

newjobarr := SYS.JOB_ARRAY();

3. 調整作業數組大小以存儲所需的作業數量:

newjobarr.EXTEND(100);

使用作業數組是一種效率較高的創建作業集的方式。這也適用於輕量作業。在示 例中,在一個作業數組中創建了100 個作業說明,並且將這些說明提交到了單個事務處理 的作業隊列中。請注意,對於輕量作業,所需的信息量非常有限。在此示例中,start_time參數默認爲NULL,因此作業被安排爲立即啓動。

1.聲明用於存儲作業定義的變量和一個作業數組變量。

2. 使用SYS.JOB_ARRAY構造器初始化作業數組。這將爲數組中的每個作業創建一個 位置。

3.將數組大小設置爲預期的作業數。

4. 創建每個作業,並將其放入數組中。在示例中,唯一的差異是作業的名稱。

作業的start_time變量將被省略並默認爲NULL,表示將立即運行該作業。

5. 使用CREATE_JOBS過程將數組中的所有作業作爲一個事務處理提交。

注:如果數組很小,則性能不會顯著優於提交單個作業時的性能。

4. 將作業放入作業數組:

FOR i IN 1..100 LOOP

newjob := SYS.JOB(job_name=> 'LWTJK'||to_char(i),

job_style => 'LIGHTWEIGHT',

job_template => 'MY_PROG',

enabled => TRUE );

newjobarr(i) := newjob;

END LOOP;

5. 將作業數組作爲一個事務處理提交:

DBMS_SCHEDULER.CREATE_JOBS(newjobarr, 

'TRANSACTIONAL');

此示例的全部代碼如下:

DECLARE

newjob sys.job;

newjobarr sys.job_array;

BEGIN

-- Create an array of JOB object types

newjobarr := sys.job_array();

-- Allocate sufficient space in the array

newjobarr.extend(100);

-- Add definitions for jobs

FOR i IN 1..100 LOOP

-- Create a JOB object type

newjob := sys.job(job_name => 'LWTJK' || to_char(i),

job_style => 'LIGHTWEIGHT',

job_template => 'PROG_1',

enabled => TRUE );

-- Add job to the array

newjobarr(i) := newjob;

END LOOP;

-- Call CREATE_JOBS to create jobs in one transaction

DBMS_SCHEDULER.CREATE_JOBS(newjobarr, 'TRANSACTIONAL');

END;
/

可以使用作業數組創建輕量作業。

調度程序窗口使用作業類來控制資源分配。

作業鏈用於實施“依存調度”。

  • 創建文件監視器和基於事件的作業

請執行以下任務:

1. 創建調度程序身份證明對象並授予EXECUTE權限。

2. 創建文件監視器並授予EXECUTE權限。

3. 創建其元數據參數引用事件消息的調度程序程序對象。

4. 創建引用文件監視器的基於事件的作業。(可選)使 作業能夠針對文件到達事件的每個實例運行。

5. 啓用文件監視器、程序和作業。

創建文件監視器和基於事件的作業

執行以下任務來創建文件監視器和在指定文件到達後啓動的基於事件的作業:

1.創建調度程序身份證明對象(身份證明),用於通過主機操作系統驗證對文件的訪問 權限,並將對身份證明的EXECUTE權限授予文件監視器將啓動的基於事件的作業所 屬的方案。

2.創建文件監視器並將對文件監視器的EXECUTE權限授予引用文件監視器的基於事件 的作業所屬的任何方案。

3.創建其元數據參數引用事件消息的調度程序程序對象。

- 使用EVENT_MESSAGE屬性定義元數據參數。

- 創建具有一個類型爲SYS.SCHEDULER_FILEWATCHER_RESULT的參數的存儲過程,供該程序調用。存儲過程必須具有一個SYS.SCHEDULER_FILEWATCHER_RESULT類型(事件消息的數據類型)的參數。該參數的位置必須與所定義的元數據參數的位置相匹配。該過程可以訪問此 抽象數據類型的屬性,以瞭解有關已到達文件的信息。

4.創建引用文件監視器的基於事件的作業。可以使用DBMS_SCHEDULER.SET_ATTRIBUTE過程使作業能夠針對文件到達事件的每個實例 運行,即使該作業已經在處理之前的一個事件。將PARALLEL_INSTANCES屬性設置爲TRUE。

BEGIN

DBMS_SCHEDULER.SET_ATTRIBUTE('','PARALLEL_INSTANCES', TRUE); 

END;

這樣作業將作爲輕量作業運行,因此可以快速啓動作業的多個實例。如果將PARALLEL_INSTANCES設置爲默認值FALSE,則當基於事件的作業已經在處理

一個事件時,此時出現的文件監視器事件將被丟棄。

5.啓用文件監視器、程序和作業。

  • 從遠程系統啓用文件到達事件

執行以下任務在遠程系統上啓用文件到達事件觸發功能:

1. 設置數據庫以運行遠程外部作業。

2. 在第一個遠程系統上安裝、配置、註冊並啓動調度程序 代理。

3. 爲其餘的每個遠程系統重複步驟2。

要接收來自遠程系統的文件到達事件,你必須在系統上安裝調度程序代理,且必須在數據 庫中註冊代理。該遠程系統不需要Oracle DB 實例來生成文件到達事件。

  • 調度遠程數據庫作業

• 創建一個作業在同一主機或遠程主機上的另一個數據庫 實例上運行存儲過程和匿名PL/SQL 塊。

• 目標數據庫可以是任何版本的Oracle DB。

• DBMS_SCHEDULER.CREATE_DATABASE_DESTINATION 和DBMS_SCHEDULER.CREATE_CREDENTIAL可以用於 遠程數據庫作業。

• 作業類型爲PLSQL_BLOCK和STORED_PROCEDURE的 作業可以是SET_ATTRIBUTE爲DESTINATION和 CREDENTIAL屬性調用的目標。

現在,可以創建一個作業在同一主機或遠程主機上的另一個數據庫實例上運行存儲過程和 匿名PL/SQL 塊。目標數據庫可以是任何版本的Oracle DB。

現在沒有用於支持遠程數據庫作業的新過程,但是對現有DBMS_SCHEDULER過程進行了 更改以支持該功能。以下提供了詳細信息。

  • 創建遠程數據庫作業

執行以下任務以創建遠程作業:

1. 設置遠程作業的發起數據庫。

2. 使用DBMS_SCHEDULER.CREATE_JOB創建作業。

3. 使用DBMS_SCHEDULER.CREATE_CREDENTIAL創建 身份證明。

4. 使用DBMS_SCHEDULER.SET_ATTRIBUTE設置作業 CREDENTIAL_NAME。

5. 使用DBMS_SCHEDULER.SET ATTRIBUTE設置作業 的DESTINATION屬性。

6. 使用DBMS_SCHEDULER.ENABLE啓用作業。

創建遠程數據庫作業

你可以執行示例中列出的任務來創建遠程數據庫作業。

要設置遠程作業的發起數據庫,請執行以下步驟:

1. 驗證是否已安裝XML DB。

2. 啓用至數據庫的HTTP 連接。

BEGIN

DBMS_XDB.SETHTTPPORT(port);

END;

3. 執行prvtrsch.plb腳本。

4. 設置調度程序代理的註冊口令。

BEGIN

DBMS_SCHEDULER.SET_AGENT_REGISTRATION_PASS('password');

END;
  • 調度多個目標作業

• 該功能可用於指定要在其上執行作業的多個目標。

• 它使用戶能夠從創建作業的數據庫監視和控制這些作業。

• 多目標作業運行時,可將其視爲一個作業集合,其中的 各個作業是彼此近似相同的副本。

• 所有作業都將基於在作業開始日期中指定的時區運行, 或將使用源數據庫的時區。

多目標作業功能允許你指定多個要在其上執行作業的目標。你可以從創建作業的數據庫 監視和控制這些作業。其中包括以下功能:

• 指定必須在其上執行作業的數個數據庫或計算機

• 將在多個目標上調度的同一作業作爲單個實體進行修改

• 停止或刪除在一個或多個遠程目標上運行的作業

• 查看作業實例在所有作業目標上的狀態

請注意,在該功能的初始版本中,所有目標都基於在作業開始日期中指定的時區運行, 或默認使用源數據庫的時區。

  • 查看調度程序元數據

主要調度程序管理視圖,顯示:

• *_SCHEDULER_JOBS:所有作業,包括啓用的和禁用的

• *_SCHEDULER_SCHEDULES:所有調度

• *_SCHEDULER_PROGRAMS:所有程序

• *_SCHEDULER_RUNNING_JOBS:活動的作業狀態

• *_SCHEDULER_JOB_LOG:所有作業狀態更改

• *_SCHEDULER_JOB_RUN_DETAILS:所有已完成的作業 運行

SELECT job_name, status, error#, run_duration

FROM USER_SCHEDULER_JOB_RUN_DETAILS;

JOB_NAME STATUS ERROR# RUN_DURATION 

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

GATHER_STATS_JOB SUCCESS 0 +000 00:08:20 

PART_EXCHANGE_JOB FAILURE 6576 +000 00:00:00

查看調度程序元數據

作業表是一個包含所有作業的容器,每個數據庫有一個作業表。作業表用於存儲所有作業 的信息,例如所有者名稱和日誌記錄級別。可以在*_SCHEDULER_JOBS視圖中查看這 些信息。

作業是數據庫對象,因此可能會累積起來並佔用過多的空間。爲避免發生這種情況,默認 情況下會在作業完成後自動刪除作業對象。該行爲由auto_drop作業屬性控制。 DBA 和授權用戶可以通過多個視圖查看與調度程序、作業、調度和窗口等有關的重要操 作信息。這些視圖包括:

• *_SCHEDULER_PROGRAM_ARGS:顯示爲所有程序定義的所有參數及默認值(如果 存在)

• *_SCHEDULER_JOBS:顯示所有的作業,不管是已啓用還是禁用的作業

• *_SCHEDULER_JOB_RUN_DETAILS顯示所有已完成(失敗或成功)的作業運行。

每個作業實例都有對應的一行。每一行中都包含有關該實例的作業執行情況的信息。

ERROR# 是遇到的第一個錯誤的編號

• *_SCHEDULER_GLOBAL_ATTRIBUTE:顯示調度程序屬性的當前值

• *_SCHEDULER_JOB_ARGS:顯示所有作業的所有已設置的參數值

• *_SCHEDULER_JOB_CLASSES:顯示所有作業類

對於作業鏈:

• *_SCHEDULER_RUNNING_CHAINS:顯示所有活動鏈

• *_SCHEDULER_CHAIN_STEPS:顯示所有鏈的所有步驟

• *_SCHEDULER_CHAINS:顯示所有鏈

• *_SCHEDULER_CHAIN_RULES:顯示所有鏈的所有規則

對於其它高級對象窗口:

• *_SCHEDULER_WINDOWS顯示所有窗口

• *_SCHEDULER_WINDOW_GROUPS顯示所有窗口組

• *_SCHEDULER_WINGROUP_MEMBERS顯示所有窗口組的成員,一行對應一個組成員

• *_SCHEDULER_JOB_LOG顯示作業的所有狀態更改

• *_SCHEDULER_CREDENTIALS顯示數據庫中的身份證明的列表,其中密碼進行了模 糊處理

• *_SCHEDULER_JOB_ROLES按數據庫角色顯示所有作業

輕量作業與常規作業是通過相同的視圖查看的:

• *_SCHEDULER_JOBS:顯示所有作業,包括JOB_STYLE=‘LIGHTWEIGHT’的作業

• *_SCHEDULER_JOB_ARGS:還顯示輕量作業的所有已設置的參數值

• 因爲輕量作業不是數據庫對象,所以無法通過*_OBJECTS視圖查看輕量作業

從Oracle Database 11gR2 開始:

• *_SCHEDULER_NOTIFICATIONS顯示已經設置的電子郵件通知

• *_SCHEDULER_FILE_WATCHERS顯示文件監視器的配置信息

以下視圖顯示與多目標作業有關的信息:

• *_SCHEDULER_DESTS:顯示可在其上調度遠程作業的所有目標。該視圖包含外部

目標(對於遠程外部作業)和數據庫目標(對於遠程數據庫作業)

• *_SCHEDULER_EXTERNAL_DESTS:顯示所有已在數據庫中註冊且可用作遠程外部 作業目標的代理

• *_SCHEDULER_DB_DESTS:顯示您可在其上調度遠程數據庫作業的所有數據庫

• *_SCHEDULER_GROUPS:顯示您的方案中的組或數據庫中的所有組

• *_SCHEDULER_GROUP_MEMBERS:顯示您的方案中的組成員或數據庫中的所有組 成員

• *_SCHEDULER_JOB_DESTS:顯示遠程數據庫中的作業的狀態

注:在上面列出的視圖中,視圖名稱開頭的星號會被替換爲DBA、ALL或USER。

調度程序身份證明是一個對象,用於通過主機操作系統 驗證對文件的訪問權限。

可以指定應在其上執行作業的多個目標,並從創建作 業的數據庫上監視這些作業。

  • 小結

• 使用調度程序來簡化管理任務

• 創建作業、程序和調度

• 監視作業執行

• 使用基於時間或基於事件的調度來執行調度程序作業

• 描述窗口、窗口組、作業類和使用者組的用途

• 使用電子郵件通知

• 使用作業鏈來執行一系列相關任務

• 描述遠程系統上的調度程序作業

• 使用高級調度程序概念來區分作業的優先級

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章