官术网_书友最值得收藏!

計(jì)劃作業(yè)監(jiān)控Oracle數(shù)據(jù)庫(kù)

威海職業(yè)學(xué)院 趙永華

UNIX/Windows等操作系統(tǒng)中都提供了“計(jì)劃任務(wù)”,它主要用于夜間備份文件等工作場(chǎng)合。在Oracle等數(shù)據(jù)庫(kù)中的“計(jì)劃作業(yè)”(DB Job)的作用與其異曲同工。

也許有人會(huì)問,為什么不直接利用操作系統(tǒng)的計(jì)劃任務(wù)去執(zhí)行數(shù)據(jù)庫(kù)的計(jì)劃任務(wù)呢?您只要從事過相關(guān)的實(shí)際工作就會(huì)明白,操作系統(tǒng)的計(jì)劃任務(wù)往往難以勝任數(shù)據(jù)庫(kù)的計(jì)劃任務(wù),比如在啟動(dòng)作業(yè)之際,操作系統(tǒng)往往無法驗(yàn)證此時(shí)數(shù)據(jù)庫(kù)是否處于運(yùn)行狀態(tài)。再者,假如此時(shí)發(fā)生了意外事件,該如何阻止運(yùn)行中的作業(yè)也頗為棘手。

Oracle計(jì)劃作業(yè)

Oracle10g版中提供了一種針對(duì)存儲(chǔ)過程(即Jobs)的運(yùn)行機(jī)制,就是在特定時(shí)間段內(nèi)處理后臺(tái)進(jìn)程。

Oracle數(shù)據(jù)庫(kù)自身就能夠請(qǐng)求計(jì)劃過程,在該時(shí)段內(nèi)若數(shù)據(jù)庫(kù)發(fā)生意外故障也不要緊,只要數(shù)據(jù)庫(kù)啟動(dòng)后,該過程也會(huì)隨之運(yùn)作,此時(shí)并不要求提供Password。

當(dāng)然,該過程要求用戶具有相應(yīng)權(quán)限。假如您不想讓它運(yùn)行,只要將作業(yè)狀態(tài)設(shè)為“Broken”即可。

這里牽涉到Oracle作業(yè)隊(duì)列在預(yù)定時(shí)間里按計(jì)劃執(zhí)行PL/SQL例程,以及周期性執(zhí)行作業(yè)的內(nèi)容。

我們從多個(gè)數(shù)據(jù)目錄都可以看到Oracle Job Queue的相關(guān)信息,包括dba_jobs、user_jobs、dba_jobs_running。Oracle內(nèi)置包dbms_job便可用于計(jì)劃性作業(yè),當(dāng)Oracle數(shù)據(jù)庫(kù)安裝時(shí)所產(chǎn)生的這種API對(duì)所有Oracle用戶都具有公開的調(diào)用許可。

在執(zhí)行計(jì)劃作業(yè)之前,需要確認(rèn)相關(guān)數(shù)據(jù)庫(kù)處理作業(yè)的設(shè)置工作已經(jīng)完成,其中的一個(gè)重要標(biāo)志是,作業(yè)隊(duì)列已經(jīng)具有指定的后臺(tái)處理(可以啟動(dòng)處理作業(yè)),它需要對(duì)數(shù)據(jù)庫(kù)文件init.ora中的初始化參數(shù)job_queue_processes進(jìn)行設(shè)置。

假如作業(yè)未能按計(jì)劃正常運(yùn)行,我們要做的第一件事情就是檢查作業(yè)隊(duì)列號(hào),即檢查初始化參數(shù)job_queue_processes。

下列SQL語(yǔ)句可顯示job_queue_processes的初值:

      SQL>show parameter job_queue_processes
      Name Type Value
      job_queue_processes integer 100

在實(shí)際應(yīng)用中,該參數(shù)值應(yīng)當(dāng)比期望運(yùn)行的并行作業(yè)的數(shù)更大些,可以設(shè)置的最大值是1000。

Oracle運(yùn)行項(xiàng)目實(shí)例

某電信系統(tǒng)工作日訪問服務(wù)往往達(dá)每秒數(shù)千個(gè)之多,此時(shí)運(yùn)營(yíng)商需要對(duì)數(shù)據(jù)庫(kù)性能進(jìn)行監(jiān)控,對(duì)一些關(guān)鍵設(shè)置參數(shù)的改變能夠及時(shí)覺察。我們不妨將其所處理業(yè)務(wù)的關(guān)鍵參數(shù)整理成一個(gè)具體數(shù)據(jù)庫(kù)表(如表1)。

表1 關(guān)鍵參數(shù)

這里,訪問網(wǎng)關(guān)需要對(duì)服務(wù)運(yùn)行中的每次請(qǐng)求計(jì)算開始時(shí)間Start_Time與結(jié)束時(shí)間End_Time。假定我們將一分鐘內(nèi)累積的數(shù)據(jù)匯總放入另一個(gè)表(如表2),該表將用于與關(guān)鍵設(shè)置值進(jìn)行比較,一旦出現(xiàn)非正常值就發(fā)出警報(bào)。

表2 一分鐘內(nèi)積累的數(shù)據(jù)匯總

這里的任務(wù)發(fā)生在數(shù)據(jù)庫(kù)內(nèi)部,它獨(dú)立于其他在線系統(tǒng)。而且,這項(xiàng)任務(wù)可以作為一種計(jì)劃型的數(shù)據(jù)庫(kù)作業(yè),它有自己的控制表用于收集故障信息再提供給由Oracle所管轄的獨(dú)立的計(jì)劃類表,這個(gè)控制表含有的數(shù)據(jù)窗體獨(dú)立于運(yùn)行窗體。

這里的DB作業(yè)如同一個(gè)批處理程序,不斷采集數(shù)據(jù),以離線方式進(jìn)行分析,它并不會(huì)影響在線系統(tǒng)如網(wǎng)關(guān)訪問。

在實(shí)際項(xiàng)目中,DB Job采用了一個(gè)控制表去保持時(shí)間軌跡。該表名為Control_ TB(如表3),時(shí)間軌跡由其中的列Prev_Timestamp記錄。

表3 Control_TB

數(shù)據(jù)庫(kù)Job會(huì)從表3 取得Prev_Timestamp,結(jié)束時(shí)間End_Time為Prev_Timestamp+ Data_Collection_Interval(如表4)。而當(dāng)作業(yè)執(zhí)行成功后,它就會(huì)用End_Time更新Prev_Timestamp,DB Job會(huì)通過以下算式計(jì)算將要處理的數(shù)據(jù)塊所需時(shí)間:

表4 PM_Delta_Config

      No_of_chunks=REPEAT_
      INTERVAL/DATA_CO LLECTION_INTERVA

這樣,當(dāng)數(shù)據(jù)庫(kù)作業(yè)每次被喚醒時(shí),就需要n分鐘處理數(shù)據(jù),此處的n分鐘將會(huì)設(shè)置為PM_Delta_Config(如表4)中的“data_collection_interval”。

凡此種種,在實(shí)際中是通過一個(gè)PL/SQL例程實(shí)現(xiàn)的,它的功能是從表1中匯總數(shù)據(jù),而將處理結(jié)果放置到表2中。由于篇幅所限,代碼從略。

主站蜘蛛池模板: 望城县| 卓资县| 炎陵县| 白河县| 响水县| 繁昌县| 馆陶县| 武乡县| 博客| 肃南| 琼海市| 得荣县| 金门县| 尼木县| 广州市| 夏津县| 盐山县| 思茅市| 遂昌县| 玉溪市| 长宁县| 东乡县| 盈江县| 鄂伦春自治旗| 岳西县| 临安市| 遵化市| 太湖县| 松潘县| 扎兰屯市| 措勤县| 德化县| 福安市| 新沂市| 泸州市| 阿尔山市| 宁德市| 昭通市| 涞源县| 延寿县| 淮北市|