處理Oracle被鎖住的進程

      5月11日 發佈一個EBS程序,PLSQL Developer編譯提示“程序被鎖”。之前此程序發佈過,後來對代碼進行了優化,重新發布。因爲Oracle爲確保數據的完整性和一致性,所以會鎖住正在運行的程序。由於當時還沒有完全掌握殺掉session的方法,只有等到第二天鎖被自動釋放後才完成編譯操作。
 
處理被鎖進程的方法如下,請大家參考。

一、解決辦法

1、執行以下語句子,獲得被鎖表的Session ID
select b.owner,b.object_name,a.session_id,a.locked_mode
from dba_objects b, v$locked_object a
where b.object_id = a.object_id
and b.object_name='PER_ALL_ASSIGNMENTS_F';
 
 2、運行PL/SQL,ToolsSessions,對比剛纔獲得的Session ID,Kill掉被鎖的Session。被kill掉的session狀態會被標記爲killed,Oracle會在該用戶下一次touch時清除該進程。
     另外SQLPLUS執行alter syst kill session 'xx,xxxx'; (其中xx,xxxx分別是查詢到的sid,serial#)也可以殺掉被鎖進程;如果有ORA-00031錯誤,則在後面加參數immediate;命令:alter system kill session 'xx,xxxx' immediate;
 
3、如果被置爲"Killed"的進程長時間未被釋放,可以在OS一級再殺死相應的進程,執行以下語句獲得OS進程號(PID):
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=xx (xx就是鎖表的Session ID)
 
4、在OS層殺死這個進程:
kill -9 xxxxx(xxxxx就是3步查詢出的SPID)
 
 
二、實驗
 
以上操作是否會影響其他session,即被殺(kill)掉的OS進程是否跟其他session 相關?下面我們來做一下測試。
1、查詢Oracle進程信息
select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
 
2、執行下面的SQL語句獲得SPID號。(語句中的115是第一步查詢到的SID號)
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=115
 
3、在OS上殺死上面獲得的進程
KILL -9 2478436
 
4、 再次執行查詢語句
select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SID爲115的進程消失了。
 
5、 通過以上實驗,說明v$sessions和v$process是相對應的,通常情況下Kill掉對應的OS進程不會影響到其他session。(具體情況需要跟開發人員進溝通 )
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章