Oracle中通過命令行實現定時操作詳解Oracle中通過命令行實現定時操作詳解Oracle基礎
眾所周知一般操作系統會提供定時執行任務的方法例如Unix平台上提供了讓系統定時執行任務的命令Crontab但是對於某些需求例如一些對數據庫表的操作最為典型的是證券交易所每日收盤後的結算它涉及大量的數據庫表操作如果仍然利用操作系統去定時執行不僅需要大量的編程工作而且還會出現用戶不一致等運行錯誤甚至導致程序無法執行
一分析問題
事實上對於以上需求我們可以利用數據庫本身擁有的功能Job Queue(任務隊列管理器)去實現任務隊列管理器允許用戶提前調度和安排某一任務使其能在指定的時間點或時間段內自動執行一次或多次由於任務在數據庫中被執行所以執行效率很高
任務隊列管理器允許我們定制任務的執行時間並提供了靈活的處理方式還可以通過配置安排任務在系統用戶訪問量少的時段內執行極大地提高了工作效率例如對於數據庫日常的備份更新刪除和復制等耗時長重復性強的工作我們就可以利用任務隊列管理器去自動執行以減少工作量
目前擁有此項功能的數據庫有許多最有代表性的是SQL Server Oracle 等但是要讓任務隊列管理器工作還需要我們加以配置才能實現SQL Server的功能配置是在一個圖形化界面(GUI)中實現的非常簡單利用OEM客戶端管理工具Oracle的配置也可以在一個圖形界面中完成然而大多數的用戶更習慣於命令行的方式去操縱數據庫本文介紹如何通過命令行實現這種配置
二實現步驟
.確保Oracle的工作模式允許啟動任務隊列管理器
Oracle定時執行Job Queue的後台程序是SNP進程而要啟動SNP進程首先要確保整個系統的模式是可以啟動SNP進程的這需要以DBA的身份去執行如下命令
svrmgrl> alter system enable restricted session;
或sql> alter system disenable restricted session;
利用如上命令更改系統的會話方式為disenable restricted為SNP的啟動創造條件
.確保Oracle的系統已經配置了任務隊列管理器的啟動參數
SNP的啟動參數位於Oracle的初始化文件中該文件放在$ORACLE_HOME/dbs路徑下如果Oracle的SID是myora的話則初始化文件就是initmyoraora在文件中對SNP啟動參數的描述部分如下
job_queue_process=n
job_queue_interval=N
第一行定義SNP進程的啟動個數為n系統缺省值為正常定義范圍為~根據任務的多少可以配置不同的數值
第二行定義系統每隔N秒喚醒該進程一次系統缺省值為秒正常范圍為~秒事實上該進程執行完當前任務後就進入睡眠狀態睡眠一段時間後由系統的總控負責將其喚醒
如果該文件中沒有上面兩行請按照如上配置添加配置完成後需要重新啟動數據庫使其生效注意如果任務要求執行的間隔很短的話N的配置也要相應地小一點
.將任務加入到數據庫的任務隊列中
調用Oracle的dbms_job包中的存儲過程將任務加入到任務隊列中
dbms_jobsubmit( job out binary_integer
what in archar
next_date in date
interval in varchar
no_parse in boolean)
其中
●job輸出變量是此任務在任務隊列中的編號
●what執行的任務的名稱及其輸入參數
●next_date任務執行的時間
●interval任務執行的時間間隔
下面詳細討論一下dbms_jobsubmit中的參數interval嚴格地講interval是指上一次執行結束到下一次開始執行的時間間隔當interval設置為null時該job執行結束後就被從隊列中刪除假如我們需要該job周期性地執行則要用sysdate+m表示
將任務加入到任務隊列之前要確定執行任務的數據庫用戶若用戶是scott 則需要確保該用戶擁有執行包dbms_job的權限若沒有需要以DBA的身份將權利授予scott用戶
svrmgrl> grant execute on dbms_job to scott;
.將要執行的任務寫成存儲過程或其他的數據庫可執行的pl/sql程序段
例如我們已經建立了一個存儲過程其名稱為my_job在sql/plus中以scott用戶身份登錄執行如下命令
sql> variable n number;
sql> begin
dbms_jobsubmit(:nmy_job;sysdate
sysdate+/);
commit;
end;
/
系統提示執行成功
Sql> print :n;
系統打印此任務的編號例如結果為
如上我們創建了一個每隔分鐘執行一次的任務號為的任務可以通過Oracle提供的數據字典user_jobs察看該任務的執行情況
sql> select jobnext_datenext_secfailuresbroken from user_jobs;
執行結果如下
job next_date next_sec failures broken
// :: N
這表示任務號為的任務下一次將在// ::執行此任務的執行失敗記錄為次注意當執行job出現錯誤時Oracle將其記錄在日志裡失敗次數每次自動加當執行失敗次數達到時Oracle就將該job標志為broken此後Oracle不再繼續執行它直到用戶調用過程dbms_jobbroken重新設置為not broken或強制調用dbms_jobrun來重新執行它
除了以上我們討論的submit存儲過程之外Oracle還提供了其他許多存儲過程來操作任務例如dbms_jobchange dbms_jobwhatdbms_jobinterval可以用來修改提交的任務要想刪除該任務只需運行dbms_jobremove(n)即可其中n為任務號
From:http://tw.wingwit.com/Article/program/Oracle/201311/17096.html