1. 程式人生 > >查殺oracle正在執行的job,解決job broken後,但view job時total time還在增長

查殺oracle正在執行的job,解決job broken後,但view job時total time還在增長

1.首先確定要停止的JOB號

select * from dba_jobs_running;--得到sid和job號

2.Broken你確認的JOB

可以在PL/SQL Developer中,直接選項broken;或者使用語句:

EXEC DBMS_JOB.BROKEN(job#,TRUE);--加入job號,注意commit

3.Kill 對應的Oracle Session

select * from v$session where sid='97' --根據sid號,得到SERIAL#

找到該job的對應SESSION(SID,SERIAL#),然後執行以下命令:

--ALTER SYSTEM KILL SESSION 'sid,serial#';

-- 如果使用ALTER SYSTEM KILL SESSION執行很長時間,其實可以使用OS的命令來快速KILL掉SESSION.步驟如下:

select * from v$session where sid='97'--根據sid號,得到paddr
select * from v$process where addr='6C8F14C4'    -- 加入paddr的值,得到spid的值,殺命令時用

 
     For Windows, at the DOS Prompt: orakill oraclesid spid--注意oraclesid為資料庫例項名
     For UNIX at the command line> kill –9 spid

4.檢查你的JOB是否還在執行

檢查你要停止的JOB是否還在執行,其實多數情況下,應該都已經停止了。尤其執行的第三步的“殺手”命令。

如果真的還是沒有停止,而且dba_jobs_running已經查不到該job了,則執行以下步驟;

5.select name,value from v$parameter where name ='job_queue_processes'; 
將Job Queue Processes的數目修改為0
ALTER SYSTEM SET job_queue_processes = 0;

job_queue_processes取值範圍為0到1000,總共可建立多少個job程序由job_queue_processes引數來決定。

注:當Job Queue Processes的數目為0,所有的JOB都會停止。

6.修改你要修改的任何東西,甚至是JOB內的內容。將job執行的所有東西注掉,寫return;否則不能編譯

也可以將job裡呼叫的所有儲存過程內容都注掉,寫return;編譯。

7.修改完成後,將job的BROKEN狀態停止。

SQL>EXEC DBMS_JOB.BROKEN(job#,FALSE);  --必須 commit

或者在PL/SQL Developer圖形介面上操作,也一樣;將job重新啟起來。

8.恢復job_queue_processes的原始值

ALTER SYSTEM SET job_queue_processes = 10;

此時重新整理幾次job,total time一會兒就會停止增長。job徹底停止。