分类

  • 软件天地

  • Oracle数据库中Kill session的研究‖
    法结构为:
    据库中,可以通过kill session

    的方式来终止一个进程,其基本语



      alter system kill se
    ssion 'sid,serial#' ;

      被kill掉的session,状
    程.
    态会被标记为killed,Oracle会

    在该用户下一次touch时清除该进


      我们发现当一个session被kill掉以
    被kill,那么多个session的paddr都被更
    后,该session的paddr被修改,如果有多个session
    改为相同的进程地址:

      SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;


      SADDR      SID  SERIAL# P
    ADDR  USERNAME            STATUS
      -------- ----------
    -
    ---------- -------- --------

    ---------------------- -------

      542E0E6C     11    314 5
    E
    42B70E8 EYGLE             INACTIV

      542E5044     18
        662 542B6D38 SYS  
                ACTIVE


      SQL> alter system kill session '11,314';


      System altered.                                                

      SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;


      SADDR      SID
      SERIAL# PADDR  USERNAM
    E            STATUS
      -------- ----------
    -
    ---------- -------- --------

    ---------------------- -------

      542E0E6C     11    314 5
    42D6BD4 EYGLE             KILLED
      542E5044     18    662 5
    42B6D38 SYS              ACTIVE


      SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;


      SADDR      SID
      SERIAL# PADDR  USERNAM
    E            STATUS
      -------- ----------
    -
    ---------- -------- --------

    ---------------------- -------

      542E0E6C     11    314 5
    42D6BD4 EYGLE             KILLED
      542E2AA4     14
    INACTIVE
        397 542B7498 EQSP 

                

      542E5044     18
        662 542B6D38 SYS  
                ACTIVE

      SQL> alter system kill session '14,397';


      System altered.                                                

      SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;


      SADDR      SID  SERIAL# P
    ADDR  USERNAME            STATUS
      -------- ----------
    -
    ---------- -------- --------

    ---------------------- -------

      542E0E6C     11    314 5
    42D6BD4 EYGLE             KILLED
      542E2AA4     14
    D
        397 542D6BD4 EQSP 

                 KILLE

      542E5044     18
        662 542B6D38 SYS  
                ACTIVE



      在这种情况下,很多时候,资源是无
    这些进程.
    法释放的,我们需要查询spid,在操作系统级来kill


      但是由于此时v$sessio
    得spid
    n.paddr已经改变,我们无法通

    过v$session和v$process关联来获


      那还可以怎么办呢?                                                            

      我们来看一下下面的查询:                                                      

       SQL> SELECT s.username,s.status,

       2 x.ADDR,x.KSLLAPSC,x.KSLLAPS
    N,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP,
       3 decode(bitand (x.ksuprflg,2
    ),0,null,1)
       4 FROM x$ksupr x,v$session s                    
       5 WHERE s.paddr(+)=x.addr                          
       6 and bitand(ksspaflg,1)!=0;                    

      USERNAME      
    KSLLASPO    KSLLID1R
          STATUS  ADDR  
    KS D
      KSLLAPSC  KSLLAPSN

      --------------------
    ------------ ----------
    ---------- -------- --------
    -- -
    ---------- ----------

                      
            0
        542B44A8     0     0    

                      A
            0  1
    CTIVE  542B4858     1     14 24069 

                
            0  1
          ACTIVE  542B4C08

         26     16 15901 

                
            0  1
          ACTIVE  542B4FB8

         7     46 24083 

                
            0  1
          ACTIVE  542B5368

         12     15 24081 

                
            0  1
          ACTIVE  542B5718

         15     46 24083 

                
            0  1
          ACTIVE  542B5AC8

         79     4 15923 

                      A
            0  1
    CTIVE  542B5E78     50     16 24085 

                
            0  1
          ACTIVE  542B6228

        754     15 24081 

                
            0  1
          ACTIVE  542B65D8

         1     14 24069 

                      A
            0  1
    CTIVE  542B6988     2     30 14571 


      USERNAME      
    KSLLASPO    KSLLID1R
          STATUS  ADDR  
    KS D
      KSLLAPSC  KSLLAPSN

      ------------------------------ -
    ------------ ---------- -- -
    ------- -------- ---------- ----------

      SYS        
             0
          ACTIVE  542B6D3

    8     2     8 24071

                
           195 EV
              542B70E8

         1     15 24081 

                      
           195 EV
        542B7498     1     15 24081 

      SYS        
             0
          INACTIVE 542B784

    8     0     0   

      SYS              I
           195 EV
    NACTIVE 542B7BF8     1     15 24081 


      16 rows selected.                                            

      简化一点,其实就是如下概念:                                                  

      SQL> select p.addr from v$process p where pid < > 1 2 minus 3 select s.paddr from v$session s;

      ADDR                                                                      
      --------                                                              
      542B70E8                                                              
      542B7498                                                              

      现在我们获得了进程地址,就可以在
    orakill在系统级来杀掉这些进程.
    v$process中找到spid,然后可以使用Kill或者


      当在Oracle中kill ses
    虚拟地址.
    sion以后, Oracle只是简单的把

    相关session的paddr 指向同一个


      此时v$process和v$session失去关联,进程就此中断.            

      然后Oracle就等待PMON去清除这些Se
    退出需要花费很长的时间.
    ssion.所以通常等待一个被标记为Killed的Session


      如果此时被Kill的process,重新尝
    process退出,此时Oracle会立即启动PMO
    试执行任务,那么马上会收到进程中断的提示,
    N来清除该session.这被作为一次异常中断处理.

    上一页 下一页




    map