很多情況下,資料庫管理員或使用者需要自動調度和運行很多類型的作業,例如,執行維護工作(如Database Backup);資料載入和驗證常式;
產生報表;收集最佳化程式統計資訊或執行商務程序。可以使用發送器功能指定任務在將來某個時間點運行。作業可以在資料庫中、在駐留資料庫執行個體的機器上甚至在遠程機器上運行。
可以結合使用發送器和Resource Manager(資源管理員)。發送器可以啟用Resource Manager計劃,並按照為各種Resource Manager
使用者組指定的優先順序來運行作業。
發送器是在Oracle 10g版本中引入的,在11g版本中得到了大大增強。較早的資料庫版本通過DBMS_JOB功能提供作業調度功能。為了達 達到向後相容的目的,目前的版本依然支援此功能,但它的功能多樣性遠不及調度程度。
1、發送器體繫結構
資料字典包含一個作為所有發送器作業的儲存點的表。可以通過DBA_SCHEDULER_JOBS視圖查詢此表。作業隊列協調器後台進程CJQ0監視此表,根據需要啟動作業隊列進程Jnnn來運行作業。如果在任何定義的、活動的發送器作業,就自動啟動CJBQ0進程。根據需要啟動Jnnn進程,但是最大數量受JOB_QUEUE_PROCESSES執行個體參數限制,該參數可以是0-1000(預設值)的任何值。如果將值設為0,那麼將不會運行調程。
作業隊列協調器從作業隊列表中選取作業,將它們傳遞給作業隊列進程執行。它還根據需要啟動和終止作業隊列進程。要查看當前正在啟動並執行進程,可查詢V$PROCESS視圖。
select program from v$process where program like '%J%';
定義為過程的作業在資料庫中運行。作業也可以定義為作業系統命令或shell指令碼:這些將作為外部作業系統任務運行。作業的觸發因素 可以是時間或事件。基於時間的作業根據時間表可能運行一次或重複運行。基本事件的作業在特定條件出現時運行。有一些預配置的事件, 也可以使用使用者定義的事件。作業可以串連成鏈,根據作業成功與否對分支使用簡單規則。
調度程度的一項進階功能是將期與Resource Manager相關聯。某些作業可能需要優先運行,為此,可以連結作業與Resource Manager
使用都組,以便達到這個目的。還可以使用發送器啟用Resource Manager計劃,而不需要通過更改ESOURCE_MANAGER_PLAN執行個體參數或使 用DBMS_RESOURCE_MANAGER.SWITCH_PLAN程序呼叫手動啟用計劃。
可以使用一個API-DBMS_SCHEDULER包來配置發送器,通過一組資料字典視圖監視它,或是用Database Control管理它。
2、發送器對象
發送器對象中最基本的對象是作業。作業可以是完全自包含的:它可以定義要執行的動作和執行時間。在更進階的配置中,作業只是由大量各種類型的發送器對象組成的結構的一部分。
2.1 作業
作業(job)指定了要執行的動作以及執行動作的時間。
“ 要執行的動作”可以是匿名的PL/SQL塊(可能由單條SQL語句構成)、PL/SQL預存程序(可調用JAVA預存程序或外部過程)、
或在伺服器的檔案系統中儲存任何可執行檔(既可以是二進位可執行檔,也可以是SHELL指令碼)。特彆強大的功能(超出OCP 課程的範圍)是遠程外部作業,該作業在一台單獨的機器上運行。
“執行動作的時間”指定了啟動作業時的時間戳記以及用於今後啟動並執行重複時間間隔,或是觸發事件。
DBMS_SCHEDULER.CREATE_JOB
2.2 程式
程式(program)在作業與其將要執行的動作之間提供了一個抽象層。程式是使用DBMS_SCHEDULER.CREATE_PROGRAM過程建立的。
通過從工作定義中取出作業內容並在程式中加以定義,就可以在不同的作業中引用相同的程式,從而不必進行多次定義就可以將
它與不同的時間表和作業類關聯在一起。需要記住的是:就是作業而言,只有啟用程式才能使用它。預設是不啟用。
2.3 時間表
時間表(schedule)是指定作業已耗用時間與頻率的規範。時間表的基本原理是從作業中取出執行作業的時間,然後將其與不同的的
作業關聯。是時間表是使用DBMS_SCHEDULER.CREATE_SHEDULE