Oracle使用DBMS_JOB建立的資料庫作業,遇到資料庫關閉狀態的排程

qdrzq發表於2014-06-05

對SQL Server熟悉的朋友,應該都知道,SQL Server的作業是按照固定時刻來設定排程的,比如設定為每日23:00執行,如果此時,恰逢伺服器關機,或者SQLServerAgent服務不在執行,則本次作業將不會執行,直到下次滿足排程條件再執行.
而Oracle的JOB是按照排程公式來設定下次執行時刻的.讓我們來測試一下Oracle的JOB遇到關機或者資料庫關閉的情況吧.

----建立表:
create table bak_testJob(runtime date);
----建立儲存過程:
create or replace procedure bak_testJob_Proc
is
begin
  insert into bak_testJob values(sysdate);
end ;
----呼叫儲存過程測試:
begin
  bak_testJob_Proc;
end ;
----測試成功(select 有結果),清空表:
delete from bak_testJob;
----建立作業(PL/SQL Developer互動介面建立)下面是相關操作對應的"View SQL"的結果:
begin
  sys.dbms_job.submit(job => :job,
                      what => 'bak_testJob_Proc;',
                      next_date => to_date('10-10-2011 19:15:00', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'sysdate+5/1440');
  commit;
end;
/
----建立的JobID是101
----此時:19:09:45
19:10:00 停服務,模擬關機
19:19:35 開服務(僅啟動主服務,監聽服務,Agent服務,此處說明一下,Oracle9i一定要開啟Agent服務,而Oracle10g則可以不啟動OracleJobSchedule服務)
 
select * from bak_testJob;
結果:2011-10-10 19:19:38
看101作業:
Last date:2011-10-10 19:19:35
Next date:2011-10-10 19:24:37
----刪除Job(PL/SQL Developer互動介面進行刪除,語句略)
----刪除procedure和table
drop procedure bak_testJob_Proc
select * from bak_testjob
1 2011-10-10 19:24:39
2 2011-10-10 19:19:38
drop table bak_testJob
 
----結論:Oracle會在資料庫啟動後,馬上將應該排程的Job補充執行,此後按間隔公式定時排程

看來,與SQL Server跳過了本次作業排程不同,Oracle會記得補上.
另外,說明一點,作業是使用的dbms_job來建立的,不是使用Oracle10g新的dbms_schedule來建立的,所以,與OracleJobSchedule$SID服務的狀況是無關的.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29512902/viewspace-1176323/,如需轉載,請註明出處,否則將追究法律責任。

相關文章