oracle 停止正在執行的job

2021-05-25 04:42:36 字數 2430 閱讀 5513

oracle如何停止乙個job

1 相關表、檢視

2 問題描述

為同事解決乙個因為網路連線情況不佳時,執行乙個超長時間的sql插入操作。

既然網路狀況不好,就選擇了使用一次性使用job來完成該插入操作。在job執行一段時間後,我發現被插入表有些問題(慚愧,當時也沒有先檢查檢查就做了)。準備停止job,因為在job運**況下,我的所有修改都會報系統資源忙的錯誤。

強行kill session是行不通的,因為過會兒,job還會重新啟動,如果執行的sql也被kill了通過重新啟動的job還是會被再次新執行的。

3 解決辦法

比較好的方法應該是;

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

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

今天遇到乙個問題,有乙個job會一直不停的執行,不能按照設定的間隔來執行。通過查詢相關資料發現原來如此 當乙個oracle job執行時返回乙個error時,oracle會再次設法執行它,第一次嘗試是在一分鐘後,第二次是在2分鐘後,第三次是4分鐘後,以此類推。每次嘗試的週期加倍,直到下一次的執行時刻...

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

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

強制停止正在執行的方法

摘要 如何暴力停止當前正在執行中的方法?利用執行緒強制退出,終止當前方法的執行。可以用於使用者頻繁操作ui請求後台服務,操作耗時等業務場景。廢話不說,上 1 2 可強制終止執行的方法。用在比較耗時的操作沒有結果的時候,強制退出上次的執行操作,以確保本次正確執行 3 4public class ter...