2016年10月3日 星期一

[Oracle]ORA-00031:session marked for kill 處理Oracle中殺不掉的Table Lock [ORA-04021 + ORA-02049]

在客戶端的Oracle DB環境遇到無法Update資料的情況
會出現ORA-02049: timeout: distributed transaction waiting for lock tips 
           發生逾時狀況 分散式交易可繼續等候鎖定權的時間已過
連Compile Prcedure時都無法成功Compile
會出現ORA-04021: timeout occurred while waiting to lock object
            等待鎖定物件時 發生逾時的情況
這兩個錯誤訊息其實都是一樣的狀況,就是遇到了Table Lock的狀況

我是使用PLSQL Developer,這套軟體,平常就是去Tool->Sessions裡
把所有的認識的Session刪掉,不過沒有刪除掉真的卡住的Session所以還是無法Update資料

使用以下語法可以查出被Lock的Session
select b.SID,b.SERIAL#,c.SQL_TEXT
from v$locked_object a, v$session b, v$sqlarea c
where a.SESSION_ID = b.SID
and b.SQL_ADDRESS = c.ADDRESS
and c.sql_text like '%table_name%'
只後再使用標準的Kill Session語法
alter system kill session 'sid,serial#';
ex:ALTER SYSTEM KILL SESSION '11,2727';

但不知為何砍不掉Session 出現ORA-00031:session marked for kill

一些ORACLE中的Session被殺掉後,狀態為"killed",但是鎖定的資源很長時間不釋放,有時實在沒辦法,只好重啟資料庫。但是shutdown immediate又怕可能Session殺不掉會一直停留在shutdown immediate,直接shutdown abort又怕損壞資料庫。 
解決方案之一,就是在ORACLE中殺不掉的,在OS一級再殺。 
採取以下方式流程處理:
1.查詢已經為KILLED狀態但仍未釋放資源的Session
select a.spid,b.sid,b.serial#,b.username from v$process a,v$session b where a.addr=b.paddr and b.status='KILLED';
2.在windows(unix也適用)用orakill殺死線程,orakill是oracle提供的一個可執行命令,
語法為︰orakill sid thread 
其中︰ 
sid︰表示要殺死的進程屬於的實例名 
thread︰是要殺掉的線程號,即第1步查詢出的spid
例︰c:>orakill orcl 12345





沒有留言:

張貼留言