企業名稱:重慶科祿德科技有限公司
聯系人:冷老師
手機:17754917523
郵箱:93865813@qq.com
網址:www.healthcareerhelp.com
地址:重慶石橋鋪高創錦業
Oracle DB 使用調度程序來簡化管理任務
核心組件和主要步驟
一個作業包含兩個必需組件:需要執行的操作,操作的發生時間或調度?!安僮鳌笔怯擅顓^域和作業屬性中的job_type和job_action參數表示的?!皶r間”是在調度中表示的,調度可以基于時間或事件,或者從屬于其它作業的結果。
調度程序使用以下基本組件:
“作業”指定要執行的操作。它可以是PL/SQL 過程、純二進制可執行文件、Java 應用程序或Shell 腳本??梢詫⒊绦颍▋热荩┖驼{度(時間)指定為作業定義的一部分,
也可以改用現有的程序或調度??梢允褂米鳂I的參數來定制其運行時行為。
“調度”指定作業的執行時間和次數。調度可以基于時間或事件??梢詾樽鳂I定義調度,方法是使用一系列日期、一個事件,或兩者相結合,以及表示重復間隔的附加說
明??梢詥为毚鎯ψ鳂I的調度,然后對多個作業使用同一個調度。
“程序”是有關特定可執行文件、腳本或過程的元數據集合。自動作業將執行某個任務。使用程序,無需修改作業本身即可修改作業任務或者“內容”??梢远x程序的參數,使用戶可以修改任務的運行時行為。
基本工作流
使用調度程序來簡化管理任務:
1. 創建程序(啟用或禁用)-可選
– 在多個作業中重用此操作
– 在無需重新創建PL/SQL 塊的情況下更改作業的調度
2. 創建并使用調度
3. 創建并提交作業
可以在Oracle EnterpriseManager 的圖形環境中執行所有步驟,或者通過命令行使用DBMS_SCHEDULERPL/SQL 程序包執行所有步驟。
1. 創建程序
使用CREATE_PROGRAM過程來創建程序。使用調度程序時,創建程序是一個可選部分。還可以對操作進行編碼,使其在CREATE_JOB過程的匿名PL/SQL 塊中執行。通過單獨創建程序,可以定義一次操作,然后在多個作業中重用此操作。使用這種方法,無須重新創建PL/SQL 塊即可更改作業的調度。
默認情況下,程序是以禁用狀態創建的(除非enabled參數設為TRUE)。在將禁用的程序啟用之前,作業無法執行此程序??梢酝ㄟ^將enabled的值指定為TRUE來指定應以啟用狀態創建程序。
2. 創建并使用調度
作業的調度可以是預定義的調度(用CREATE_SCHEDULE過程創建的),也可以是在創建作業時定義的。
調度指定有關作業運行時間的屬性,例如:
起始時間,定義作業從哪一時間開始執行;結束時間,指定作業在哪一時間之后失效且不再進行調度
指定作業重復間隔的表達式
通過組合現有調度創建的復雜調度
啟動作業之前必須滿足的條件或狀態變化(稱為事件)
通過使用調度(而不是在作業定義中指定作業的執行次數),可以管理多個作業的預定執行,而無須更新多個作業定義。如果修改了某個調度,則使用該調度的每個作業都將自動使用新調度。
3. 創建并運行作業
作業是一個組合,其中包括調度、要執行的操作的說明以及作業需要的所有附加參數??梢詾樽鳂I設置許多屬性。屬性將控制作業的執行方式。
作業操作在程序中(而不是直接在作業中)時,無需重新創建PL/SQL 塊即可更改作業調度。
每個作業必須有一個調度。調度可以是預定義的,也可以在創建作業的過程中定義。
持久輕量作業
持久輕量作業:
減少啟動作業所需的開銷和時間
作業元數據和運行時數據在磁盤上占用很小的空間
是使用作業模板(在命令行中)創建的
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'my_lightweight_job2',
program_name => 'MY_PROG',
schedule_name => 'MY_SCHED',
job_style => 'LIGHTWEIGHT');
END;
/
選擇合適的作業類型:
–使用常規作業可提供Z大靈活性。
–需要在很短的時間內創建大量作業時,請使用持久輕量作業。
輕量作業:
適合需要在一秒內創建數百個作業的客戶。對于常規作業,每個作業都要創建一個數據庫對象,用于描述作業、修改多個表以及在進程中創建重做。此種類型作業需求的相關開銷是很大的。在Oracle DB 調度程序中,有一種“持久輕量作業”。輕量作業的目的是減少啟動作業所需的開銷和時間。將為作業創建極少的元數據。這可以減少啟動作業時所需的時間和創建的重做。
作業元數據和運行時數據在磁盤上占用很小的空間。在磁盤上占用的空間小還可實現在RAC 環境中進行負載平衡。
始終是使用作業模板創建的。作業模板必須是一個存儲過程或一個程序。存儲過程可以保存作業所需的所有信息,包括權限。只可以指定少量作業屬性:作業參數和調度。
必須在命令行中創建。JOB_STYLE參數在EM 中不可用。
在示例中,MY_PROG是作業模板,調度是通過已命名的調度應用的。
使用基于時間的或基于事件的調度
要為作業指定基于時間的調度,可以指定日歷表達式或日期時間表達式。使用日歷表達式時,將使用作業的重復間隔和起始日期來計算作業的下一啟動時間。使用日期時間表達式時,指定的表達式確定作業下次應運行的時間。如果沒有指定重復間隔,作業將只在指定的起始日期運行一次。
如果作業使用基于事件的調度,作業將在事件發生時運行。在較高層次上,可以將事件視為狀態的更改。布爾條件的狀態從FALSE更改為TRUE,或者從TRUE更改為FALSE時,將發生事件。
調度程序使用Oracle StreamsAdvanced 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 incrementalbackups');
END;
/
創建基于時間的作業
可以使用DBMS_SCHEDULER程序包的CREATE_JOB過程來創建作業。默認情況下將以禁用狀態創建作業,僅當顯式啟用時,這些作業才生效并可以調度。所有作業名稱都采用以下形式:[schema.]name。
應該使用SYSTIMESTAMP并指定時區,這樣當時間因夏時制更改時,作業能夠自動調整其執行時間。
默認情況下,將在當前方案中創建作業??梢酝ㄟ^指定方案的名稱在另一個方案中創建作業,如示例所示。作業所有者是在其方案中創建作業的用戶,而作業創建者是創建作業的用戶。作業將按作業所有者的權限來執行。作業運行時的國家語言支持(NLS) 環境與創建作業時的環境相同。job_type參數指示作業將要執行的任務的類型??赡艿闹蛋ǎ?/p>
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 創建基于事件的調度