資料倉儲一些老的任務搞的慢死了--轉一篇Oracle job 管理 學習一下,也處理一下當前的

bulletming發表於2019-07-14
broken並不能幹掉當前已經running的job,需要透過kill oracle session 和 kill os process來處理

===========================================================
Oracle job 管理,介紹job的建立、刪除、檢視,及其各引數。
SVRMGR> select * from dba_jobs;

初始化相關引數job_queue_processes
alter system set job_queue_processes=39 scope=spfile;//最大值不能超過1000 ;job_queue_interval = 10 //排程作業重新整理頻率秒為單位
DBA_JOBS describes all jobs in the database.
USER_JOBS describes all jobs owned by the current user

1 select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:m),interval from dba_jobs where job in (325,295)
2 select job,what,last_date,next_date,interval from dba_jobs where job in (1,3);


查詢job的情況。
show paramter background_dump_dest.
看alter.log 和trace

SVRMGR> select * from dba_jobs;

初始化相關引數job_queue_processes
alter system set job_queue_processes=39 scope=spfile;//最大值不能超過1000

job_queue_interval = 10 //排程作業重新整理頻率秒為單位


DBA_JOBS describes all jobs in the database.
USER_JOBS describes all jobs owned by the current user

1 select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:m),interval from dba_jobs where job in (325,295)
2 select job,what,last_date,next_date,interval from dba_jobs where job in (1,3);


查詢job的情況。
show paramter background_dump_dest.
看alter.log 和trace

請問我如何停止一個JOB
SQL> exec dbms_job.broken(1,true)

PL/SQL 過程已成功完成。
SQL>commit //必須提交否則無效

啟動作業
SQL> exec dbms_job.broken(1,false)

PL/SQL 過程已成功完成。

停其他使用者的job
SQL>exec sys.dbms_ijob.broken(98,true);
SQL>commit;


============================

exec dbms_job.broken(:job) 停止
exec dbms_job.broken(186,true) //標記位broken
exec dbms_job.broken(186,false)//標記為非broken
exec dbms_job.broken(186,false,next_day(sysdate,'monday')) //標記為非broken,指定執行時間
exec dbms_job.remove(:job);刪除
exec dbms_job.remove(186);
commit;

把一個broken job重新執行


三、檢視相關job資訊
1、相關檢視
dba_jobs
all_jobs
user_jobs
dba_jobs_running 包含正在執行job相關資訊


建立JOB
variable jobno number;
begin
dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/24,'HH'), 'trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);
commit;
end;
print jobno

例如,我們已經建立了一個儲存過程,其名稱為my_job,在sql/plus中以scott使用者身份登入,執行如下命令:
sql> variable n number;
sql> begin
dbms_job.submit(:n‘my_job;’,sysdate,
‘sysdate+1/360’);
commit;
end;
Sql> print :n;

系統提示執行成功。
Sql> print :n;
系統列印此任務的編號,例如結果為300。

簡單例子
一個簡單例子:

建立測試表
SQL> create table TEST(a date);

表已建立。

建立一個自定義過程
SQL> create or replace procedure MYPROC as
2 begin
3 insert into TEST values(sysdate);
4 end;
5 /

過程已建立。

建立JOB
SQL> variable job1 number;
SQL>
SQL> begin
2 dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');  --每天1440分鐘,即一分鐘執行test過程一次
3 end;
4 /

PL/SQL 過程已成功完成。

執行JOB
SQL> begin
2 dbms_job.run(:job1);
3 end;
4 /

PL/SQL 過程已成功完成。

SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 時間 from TEST;

時間
-------------------
2001/01/07 23:51:21
2001/01/07 23:52:22
2001/01/07 23:53:24

刪除JOB
SQL> begin
2 dbms_job.remove(:job1);
3 end;
4 /

PL/SQL 過程已成功完成。

=======================================


a、利用dbms_job.run()立即執行該job
sql>begin
sql>dbms_job.run(:jobno) 該jobno為submit過程提交時返回的job number
sql>end;
sql>/
b、利用dbms_job.broken()重新將broken標記為false
sql>begin
sql>dbms_job.broken (:job,false,next_date)
sql>end;
sql>/

========================================
SQL> create table a(a date);
Table created

建立一個過程
SQL> create or replace procedure test as
2 begin
3 insert into a values(sysdate);
4 end;
5 /
Procedure created

提交作業
SQL> declare
2 job1 number; //定義一個數字型變數
3 begin
4 dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440'); //按分鐘算一天1440分鐘
5 end;
6 /
PL/SQL procedure successfully completed
job1
---------
4
SQL> commit;
Commit complete

執行作業
SQL> begin
2 dbms_job.run(4);
3 end;
4 /
PL/SQL procedure successfully completed

刪除作業
SQL> begin
2 dbms_job.remove(4);
3 end;
4 /
PL/SQL procedure successfully completed
SQL> commit;
Commit complete


job change//修改作業
execute dbms_job.change(186,null,null,'sysdate+3');
execute dbms_job.change(186,'scott.test(update)');

DBA_JOBS
===========================================
欄位(列) 型別 描述
JOB NUMBER 任務的唯一標示號
LOG_USER VARCHAR2(30) 提交任務的使用者
PRIV_USER VARCHAR2(30) 賦予任務許可權的使用者
SCHEMA_USER VARCHAR2(30) 對任務作語法分析的使用者模式
LAST_DATE DATE 最後一次成功執行任務的時間
LAST_SEC VARCHAR2(8) 如HH24:MM:SS格式的last_date日期的小時,分鐘和秒
THIS_DATE DATE 正在執行任務的開始時間,如果沒有執行任務則為null
THIS_SEC VARCHAR2(8) 如HH24:MM:SS格式的this_date日期的小時,分鐘和秒
NEXT_DATE DATE 下一次定時執行任務的時間
NEXT_SEC VARCHAR2(8) 如HH24:MM:SS格式的next_date日期的小時,分鐘和秒
TOTAL_TIME NUMBER 該任務執行所需要的總時間,單位為秒
BROKEN VARCHAR2(1) 標誌引數,Y標示任務中斷,以後不會執行
INTERVAL VARCHAR2(200) 用於計算下一執行時間的表示式
FAILURES NUMBER 任務執行連續沒有成功的次數
WHAT VARCHAR2(2000) 執行任務的PL/SQL塊
CURRENT_SESSION_LABEL RAW MLSLABEL 該任務的信任Oracle會話符
CLEARANCE_HI RAW MLSLABEL 該任務可信任的Oracle最大間隙
CLEARANCE_LO RAW MLSLABEL 該任務可信任的Oracle最小間隙
NLS_ENV VARCHAR2(2000) 任務執行的NLS會話設定
MISC_ENV RAW(32) 任務執行的其他一些會話引數


描述 INTERVAL引數值
每天午夜12點 'TRUNC(SYSDATE + 1)'
每天早上8點30分 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'
每星期二中午12點 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每個月第一天的午夜12點 'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每個季度最後一天的晚上11點 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6點10分 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'

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

相關文章