Oracle程序無法KILL處理方案
Oracle程序被KILL之後,狀態被置為"KILLED",但是鎖定的資源長時間不釋放,會出現類似下面這樣的錯誤提示:
ORA-00030: User session ID does not exist
或
ORA-00031: session marked for kill
以往大多都是通過重啟資料庫的方式來強行釋放鎖資源。
現提供另一種方式解決該問題,在ORACLE中KILL不掉,在OS系統中再殺,操作方式如下:
1. 檢視哪些物件被鎖
SELECT DISTINCT t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
2.檢視對應執行的是哪一個SQL語句(會提示輸入SID引數,就是上一步查詢出來 的SID)
select sql_text from v$session a,v$sqltext_with_newlines b
where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash_value
and a.sid=&sid order by piece;
3.殺死對應的程序(上述的sid與serial#引數傳入)
alter system kill session 'sid,serial#';
上述步驟完成之後,若還是無法釋放對應的資源,進行下一步操作:
4. 取得語句的程序號
select spid,oSUSEr,s.program from v$session s,v$process p
where s.paddr=p.addr and s.sid=&sid;
5.在OS級別中殺死該程序
a. unix系統,以root身份執行以下命令
# kill -9 &spid(即第4步查詢出來的程序號spid)
b. windows系統,用orakill命令執行
語法為:orakill sid thread
sid: oracle例項名
thread 執行緒號,即第4步中的spid
eg: c:> orakill orcl 12345
上述直至第4步,都是在oracle中執行的,第5步是在作業系統(服務端,非客戶端)中執行的