Oracle中的Session kill不釋放問題

xz43發表於2011-07-21
今天在做統計資料,整了一個特複雜的SQL,透過PL/SQL來執行,狀態列下顯示執行完成,以及執行時間,可是彈出一個錯誤提示框,說執行錯誤,視窗上的“執行”按鈕不可用,點“中斷”也不起作用。
把該SQL複製到一新的視窗再次執行,依然提示成功的提示成功,報錯的視窗照樣彈出,提示錯誤,暈死。
這時,我得確定,這兩次SQL,是不是還在資料庫裡面執行。
select *  from v$session se, v$sqlarea sq
 where suser = 'test'
   and se.sql_id = sq.sql_id
發現那兩條SQL確實還在執行,採用 kill session 來終止SQL的執行。
SQL> alter system kill session '3961,26056';
System altered
SQL> alter system kill session '4923,8094';
System altered
SQL>
再次執行以上語句檢視session,發現session的status居然是killed,session還存在。原來 kill session 並沒有真正釋放資源,還需要在OS裡kill程式來達到資源的真正釋放。
kill session 雖然沒釋放資源,但還是把v$session裡面的PADDR這個欄位變成一樣的了。由於PADDR欄位已經改變,我們無法透過v$session和v$process關聯來獲得spid(v$session的paddr和v$process的addr欄位進行關聯)。
只能採用以下方式:
select addr, pid, spid
  FROM v$process p
 where addr in (select p.addr
                  from v$process p
                 where pid <> 1
                minus
                select s.paddr from v$session s)
 
最後在unix環境用kill -9 spid殺掉程式,在windows環境用orakill sid spid殺掉程式。
這是再執行如下語句:
select *
  from v$session se, v$sqlarea sq
 where suser = 'test'
   and se.sql_id = sq.sql_id
發現 killed 的記錄已經沒有了。
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-702774/,如需轉載,請註明出處,否則將追究法律責任。

相關文章