熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle數據庫中Kill session的研究

2013-11-12 23:40:02  來源: Oracle 

  我們知道在Oracle數據庫中可以通過kill session的方式來終止一個進程其基本語法結構為:
  
  alter system kill session sidserial# ;
  
  被kill掉的session狀態會被標記為killedOracle會在該用戶下一次touch時清除該進程
  
  我們發現當一個session被kill掉以後該session的paddr被修改如果有多個session被kill那麼多個session的paddr都被更改為相同的進程地址:
  
  SQL> select saddrsidserial#paddrusernamestatus from v$session where username is not null;
  
  SADDR      SID  SERIAL# PADDR  USERNAME            STATUS
  
  EEC          BE EYGLE             INACTIVE
  E          BD SYS              ACTIVE
  
  
  SQL> alter system kill session ;
  
  System altered
  
  SQL> select saddrsidserial#paddrusernamestatus from v$session where username is not null;
  
  SADDR      SID  SERIAL# PADDR  USERNAME            STATUS
  
  EEC          DBD EYGLE             KILLED
  E          BD SYS              ACTIVE
  
  
  SQL> select saddrsidserial#paddrusernamestatus from v$session where username is not null;
  
  SADDR      SID  SERIAL# PADDR  USERNAME            STATUS
  
  EEC          DBD EYGLE             KILLED
  EAA          B EQSP              INACTIVE
  E          BD SYS              ACTIVE
  
  SQL> alter system kill session ;
  
  System altered
  
  SQL> select saddrsidserial#paddrusernamestatus from v$session where username is not null;
  
  SADDR      SID  SERIAL# PADDR  USERNAME            STATUS
  
  EEC          DBD EYGLE             KILLED
  EAA          DBD EQSP              KILLED
  E          BD SYS              ACTIVE
  
  
  
  在這種情況下很多時候資源是無法釋放的我們需要查詢spid在操作系統級來kill這些進程
  
  但是由於此時v$sessionpaddr已經改變我們無法通過v$session和v$process關聯來獲得spid
  
  那還可以怎麼辦呢?
  
  我們來看一下下面的查詢:
  
   SQL> SELECT susernamesstatus
    xADDRxKSLLAPSCxKSLLAPSNxKSLLASPOxKSLLIDRxKSLLRTYP
    decode(bitand (xksuprflg)null)
    FROM x$ksupr xv$session s
    WHERE spaddr(+)=xaddr
    and bitand(ksspaflg)!=;
  
  USERNAME            STATUS  ADDR    KSLLAPSC  KSLLAPSN KSLLASPO    KSLLIDR KS D
  
                      BA                     
                  ACTIVE  B                     
                  ACTIVE  BC                     
                  ACTIVE  BFB                     
                  ACTIVE  B                     
                  ACTIVE  B                     
                  ACTIVE  BAC                      
                  ACTIVE  BE                     
                  ACTIVE  B                    
                  ACTIVE  BD                     
                  ACTIVE  B                     
  
  USERNAME            STATUS  ADDR    KSLLAPSC  KSLLAPSN KSLLASPO    KSLLIDR KS D
  
  SYS              ACTIVE  BD                   
                      BE                  EV
                      B                  EV
  SYS              INACTIVE B                     
  SYS              INACTIVE BBF                  EV
  
   rows selected
  
  簡化一點其實就是如下概念:
  
  SQL> select paddr from v$process p where pid < > minus select spaddr from v$session s;
  ADDR
  
  BE
  B
  
  現在我們獲得了進程地址就可以在v$process中找到spid然後可以使用Kill或者orakill在系統級來殺掉這些進程
  
  當在Oracle中kill session以後 Oracle只是簡單的把相關session的paddr 指向同一個虛擬地址
  
  此時v$process和v$session失去關聯進程就此中斷
  
  然後Oracle就等待PMON去清除這些Session所以通常等待一個被標記為Killed的Session退出需要花費很長的時間
  
  如果此時被Kill的process重新嘗試執行任務那麼馬上會收到進程中斷的提示process退出此時Oracle會立即啟動PMON來清除該session這被作為一次異常中斷處理
From:http://tw.wingwit.com/Article/program/Oracle/201311/11195.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.