oracle如何查詢和停止正在執行的job

2021-06-07 17:37:29 字數 2463 閱讀 8660

今天遇到乙個問題,有乙個job會一直不停的執行,不能按照設定的間隔來執行。通過查詢相關資料發現原來如此: 

當乙個oracle job執行時返回乙個error時,oracle會再次設法執行它,第一次嘗試是在一分鐘後,第二次是在2分鐘後,第三次是4分鐘後,以此類推。每次嘗試的週期加倍,直到下一次的執行時刻來到,又再次嘗試,當嘗試執行失敗16次時,oracle自動標示此job為broken,不再執行此任務。

由於這是乙個不能重複跑的job,就查詢如何停止正在執行的job,操作如下:   

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

在10g中可通過dba_jobs_running進行確認。

查詢正在執行的job:

select sid from dba_jobs_running;

查詢到正在執行的job的spid:

select a.spid from v$process a ,v$session b where a.addr=b.paddr and b.sid in (select sid from dba_jobs_running);

2. broken你確認的job   

注意使用dbms_job包來標識你的job為broken。

sql> exec dbms_job.broken(job#,true);

注意:當執行完該命令你選擇的這個job還是在執行著的。

3. kill 對應的oracle session

應為broken後該job還在執行,如果要求該job立刻停止,就需要找到該job的對應session(sid,serial#),然後執行以下命令:

alter system kill session 'sid,serial#';

或者直接kill對應的作業系統的session,如果使用alter system kill session執行很長時間,其實可以使用os的命令來快速kill掉session.

for windows, at the dos prompt: orakill sid spid

for unix at the command line> kill –9 spid

注意:alter system kill session 'sid,serial#';  有時候是關閉不掉了,殺掉只有又會自動執行,因此建議直接啥系統執行緒

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

檢查你要停止的job是否還在執行,其實多數情況下,應該都已經停止了。尤其執行的第三步的「殺手」命令。如果真的還是沒有停止,只好從第一道第三步重新做一下了。

5. 將job queue processes的數目修改為0 

首先確認當前的job queue processes的數目

sql> col value for a10

sql> select name,value from v$parameter where name ='job_queue_processes';    

然後將job queue processes的數目修改為0

sql> alter system set job_queue_processes = 0;

保證所有的job都會停止。

6. 修改你要修改的任何東西,甚至是job內的內容。

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

sql>exec dbms_job.broken(job#,false):

8. 恢復job_queue_processes的原始值

alter system set job_queue_processes = original_value;

至此整個停止並修改job完成.

但是需要另外注意一下的是,在mark乙個broken狀態的時候,因為job內部執行sql的原因,所以執行時或許要「煎熬」一段時間。所以在建立job時一定要仔細考慮,同時如果可能可以在你設計的pl/sql**中,增加一些判斷「停止訊號」的部分。來避免費力執行上面的步驟。

畢竟,oracle在執行job時,還是很「倔強」的 -:)

4      附件:orakill用法

很多時候遇到某個session一直處於active,使得cpu一直處於搞使用狀態,雖然kill 了,但是卻不能夠使得使得執行緒結束。 kill session只是kill這個程序,但是執行緒一直處於活動狀態。需要真正的kill執行緒才能夠解決cpu使用率高的問題。

os :windows2003

orakill用法是 orakill sid spid 其中sid為例項名,spid為執行緒號。

怎麼樣取得這個spid呢?

以下給出查詢spid的語句。

select spid, osuser, s.program from v$process p, v$session s

where p.addr=s.paddr and s.sid = ***;

--說明:***為session的sid (不是資料庫sid 呵呵)。自己輸入就可以。

orakill instance_name spid

這樣就能夠成功解決cpu使用率高的問題

oracle 停止正在執行的job

oracle如何停止乙個job 1 相關表 檢視 2 問題描述 為同事解決乙個因為網路連線情況不佳時,執行乙個超長時間的sql插入操作。既然網路狀況不好,就選擇了使用一次性使用job來完成該插入操作。在job執行一段時間後,我發現被插入表有些問題 慚愧,當時也沒有先檢查檢查就做了 準備停止job,因...

oracle expdp如何停止正在執行的job

linux環境,前幾天使用expdp導資料,中途不想導了,當時直接關了當前cmd 視窗,想起可能這個job還在執行。好吧,學習一下如何停止 1 先看看有哪些資料幫浦的job select from dba datapump jobs 以上語句查出來的可能有幾條資料 sys export schema...

oracle 查詢鎖和 正在執行的SQL

查詢oracle正在執行的sql語句及執行該語句的使用者 select b.sid oracleid,b.username 登入oracle使用者名稱,b.serial spid 作業系統id,paddr,sql text 正在執行的sql,b.machine 計算機名 from v process...