一、作業的概念
作業是一組PL/SQL代碼,用於完成特定的功能。它由作業調度囂調度執行,可以將它比較我們日常工作中的工作安排,它在將來的某個時間點自動執行,或在每間隔一段時間後自動重復執行。
二、job,job queue,Jnnn,
coordinator job queue(CJQ0)
,DBMS_JOB
job queue
翻譯成中文叫做作業隊列。作業是一組代碼PL/SQL代碼用於完成特定的功能。作業隊列,是在oracle服務囂中用於存儲作業的一種機制或者說邏輯構件。Jnnn指的是執行特定作業的作業進程,nnn指的是作業進程號。CJQ0是作業進程調度囂,它本身也是作業進程,它的作用是用於調度作業進程Jnnn。
DBMS_JOB
是一個包,該包內的procedures用於對作業進行管理,包括:向作業隊列中添加作業,從作業隊列中刪除作業,立即執行作業隊列中的作業,修改作業隊列中作業的描述,修改作業隊列中作業的時間調度等等。
三、調度原理
用戶通過調用DBMS_JOB包中的procedures向作業隊列中增加隊列,並設定作業的調度執行時間或周期。
CJQ0
進程始終監視檢查作業隊列中是否有作業到了調度時間點,若發現,則指派個一個作業執行進程Jnnn來執行該作業。
四、啟動數據庫的作業調度功能
通作設定初始化參數
JOB_QUEUE_PROCESSES
來啟動作業調度功能。
如果將
JOB_QUEUE_PROCESSES
設為0,則關閉作業調度功能,這樣的話,作業隊列中的作業將不會自動執行。當
JOB_QUEUE_PROCESSES
的值大於0時,啟動作業調度功能。
JOB_QUEUE_PROCESSES
指的是作業進程的個數量,如:
JOB_QUEUE_PROCESSES
= 30
表示啟動30個作業進程。
JOB_QUEUE_PROCESSES
是一個動態參數,可以通過alter system命令在運行時修改。如:
alter system set
JOB_QUEUE_PROCESSES = 20
若新的值小於原值,而且空間作業進程數小於兩者之差,則空間作業進程會被終止,但不會立即終止執行中的作業進程,而是會等到執行完畢後再將其終止。
五、管理作業隊列
1.
以下是DBMS_JOB包內的過程說明(注:DBMS_JOB包的詳細說明,請參考oracle官方文檔<<Supplied PLSQL Packages and Types Reference>>):
procedure
說明
----------------------------------
SUBMIT
用於向作業隊列中添加作業
REMOVE
用於將作業從作業隊列中移除
CHANGE
用於修改隊列中指定作業的描述以及調度時間或周期
WHAT
用於設置隊列中指定作業的作業代碼
NEXT_DATE
修改隊列中指定作業的下次執行時間
INTERVAL
修改隊列中指定作業的執行周期間隔
BROKEN
設置隊列中指定作業是否為"BROKEN",若作業在"BROKEN"狀態,則它將不被執行
RUN
立即執行隊列中的指定作業
----------------------------------
2.
舉例
向作業隊列中提交作業
VARIABLE jobno NUMBER
BEGIN
DBMS_JOB.SUBMIT(:jobno,
'DBMS_DDL.ANALYZE_OBJECT(''TABLE'',
''HR'', ''EMPLOYEES'',
''ESTIMATE'', NULL, 50);',
SYSDATE, 'SYSDATE + 1');
COMMIT;
END;
/
PRINT jobno
JOBNO
----------
14144
上述代碼向作業隊列中提交一個作業,其作業代碼是
DBMS_DDL.ANALYZE_OBJECT(''TABLE'',
''HR'', ''EMPLOYEES'',
''ESTIMATE'', NULL, 50);
執行時間是sysdate,執行周期是每一天執行一次。
立即執行一個作業
EXECUTE DBMS_JOB.RUN(14144);
修改一個作業(
將14144號作業改成每三天執行一次)
EXECUTE DBMS_JOB.CHANGE(14144, null, null, ’sysdate+3’);
六、查看作業隊列的信息
可以通過以下幾個視圖來查看當前的作業隊列信息:
DBA_JOBS
ALL_JOBS
USER_JOBS
DBA_JOBS_RUNNING
視圖的詳細信息請參考<<Oracle9i Database Reference>>.