oracle
如何停止乙個
job
dba_jobs
all_jobs
user_jobs
包含登入使用者所有的
job資訊
dba_jobs_running
包含正在執行
job相關資訊
注意 須使用oracle
的sys
使用者登入到資料庫,才能檢視
dba_jobs_running, v$process, v$session
表的資訊。同時,登入作業系統時,要用
oracle
使用者。
為同事解決乙個因為網路連線情況不佳時,執行乙個超長時間的
sql插入操作。
既然網路狀況不好,就選擇了使用一次性使用
job來完成該插入操作。在
job執行一段時間後,我發現被插入表有些問題(慚愧,當時也沒有先檢查檢查就做了)。準備停止
job,因為在
job運**況下,我的所有修改都會報系統資源忙的錯誤。 強行
kill session
是行不通的,因為過會兒,
job還會重新啟動,如果執行的
sql也被
kill
了通過重新啟動的
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
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
時,還是很「倔強
」的-:)
很多時候遇到某個
session
一直處於
active
,使得cpu
一直處於搞使用狀態,雖然
kill
了,但是卻不能夠使得使得執行緒結束。
kill session
只是kill
這個程序,但是執行緒一直處於活動狀態。需要真正的
kill
執行緒才能夠解決
cpu使用率高的問題。
os :windows2003
orakill
用法是orakill sid spid
其中sid
為例項名,
spid
為執行緒號。
怎麼樣取得這個
spid
呢? 以下給出查詢
spid
的語句。
select spid, osuser, s.program fromv$process p, v$session s
where p.addr=s.paddrand s.sid = ***;
--說明
:***
為session
的sid (
不是資料庫
sid 呵呵)
。自己輸入就可以。
orakill instance_name spid
這樣就能夠成功解決
cpu使用率高的問題
oracle 強制停止job
一 溫柔的方法 1 檢視所有job select from dba jobs 2 檢視正在執行的job select from dba jobs running 3 根據sid查出對應的session select sid,serial from v session where sid sid 4 ...
如何停止乙個執行緒
停止乙個執行緒的最佳方法是讓它執行完畢,沒有辦法立即停止乙個執行緒,但你可以控制何時或什麼條件下讓他執行完畢。通過條件變數控制線程的執行,執行緒內部檢查變數狀態,外部改變變數值可控制停止執行。為保證執行緒間的即時通訊,需要使用volatile關鍵字或鎖,確保讀執行緒與寫執行緒變數狀態的一致性。pub...
oracle 停止正在執行的job
oracle如何停止乙個job 1 相關表 檢視 2 問題描述 為同事解決乙個因為網路連線情況不佳時,執行乙個超長時間的sql插入操作。既然網路狀況不好,就選擇了使用一次性使用job來完成該插入操作。在job執行一段時間後,我發現被插入表有些問題 慚愧,當時也沒有先檢查檢查就做了 準備停止job,因...