oracle排程程式作業dbms_scheduler
整理scheduler
這一部分,源於最近發現系統上自動採集統計資訊的執行時間有些異常,執行時間被定義到了上午 (這並不是一個很合理可靠的時間 ).在重新修改配置的同時,也順便整理了這一塊內容.
首先簡單講一下oracle 10g scheduler
,10g
引入dbms_scheduler
來替代先前的dbms_job
,在功能方面,它比dbms_job
提供了更強大的功能和更靈活的機制/管理.它主要由以下幾大塊構成:
1.作業(job
) :
一個排程程式作業的實體.可以由dbms_scheduler.create_job
建立生成.它可以自行指定作業屬性,也可以呼叫我們預先建立的一系列scheduler/ program/ chain/ job_class/ window/ window_group
來匹配其作業屬性.
2.排程(scheduler
) :
一個任務計劃執行的時間策略.比如我們想要建立一個晚上3點執行的任務計劃,就可以建立一個排程,凡是符合這個排程要求的,都可以呼叫這個我們預先建立好的排程.可以用dbms_scheduler.create_schedule
來建立一個排程.
比如我建立一個名字叫MYTEST_SCHEDULE
的排程,每天4:00
執行.
Begin
dbms_scheduler.create_schedule(
repeat_interval => 'FREQ=DAILY;BYHOUR=4;BYMINUTE=0;BYSECOND=0',
start_date => systimestamp at time zone 'PRC',
comments => '---this is my test schedule---',
schedule_name => 'MYTEST_SCHEDULE');
end;
3.程式(program
):
10g
下的program
支援分為3種形式,PL/SQL BLOCK/STORED PROCEDURE/EXECUTABLE
.可以使用DBMS_SCHEDULER.CREATE_PROGRAM
來建立一個program
.
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name=>'mytest_program_1',
program_action=>'update mytest set id=id+1;',
program_type=>'PLSQL_BLOCK',
number_of_arguments=>0,
comments=>'',
enabled=>TRUE);
END;
4.鏈(chain
):
鏈可以看作是一個/幾個program/event scheduler
的集合,為了維護需要,我們可能需要將很多不同的program
放到一起依次執行,按照以前的模式,要麼將這幾個program
能整合成一個大的整體,要麼分開幾個job
來單獨執行,這無疑加重了維護負擔,而chain
的出現,可以優化這個問題,我們將實現定義好的program
集合到一起,然後統一制定一個job
來執行,可以使用dbms_scheduler.create_chain
來建立一個chain
.
比如,在我的系統中,我分別建立了一個EXECUTABLE
型別的和一個STORED PROCEDURE
型別的program
,我需要他們順次執行,於是我可以這麼做:
BEGIN
dbms_scheduler.create_chain(
chain_name => 'MYTEST_CHAIN');
dbms_scheduler.define_chain_step(
chain_name => 'MYTEST_CHAIN',
step_name => 'mytest_chain_1',
program_name => 'P_1');
dbms_scheduler.alter_chain(
chain_name => 'MYTEST_CHAIN',
step_name => 'mytest_chain_1',
attribute => 'skip',
value => FALSE);
dbms_scheduler.define_chain_step(
chain_name => 'MYTEST_CHAIN',
step_name => 'mytest_chain_2',
program_name => 'P_2');
dbms_scheduler.alter_chain(
chain_name => 'MYTEST_CHAIN',
step_name => 'mytest_chain_2',
attribute => 'skip',
value => FALSE);
dbms_scheduler.enable('MYTEST_CHAIN');
END;
4.作業類(job_class):
定義了執行作業的資源使用者組.通過使用視窗中的資源計劃, 我們可以在不同資源組和不同作業類之間分配資源.可以使用dbms_scheduler.create_job_class
建立一個作業類.
BEGIN
dbms_scheduler.create_job_class(
logging_level => DBMS_SCHEDULER.LOGGING_RUNS,
log_history => 100,
resource_consumer_group => 'AUTO_TASK_CONSUMER_GROUP',
job_class_name => 'MYTEST_JOB_CLASS');
END;
5.視窗(window
):
可以看成是一個更高功能的排程,視窗可以呼叫系統中存在的排程(也可以自行定義執行時間),而且,具有資源計劃限制功能,視窗可以歸屬於某個視窗組.
可以使用DBMS_SCHEDULER.CREATE_WINDOW
來建立一個視窗.
例如我建立了一個名為mytest_windows_1
的視窗,採用DAILY_PURGE_SCHEDULE
的排程方式,資源計劃限制方案為SYSTEM_PLAN
,持續時間為4
小時.
BEGIN
DBMS_SCHEDULER.CREATE_WINDOW(
window_name=>'mytest_windows_1',
resource_plan=>'SYSTEM_PLAN',
schedule_name=>'SYS.DAILY_PURGE_SCHEDULE',
duration=>numtodsinterval(240, 'minute'),
window_priority=>'LOW',
comments=>'');
END;
6.視窗組(window_group
):
一個/幾個視窗的集合.10g
預設的自動採集統計資訊的排程就是一個視窗組的形式,譬如,設定兩個視窗,視窗一指定任務週日—–週五,晚上12點執行,而視窗二設定週六凌晨3點執行,這兩個視窗組成了一個視窗組,形成了這個job
的執行排程策略.
可以使用DBMS_SCHEDULER.CREATE_WINDOW_GROUP
來建立一個視窗組.
BEGIN
DBMS_SCHEDULER.CREATE_WINDOW_GROUP(
group_name=>'mytest_window_group',
window_list=>'MYTEST_WINDOWS_1,WEEKEND_WINDOW');
END;
於是,使用dbms_scheduler
建立一個job
,我們可以呼叫各種預先定義的複雜屬性,也可以簡單的手動約定各個需要的屬性.
簡單的,如
BEGIN
dbms_scheduler.create_job(
job_name => ' MYTEST_JOB_1',
job_type => 'PLSQL_BLOCK',
job_action => 'update mytest set id=id+1;',
repeat_interval => 'FREQ=MINUTELY;INTERVAL=10',
start_date => sysdate,
auto_drop => FALSE,
enabled => TRUE);
END;
跟採用dbms_job
並不太大區別,只是repeat_interval
等語法上有差別.
複雜點的,如:
BEGIN
dbms_scheduler.create_job(
job_name => 'MYTEST_JOB_2',
job_type => 'CHAIN',
job_action => 'MYTEST_CHAIN',
schedule_name => 'SYS.MYTEST_WINDOW_GROUP',
job_class => 'DEFAULT_JOB_CLASS',
auto_drop => FALSE,
enabled => FALSE);
dbms_scheduler.set_attribute( name => 'MYTEST_JOB_2', attribute => 'stop_on_window_close', value => FALSE);
END;
排程程式作業屬性的修改:
大部分的排程作業屬性的修改,都可以通過dbms_scheduler.SET_ATTRIBUTE
和dbms_scheduler.SET_ATTRIBUT_NULL
來完成.在此僅幾個舉例來說明,更多使用方法雷同.
^比如,重新定義scheduler
屬性:
BEGIN
dbms_scheduler.set_attribute( name => 'DAILY_PURGE_SCHEDULE', attribute => 'repeat_interval', value => 'FREQ=DAILY;BYHOUR=1;BYMINUTE=0;BYSECOND=0');
END;
^比如重新修改program
;
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name=>'P_1',
attribute=>'PROGRAM_ACTION',
value=>'/backup/2.sh');
END;
^比如重新定義一個job
屬性
BEGIN
dbms_scheduler.set_attribute_null( name => 'GATHER_STATS_JOB', attribute => 'schedule_name');
dbms_scheduler.set_attribute( name => 'GATHER_STATS_JOB', attribute => 'repeat_interval', value => 'FREQ=DAILY;BYHOUR=2;BYSECOND=0');
END;
等等…….
相關的表/檢視:
SQL> select VIEW_NAME from dba_views a where a.view_name like 'DBA_SCHEDULER%';
VIEW_NAME
------------------------------
DBA_SCHEDULER_PROGRAMS
DBA_SCHEDULER_JOBS
DBA_SCHEDULER_JOB_CLASSES
DBA_SCHEDULER_WINDOWS
DBA_SCHEDULER_PROGRAM_ARGS
DBA_SCHEDULER_JOB_ARGS
DBA_SCHEDULER_JOB_LOG
DBA_SCHEDULER_JOB_RUN_DETAILS
DBA_SCHEDULER_WINDOW_LOG
DBA_SCHEDULER_WINDOW_DETAILS
DBA_SCHEDULER_WINDOW_GROUPS
DBA_SCHEDULER_WINGROUP_MEMBERS
DBA_SCHEDULER_SCHEDULES
DBA_SCHEDULER_RUNNING_JOBS
DBA_SCHEDULER_GLOBAL_ATTRIBUTE
DBA_SCHEDULER_CHAINS
DBA_SCHEDULER_CHAIN_RULES
DBA_SCHEDULER_CHAIN_STEPS
DBA_SCHEDULER_RUNNING_CHAINS
相關文章
- oracle使用DBMS_SCHEDULER排程作業Oracle
- 作業系統精髓設計原理 程式排程作業系統
- Oracle排程作業引起的空間驟增問題處理記錄Oracle
- Apache Oozie 教程:使用 Oozie 排程 Hadoop 作業ApacheHadoop
- 批處理作業排程-分支界限法
- 作業系統之排程演算法作業系統演算法
- ORA-27492 無法執行作業,排程程式不可用
- Oracle定時任務dbms_schedulerOracle
- async-await:協作排程 vs 搶佔排程AI
- 實現Quartz.NET的HTTP作業排程quartzHTTP
- linux程式排程Linux
- 程式排程之最短作業優先
- Elastic-job實戰(分散式作業排程框架)AST分散式框架
- .NET Core Hangfire週期性作業排程問題
- 【作業系統】4.程序排程演算法作業系統演算法
- 作業系統4——處理機排程與死鎖作業系統
- 使用持續整合工具Jenkins進行Kettle作業排程Jenkins
- 分散式後臺作業排程器JobRunr介紹 - JAXenter分散式
- 使用 K8s 進行作業排程實戰分享K8S
- 課程排課系統:智慧排課+線上約課+直播上課+作業打卡!
- Flink排程之排程器、排程策略、排程模式模式
- Volcano:在離線作業混部管理平臺,實現智慧資源管理和作業排程
- 作業系統課程設計——處理機和程式排程演算法及記憶體分配回收機制作業系統演算法記憶體
- 程式排程案例分析與常見疑惑1:為何不能排程?
- 多機器人協作排程問題機器人
- 作業排程中介軟體 Elastic-Job-Cloud 原始碼分析 —— 高可用ASTCloud原始碼
- 嵌入式作業6.3 CAN 匯流排程式設計程式設計
- 作業系統綜合題之“採用實時排程,可排程的限制條件和可排程的最大X值是是多少ms的CPU時間”作業系統
- ASP.NET Core託管執行Quartz.NET作業排程詳解ASP.NETquartz
- TKE 使用者故事 | 作業幫 Kubernetes 原生排程器優化實踐優化
- 系統設計:如何設計一個分散式作業排程器 ?- Rakshesh分散式
- LInux實驗 : 程式排程模擬Linux
- Go 併發程式設計 - runtime 協程排程(三)Go程式設計
- 【作業系統】磁碟的四種基本排程演算法(圖表說明)作業系統演算法
- 使用FUTURE 中的訊息避免計劃排程的批處理作業 - CodeOpinion
- ucore作業系統學習(六) ucore lab6執行緒排程器作業系統執行緒
- oracle定時任務dbms_job與dbms_scheduler使用方法Oracle
- 行業分析| 排程行業未來趨勢行業