今天遇到乙個問題,有乙個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...