oracle死鎖時殺進程的方法:
創(chuàng)新互聯擁有網站維護技術和項目管理團隊,建立的售前、實施和售后服務體系,為客戶提供定制化的網站設計、做網站、網站維護、綿陽服務器托管解決方案。為客戶網站安全和日常運維提供整體管家式外包優(yōu)質服務。我們的網站維護服務覆蓋集團企業(yè)、上市公司、外企網站、成都做商城網站、政府網站等各類型客戶群體,為全球成百上千家企業(yè)提供全方位網站維護、服務器維護解決方案。
第一步:嘗試在sqlplus中通過sql命令進行刪除,如果能夠刪除成功,則萬事大吉。但通常情況下,出現死鎖時,想通過命令行或者通過oracle的管理工具刪除有死鎖的session,oracle只會將該session標記為killed,但無法清除掉,往往需要通過第二步在操作系統(tǒng)層級進行刪除。
第二步:
1、select xidusn, object_id, session_id, locked_mode from v$locked_object; --查死鎖的對象,獲取其SESSION_ID。
2、select username,sid,serial# from v$session where sid=29; --根據上步獲取到的sid查看其serial#號。
3、alter system kill session '29,57107'; --刪除進程,如已經刪除過,則會報ora-00031的錯誤;否則oracle會將該session標記為killed狀態(tài),等待一段時間看能否會自動消失,如長時間消失不掉,則需要做后續(xù)步驟。
一些ORACLE中的進程被殺掉后,狀態(tài)被置為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟數據庫?,F在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。
1 相關表、視圖 dba_jobs all_jobs user_jobs 包含登錄用戶所有的JOB信息 dba_jobs_running 包含正在運行job相關信息注意 須使用oracle的sys用戶登錄到數據庫,才能查看dba_jobs_running, v$process, v$session表的信息。同時,登錄操作系統(tǒng)時,要用oracle用戶。2 問題描述為同事解決一個因為網絡連接情況不佳時,執(zhí)行一個超長時間的SQL插入操作。既然網絡狀況不好,就選擇了使用一次性使用JOB來完成該插入操作。在JOB執(zhí)行一段時間后,我發(fā)現被插入表有些問題(慚愧,當時也沒有先檢查檢查就做了)。準備停止JOB,因為在JOB運行情況下,我的所有修改都會報系統(tǒng)資源忙的錯誤。強行KILL SESSION是行不通的,因為過會兒,JOB還會重新啟動,如果執(zhí)行的SQL也被KILL了通過重新啟動的JOB還是會被再次新執(zhí)行的。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); 注意:當執(zhí)行完該命令你選擇的這個JOB還是在運行著的。 3. Kill 對應的Oracle Session 應為BROKEN后該JOB還在運行,如果要求該JOB立刻停止,就需要找到該job的對應SESSION(SID,SERIAL#),然后執(zhí)行以下命令: ALTER SYSTEM KILL SESSION 'sid,serial#'; 或者直接KILL對應的操作系統(tǒng)的SESSION,如果使用ALTER SYSTEM KILL SESSION執(zhí)行很長時間,其實可以使用OS的命令來快速KILL掉SESSION. For Windows, at the DOS Prompt: orakill sid spid For UNIX at the command line kill –9 spid 4. 檢查你的JOB是否還在運行 檢查你要停止的JOB是否還在運行,其實多數情況下,應該都已經停止了。尤其執(zhí)行的第三步的“殺手”命令。如果真的還是沒有停止,只好從第一道第三步重新做一下了。 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狀態(tài)停止。SQLEXEC DBMS_JOB.BROKEN(job#,FALSE): 8. 恢復job_queue_processes的原始值 ALTER SYSTEM SET job_queue_processes = original_value; 至此整個停止并修改JOB完成. 但是需要另外注意一下的是,在MARK一個BROKEN狀態(tài)的時候,因為JOB內部執(zhí)行SQL的原因,所以執(zhí)行時或許要“煎熬”一段時間。所以在建立JOB時一定要仔細考慮,同時如果可能可以在你設計的PL/SQL代碼中,增加一些判斷“停止信號”的部分。來避免費力執(zhí)行上面的步驟。 畢竟,ORACLE在執(zhí)行JOB時,還是很“倔強”的 -:) 4 附件:ORAKILL用法很多時候遇到某個session一直處于active,使得CPU一直處于搞使用狀態(tài),雖然kill 了,但是卻不能夠使得使得線程結束。 kill session只是kill這個進程,但是線程一直處于活動狀態(tài)。需要真正的kill線程才能夠解決cpu使用率高的問題。os :windows2003ORAKILL用法是 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 = XXX;--說明:XXX為session的sid (不是數據庫SID 呵呵)。自己輸入就可以。orakill instance_name spid這樣就能夠成功解決cpu使用率高的問題
SELECT SID,JOB FROM DBA_JOBS_RUNNING; 查詢job,找到你要的那個job號
job:dbms_job.remove(jobno); 移去job號
找出正在執(zhí)行的JOB 編號及其會話編號 SELECT SID,JOB FROM DBA_JOBS_RUNNING; 停止該JOB 的執(zhí)行 SELECT SID,SERIAL# FROM V$SESSION WHERE SID='SID'; ALTER SYSTEM KILL SESSION 'SID,SERIAL'; EXEC DBMS_JOB.BROKEN(JOB,TRUE); 實例分析: 1,查詢正在運行的Job,通過查詢有兩個,和進程占用較多的是兩個ORACLE 進程符合。 SQL SELECT SID,JOB FROM DBA_JOBS_RUNNING; SID JOB ---------- ---------- 12 116 16 117 2,查詢正在運行的job 的信息 SQL SELECT SID,SERIAL# FROM V$SESSION WHERE SID='12'; SID SERIAL# ---------- ---------- 12 4 SQL SELECT SID,SERIAL# FROM V$SESSION WHERE SID='16'; SID SERIAL# ---------- ---------- 16 1 3,利用查詢出來的job 信息將job 結束掉 SQL ALTER SYSTEM KILL SESSION '12,4'; System altered. SQL ALTER SYSTEM KILL SESSION '16,1'; System altered. 4,如果不希望運行上述job 的話,可以將job 設置為broken. EXEC DBMS_JOB.BROKEN(116,TRUE); EXEC DBMS_JOB.BROKEN(117,TRUE);
oracle 如何查找和kill 對應的job進程
查找當前被鎖住的進程:
SELECT object_name, s.sid, s.serial#, p.spid
FROM v$locked_object l, dba_objects o, v$session s, v$process p
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
AND s.paddr = p.addr;
Kill 對應的Oracle Session
應為BROKEN后該JOB還在運行,如果要求該JOB立刻停止,就需要找到該job的對應SESSION(SID,SERIAL#),然后執(zhí)行以下命令:
ALTER SYSTEM KILL SESSION 'sid,serial#';
將Job Queue Processes的數目修改為0
首先確認當前的Job Queue Processes的數目
SQL select name,value from v$parameter where name ='job_queue_processes';
然后將Job Queue Processes的數目修改為0
ALTER SYSTEM SET job_queue_processes = 0;
保證所有的JOB都會停止。
恢復job_queue_processes的原始值
ALTER SYSTEM SET job_queue_processes = original_value;
分享名稱:oracle怎么殺job,oracle徹底殺死killed會話
文章路徑:http://chinadenli.net/article4/hohhie.html
成都網站建設公司_創(chuàng)新互聯,為您提供網站設計公司、做網站、網站營銷、小程序開發(fā)、網站改版、網站導航
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯