Oracle 定時任務講解


前幾天,公司的job調度出現了問題,由於權限管的嚴,沒有查看oracle 一些重要的數據字典,后面聯系DBA,是由於數據庫切換到備機時,參數設置不對,導致db job沒有正常調度。

今天剛好有時間,想總結下 oracle 的定時任務,寫的不好的地方,請多多指教!

 

--1.先檢查 oracle job 兩個重要參數 job_queue_processes 和 aq_tm_processes

SQL> show parameter job_queue_processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 0

SQL> show parameter aq_tm_processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes integer 0

 

--2.新建一個序列,作為數據來源

-- Create sequence
create sequence s_seq
minvalue 0
maxvalue 10000
start with 1
increment by 1
order;

--3.新建一張測試表

--create table

create table t_job(
id number,
record_time date
);

--4.創建一個存儲過程;

create or replace procedure proc_test_job as
begin
insert into t_job
(id,record_time)
select s_seq.nextval,sysdate from dual;
commit;
end proc_test_job;
/

--5.創建一個定時任務

declare
job_number number;
cursor job_cursor is select * from user_jobs where what like '%proc_test_job%';
begin
for x in job_cursor loop
job_number:=x.job;
sys.dbms_job.remove(job_number);
end loop;
commit;
-- Call the procedure
sys.dbms_job.submit(job => job_number,   --out參數,job編號
what => 'proc_test_job;', --注意有分號
next_date => sysdate + 5/(24*60), --下一個 5分鍾執行
interval => 'trunc(sysdate,''mi'')+1/(24*60)' --每隔一分鍾執行
);
commit;
end;
/

--6.查看job的信息

select t.JOB, t.NEXT_DATE, t.WHAT, t.INTERVAL, t.*
from user_jobs t
where t.WHAT like '%proc_test_job%';

 

--7.設置 第 1步中的兩個參數

SQL> alter system set job_queue_processes = 10 scope = both;
System altered

SQL> alter system set aq_tm_processes = 1 scope = both;
System altered

--8.查看job的信息以及目標表的數據,從以下查看,確實是每隔1分中執行一次

 

這樣就完成了一個 定時任務的配置了。

關於 job_queue_processes 詳細介紹,可以參考  http://blog.sina.com.cn/s/blog_62defbef0101opv0.html 。

 aq_tm_processes 參數的講解,可以參考 http://blog.sina.com.cn/s/blog_61cd89f60102e9lc.html,在此謝謝這兩位作者。

 

在實際工作,由於業務的需要,比如公司經常做活動,那可能會經常調整db job 調度時間。下面講解一些在工作當中操作job的sp

1.要修改 job 的下次啟動時間;

begin
-- Call the procedure
sys.dbms_job.next_date(job => :job,    --job 是入參,對應的是 user_jobs 中的 job字段信息
next_date => :next_date);                     --job 下次啟動時間
end;

2.要停止調度 job;

begin
-- Call the procedure
sys.dbms_job.broken(job => :job,
broken => broken,
next_date => :next_date);        -- next_date(指定某一時刻停止) sysdate(立刻停止)
end;

3.刪除job

begin
-- Call the procedure
sys.dbms_job.remove(job => :job);
end;

4.啟動job

begin
-- Call the procedure
sys.dbms_job.run(job => :job, force => force);
end;

5.修改要執行的job

begin
-- Call the procedure
sys.dbms_job.what(job => :job,
what => :what);
end;

--6.修改job的執行間隔

begin
-- Call the procedure
sys.dbms_job.interval(job => :job,
interval => :interval);
end;

--一些常用的時間設置

1:每分鍾執行
Interval => TRUNC(sysdate,'mi') + 1/ (24*60) --每分鍾執行
interval => 'sysdate+1/(24*60)' --每分鍾執行
interval => 'sysdate+1' --每天
interval => 'sysdate+1/24' --每小時
interval => 'sysdate+2/24*60' --每2分鍾
interval => 'sysdate+30/24*60*60' --每30秒
2:每天定時執行
Interval => TRUNC(sysdate+1) --每天凌晨0點執行
Interval => TRUNC(sysdate+1)+1/24 --每天凌晨1點執行
Interval => TRUNC(SYSDATE+1)+(8*60+30)/(24*60) --每天早上8點30分執行
3:每周定時執行
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24 --每周一凌晨1點執行
Interval => TRUNC(next_day(sysdate,1))+2/24 --每周一凌晨2點執行
4:每月定時執行
Interval =>TTRUNC(LAST_DAY(SYSDATE)+1) --每月1日凌晨0點執行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 --每月1日凌晨1點執行
5:每季度定時執行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') --每季度的第一天凌晨0點執行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') + 1/24 --每季度的第一天凌晨1點執行
Interval => TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24 --每季度的最后一天的晚上11點執行
6:每半年定時執行
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24 --每年7月1日和1月1日凌晨1點
7:每年定時執行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24 --每年1月1日凌晨1點執行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM