引數job queue processes與Oracle jobs
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
Oracle jobs為Oracle開發人員和資料庫管理員提供了資料庫層面維護的極大便利性。對於Oracle jobs在Oracle 9i之前,是由dbms_jobs來實現,而到了10g之後,多出了dbms_scheduler方式。兩者同樣可以新增Oracle job,只不過dbms_scheduler的功能更為強大。在使用Oracle jobs時,我們不得不關注job_queue_processes引數,用於設定job佇列可以啟動的程序數。本文即是圍繞此展開。
1、job_queue_processes引數
alter system set job_queue_processes= 0,,,1000
下面是11g reference的描述:
JOB_QUEUE_PROCESSES specifies the maximum number of job slaves per instance that can be created for the execution of DBMS_JOB jobs and Oracle Scheduler (DBMS_SCHEDULER) jobs. DBMS_JOB and Oracle Scheduler share the same job coordinator and job slaves, and they are both controlled by the JOB_QUEUE_PROCESSES parameter.
If the value of JOB_QUEUE_PROCESSES is set to 0, then DBMS_JOB jobs and Oracle Scheduler jobs will not run on the instance.If JOB_QUEUE_PROCESSES is set to a value in the range of 1 to 1000, then DBMS_JOB jobs and Oracle Scheduler jobs will run. The actual number of job slaves created for Oracle Scheduler jobs is auto-tuned by the Scheduler depending on several factors, including available resources, Resource Manager settings, and currently running jobs. However, the combined total number of job slaves running DBMS_JOB jobs and Oracle Scheduler jobs on an instance can never exceed the value of JOB_QUEUE_PROCESSES for that instance. The number of job slaves running Oracle Scheduler jobs is additionally limited to the value of the MAX_JOB_SLAVE_PROCESSES Scheduler attribute.
Advanced replication uses Oracle Scheduler for data refreshes. Oracle Streams Advanced Queuing uses Oracle Scheduler for message propagation. Materialized views use Oracle Scheduler for automatic refreshes. Setting JOB_QUEUE_PROCESS to 0 will disable these features as well as any other features that use Oracle Scheduler or DBMS_JOB.
a、從上面的描述可知,對於Oracle job程序,包含協調程序(主程序)以及奴隸程序(子程序)。
b、job_queue_processes取值範圍為0到1000,總共可建立多少個job程序由job_queue_processes引數來決定。
c、當job_queue_processes大於1時,且並行執行job時,至少一個為協調程序。其總數不會超出job_queue_processes的值。
d、job_queue_processes引數的值為且DBMS_JOB與DBMS_SCHEDULER共享。
e、job_queue_processes引數,當設定該值為0的時候則任意方式建立的job都不會執行。
f、非零值的job_queue_processes,其job子程序數依賴於可用資源,資源配置方式以及當前執行的job數來自行調整。
g、此外對於Scheduler jobs方式還受限制於scheduler屬性MAX_JOB_SLAVE_PROCESSES的設定。
h、可以通過DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE來設定max_job_slave_processes
2、測試引數job_queue_processes為1的情形
-->演示環境SQL> select * from v$version where rownum<2;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production-->建立測試用表CREATE TABLE tb_job( job_name VARCHAR2 (5), update_dt VARCHAR2 (20));-->新增多個Oracle job來併發執行SQL> ho more add_job.sqlDECLARE job_name VARCHAR2 (20);BEGIN DBMS_OUTPUT.put_line ('Current sysdate is ' || TO_CHAR (SYSDATE, 'yyyymmdd hh24:mi:ss')); FOR i IN 1 .. 5 LOOP job_name := 'JOB_' || TO_CHAR (i); sys.DBMS_SCHEDULER.create_job ( job_name => job_name, start_date => sysdate+1/1440, repeat_interval => 'freq = minutely; interval=1', end_date => NULL, job_class => 'DEFAULT_JOB_CLASS', job_type => 'PLSQL_BLOCK', job_action => ' beginINSERT INTO tb_job SELECT ''' || job_name || ''', TO_CHAR (SYSDATE, ''yyyymmdd hh24:mi:ss'') FROM DUAL;dbms_lock.sleep(60);commit;end;', enabled => true, comments => 'my test job'); END LOOP;END;/SQL> @add_jobPL/SQL procedure successfully completed.-->檢視job_queue_processes引數的值SQL> show parameter jobNAME TYPE VALUE------------------------------------ ----------- ------------------------------job_queue_processes integer 1-->此時和Job相關的程序一個,為ora_j000SQL> ho ps -ef | grep rac11g | grep ora_j | grep -v greporacle 9692 1 4 12:03 ? 00:00:01 ora_j000_rac11g1-->檢視剛剛新增的job-->下面的NEXT_RUN_DATE在秒級別上稍有差異,其實在定義job時,這個是由於前面的for迴圈造成的延遲-->在此忽略這個細微的差異SQL> @jobsOWNER JOB_NAME ENABL JOB_CLASS NEXT_RUN_DATE------------ -------------- ----- ------------------------------ -----------------------------------SCOTT JOB_1 TRUE DEFAULT_JOB_CLASS 19-MAR-13 12.21.33.000000 PM +08:00SCOTT JOB_2 TRUE DEFAULT_JOB_CLASS 19-MAR-13 12.21.33.000000 PM +08:00SCOTT JOB_3 TRUE DEFAULT_JOB_CLASS 19-MAR-13 12.21.33.000000 PM +08:00SCOTT JOB_4 TRUE DEFAULT_JOB_CLASS 19-MAR-13 12.21.34.000000 PM +08:00SCOTT JOB_5 TRUE DEFAULT_JOB_CLASS 19-MAR-13 12.21.34.000000 PM +08:00-->job執行的情況,可以看到5個job被逐一執行-->儘管我們定義時的NEXT_RUN_DATE相差1秒,而此時job的執行後則每一個相差1分鐘-->job_1與job_5相差4分多鐘,這是由於我們定義了dbms_lock.sleep(60)為1分鐘-->其次可以看出由於只有一個job程序,因此每一個job是一個一個被執行SQL> select * from tb_job;JOB_N UPDATE_DT----- --------------------JOB_1 20130319 12:21:33JOB_2 20130319 12:22:35JOB_3 20130319 12:23:37JOB_4 20130319 12:24:39JOB_5 20130319 12:25:41
3、測試引數job_queue_processes大於1的情形
-->首先移除之前的jobSQL> ho more remove_job.sqlDECLARE job_name VARCHAR2 (10);BEGIN FOR i IN 1 .. 5 LOOP job_name := 'JOB_' || TO_CHAR (i); sys.DBMS_SCHEDULER.drop_job (job_name, force => TRUE); END LOOP;END;/SQL> @remove_jobPL/SQL procedure successfully completed.-->此時設定job_queue_processes的值為6SQL> alter system set job_queue_processes=6;System altered.-->清空測試用表SQL> truncate table tb_job;Table truncated.-->此時Oracle為job啟動了2個程序SQL> ho ps -ef | grep rac11g | grep ora_j | grep -v greporacle 3477 1 9 12:29 ? 00:00:01 ora_j000_rac11g1oracle 3491 1 4 12:29 ? 00:00:00 ora_j001_rac11g1-->新增多個jobSQL> @add_jobPL/SQL procedure successfully completed.--> Author : Robinson--> Blog : http://blog.csdn.net/robinson_0612SQL> @jobsOWNER JOB_NAME ENABL JOB_CLASS NEXT_RUN_DATE-------------------- ----------- ----- --------------------- -----------------------------------SCOTT JOB_1 TRUE DEFAULT_JOB_CLASS 19-MAR-13 12.31.55.000000 PM +08:00SCOTT JOB_2 TRUE DEFAULT_JOB_CLASS 19-MAR-13 12.31.56.000000 PM +08:00SCOTT JOB_3 TRUE DEFAULT_JOB_CLASS 19-MAR-13 12.31.56.000000 PM +08:00SCOTT JOB_4 TRUE DEFAULT_JOB_CLASS 19-MAR-13 12.31.56.000000 PM +08:00SCOTT JOB_5 TRUE DEFAULT_JOB_CLASS 19-MAR-13 12.31.56.000000 PM +08:00-->片刻後可以看到job程序總數達到6個SQL> ho ps -ef | grep rac11g | grep ora_j | grep -v greporacle 7668 1 1 11:57 ? 00:00:01 ora_j000_rac11g1oracle 7678 1 0 11:57 ? 00:00:01 ora_j001_rac11g1oracle 7700 1 1 11:57 ? 00:00:01 ora_j002_rac11g1oracle 9230 1 0 11:57 ? 00:00:00 ora_j003_rac11g1oracle 9257 1 2 11:58 ? 00:00:01 ora_j005_rac11g1oracle 9353 1 7 11:59 ? 00:00:00 ora_j004_rac11g1 -->查看錶tb_job的情形 SQL> select * from tb_job order by 1,2;JOB_N UPDATE_DT----- --------------------JOB_1 20130319 12:31:57JOB_1 20130319 12:32:58JOB_1 20130319 12:33:59JOB_2 20130319 12:31:58JOB_2 20130319 12:32:59JOB_2 20130319 12:34:00JOB_3 20130319 12:31:58JOB_3 20130319 12:32:59JOB_3 20130319 12:34:00JOB_4 20130319 12:31:59JOB_4 20130319 12:33:00JOB_4 20130319 12:34:01JOB_5 20130319 12:31:58JOB_5 20130319 12:32:59JOB_5 20130319 12:34:00-->從上面的查詢結果可知每一個job的上一次與下一次執行間隔基本保持在1分鐘-->不同job之間的每一次執行時間基本上是相同的,這與job_queue_processes為1時完全不一樣-->也就是說即使是job_5,基本上與job_1是同時執行,而不是像前面測試那樣前面所有的執行完後才被執行-->移除jobSQL> @remove_jobPL/SQL procedure successfully completed.-->移除測試表SQL> drop table tb_job purge;Table dropped.
4、小結
a、job_queue_processes引數決定了job作業能夠使用的總程序數。
b、當該引數為0值,任何job都不會被執行,建議合理設定該值且至少大於1。
c、對於job執行時間也應該儘量合理的設定間隔以及啟動時間。
d、如果同一時間內執行的Job數很多,過小的引數值導致job不得不進行等待。而過大的引數值則消耗更多的系統資源。
f、對於存在依賴關係的job,儘可能將其進行合併到一個job中,如使用chain等。
更多參考:
有關Oracle RAC請參考
使用crs_setperm修改RAC資源的所有者及許可權
使用crs_profile管理RAC資源配置檔案
RAC 資料庫的啟動與關閉
再說 Oracle RAC services
Services in Oracle Database 10g
Migrate datbase from single instance to Oracle RAC
Oracle RAC 連線到指定例項
Oracle RAC 負載均衡測試(結合伺服器端與客戶端)
Oracle RAC 伺服器端連線負載均衡(Load Balance)
Oracle RAC 客戶端連線負載均衡(Load Balance)
ORACLE RAC 下非預設埠監聽配置(listener.ora tnsnames.ora)
ORACLE RAC 監聽配置 (listener.ora tnsnames.ora)
配置 RAC 負載均衡與故障轉移
CRS-1006 , CRS-0215 故障一例
基於Linux (RHEL 5.5) 安裝Oracle 10g RAC
使用 runcluvfy 校驗Oracle RAC安裝環境
有關Oracle 網路配置相關基礎以及概念性的問題請參考:
配置非預設埠的動態服務註冊
配置sqlnet.ora限制IP訪問Oracle
Oracle 監聽器日誌配置與管理
設定 Oracle 監聽器密碼(LISTENER)
配置ORACLE 客戶端連線到資料庫
有關基於使用者管理的備份和備份恢復的概念請參考
Oracle 冷備份
Oracle 熱備份
Oracle 備份恢復概念
Oracle 例項恢復
Oracle 基於使用者管理恢復的處理
SYSTEM 表空間管理及備份恢復
SYSAUX表空間管理及恢復
Oracle 基於備份控制檔案的恢復(unsing backup controlfile)
有關RMAN的備份恢復與管理請參考
RMAN 概述及其體系結構
RMAN 配置、監控與管理
RMAN 備份詳解
RMAN 還原與恢復
RMAN catalog 的建立和使用
基於catalog 建立RMAN儲存指令碼
基於catalog 的RMAN 備份與恢復
RMAN 備份路徑困惑
使用RMAN實現異機備份恢復(WIN平臺)
使用RMAN遷移檔案系統資料庫到ASM
linux 下RMAN備份shell指令碼
使用RMAN遷移資料庫到異機
有關ORACLE體系結構請參考
Oracle 表空間與資料檔案
Oracle 密碼檔案
Oracle 引數檔案
Oracle 聯機重做日誌檔案(ONLINE LOG FILE)
Oracle 控制檔案(CONTROLFILE)
Oracle 歸檔日誌
Oracle 回滾(ROLLBACK)和撤銷(UNDO)
Oracle 資料庫例項啟動關閉過程
Oracle 10g SGA 的自動化管理
Oracle 例項和Oracle資料庫(Oracle體系結構)