Oracle 徹底 kill session

germany006發表於2014-06-06
轉載地址:http://blog.csdn.net/leshami/article/details/6439019


--***************************

-- Oracle  kill session

--***************************

 

 

  kill session DBA到的事情之一。如果kill 掉了不kill session具有破壞性,因此可能的避免這樣錯誤發生。同應當注意,

如果kill sessionOracle 後臺程,容易庫實例當機。

  通常情下,不需要操作系統級別殺Oracle會話進程,但是如此,下面的描述中出了Oracle級別殺會話以及操作系統級別殺程。

 

 

一、得需要kill session的資訊(使用V$SESSION  GV$SESSION檢視)

 

  SET LINESIZE 180

  COLUMN spid FORMAT A10

  COLUMN username FORMAT A10

  COLUMN program FORMAT A40

 

  SELECT s.inst_id,

         s.sid,

         s.serial#,

         p.spid,

         s.username,

         s.program,

         s.paddr,

         s.STATUS

  FROM   gv$session s

         JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id

  WHERE  s.type != 'BACKGROUND';

 

     INST_ID        SID    SERIAL# SPID       USERNAME   PROGRAM                                       PADDR    STATUS

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

           1        146         23 27573      TEST       sqlplus@oracle10g (TNS V1-V3)                 4C621950 INACTIVE

           1        160         17 27610      SYS        sqlplus@oracle10g (TNS V1-V3)                 4C624174 ACTIVE

           1        144         42 27641      SCOTT      sqlplus@oracle10g (TNS V1-V3)                 4C624730 INACTIVE

        

二、使用ALTER SYSTEM KILL SESSION 命令實現

  法:

      SQLALTER SYSTEM KILL SESSION 'sid,serial#';

      SQLALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

    

    RAC境下的kill session ,需要搞清楚需要kill session 位於哪個節點,可以查詢GV$SESSION檢視獲得。

    kill session 僅僅將會話殺掉。在有些候,由於大的事或需要較長SQL將導致需要killsession不能立即掉。這種

    況將收到 "marked for kill"提示(如下),一旦會話當前事或操作完成,該會話被立即掉。

   

    alter system kill session '4730,39171'

    *

    ERROR at line 1:

    ORA-00031session marked for kill

 

 

  在下面的操作中將殺會話146144

    sys@AUSTIN> alter system kill session '146,23';

   

    System altered.

   

    sys@AUSTIN> alter system kill session '144,42';

   

    System altered.

   

    sys@AUSTIN> select inst_id,saddr,sid,serial#,paddr,username,status,program from gv$session where username is not null;

   

       INST_ID SADDR           SID    SERIAL# PADDR    USERNAME   STATUS   PROGRAM

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

             1 4C70BF04        144         42 4C6545A0 SCOTT      KILLED   sqlplus@oracle10g (TNS V1-V3)

             1 4C70E6B4        146         23 4C6545A0 TEST       KILLED   sqlplus@oracle10g (TNS V1-V3)

             1 4C71FC84        160         17 4C624174 SYS        ACTIVE   sqlplus@oracle10g (TNS V1-V3)

                 

     注意:在查詢中可以看到被掉的會話PADDR地址生了化,查詢結果中的色字型。如果多sessionkill 掉,sessionPADDR

     被改相同的程地址

 

  下面的找回被kill 掉的ADDR先前的地址

    SELECT s.username,s.status,

    x.ADDR,x.KSLLAPSC,x.KSLLAPSN,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP,

    decode(bitand (x.ksuprflg,2),0,null,1)

    FROM x$ksupr x,v$session s

    WHERE s.paddr(+)=x.addr

    and bitand(ksspaflg,1)!=0;      

   

    USERNAME   STATUS   ADDR       KSLLAPSC   KSLLAPSN KSLLASPO       KSLLID1R KS D

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

               ACTIVE   4C623BB8         99          4 27468               275 EV 1

               ACTIVE   4C623040          9         24 27444                 0    1

               ACTIVE   4C622A84        101          4 27480               274 EV 1

               ACTIVE   4C6224C8          1         48 27450                 0    1

               ACTIVE   4C621F0C          1         48 27450                 0    1

               ACTIVE   4C6235FC          2          4 27468                 0    1

    SYS        ACTIVE   4C624174          2         15 27442                 0

               ACTIVE   4C62081C          1         48 27440                 0    1

               ACTIVE   4C621394          1         48 27440                 0    1

               ACTIVE   4C620DD8         11         24 27476                 0    1

               ACTIVE   4C61F6E8         15          4 27610                 0    1

               ACTIVE   4C620260        222         24 27450                 0    1

               ACTIVE   4C61FCA4          7         25 27573                 0    1

               ACTIVE   4C61F12C          6         25 27573                 0    1

               ACTIVE   4C61EB70          4         24 27458                 0    1

               ACTIVE   4C61E5B4          1         48 27440                 0    1

               ACTIVE   4C61DFF8          2         24 27444                 0    1

                        4C624730          0          0                       0

                        4C621950          0          0                       0

                        4C61DA3C          0          0                       0

                   

 

  或者根據下面的來獲化的addr

    sys@AUSTIN> select p.addr from v$process p where pid <> 1

      2  minus

      3  select s.paddr from v$session s;

   

    ADDR

    --------

    4C621950

    4C624730                   

 

三、在操作系統級別殺會話

  會話對應的操作系ID

    sys@AUSTIN> select SPID from  v$process where ADDR in ('4C621950','4C624730') ;        

   

    SPID

    ----------

    27573

    27641

   

  使用kill 命令來殺操作系統級別進ID

    kill session -9 27573

   

    kill session -9 27641

 

四、會話SID

  SQLselect userenv('sid'from dual;

 

  USERENV('SID')

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

             627

 

五、多個會話需要kill 

  1.根據定的SID()找需要會話的資訊,包括位於個實

    set linesize 160

    col program format a35

    col username format a18

    select inst_id,saddr,sid,serial#,paddr,username,status,program from gv$session

    where sid in ('2731','2734','2720','2678','2685')

    and username='CTICUST'

    order by inst_id;

   

       INST_ID SADDR                   SID    SERIAL# PADDR            USERNAME           STATUS   PROGRAM

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

             1 00000003DAF8F870       2678       8265 00000003DBC6CA08 MSS4USR            INACTIVE JDBC Thin Client

             1 00000003DAF98E48       2685         83 00000003DBC08510 MSS4USR            ACTIVE   JDBC Thin Client

             1 00000003DAFC7B80       2720          5 00000003DBBEDA20 MSS4USR            INACTIVE JDBC Thin Client

             1 00000003DAFD66F8       2731          3 00000003DBBE9AE0 SYS                ACTIVE  racgimon@svdg0028(TNS V1-V3)

             1 00000003DAFDA730       2734         15 00000003DBBEC268 MSS4USR            INACTIVE JDBC Thin Client

             2 00000003DAFD66F8       2731          1 00000003DBBE92F8                    ACTIVE   oracle@svdg0029 (ARC0)

   

    上面的查詢中有一SID2731的位於2上。

    也可以通下面的方式來獲RAC點資訊,便於確定需要kill session究竟位於個節點。

   

      set linesize 160

      col HOST_NAME format a25

      SQLselect INSTANCE_NUMBER,INSTANCE_NAME,HOST_NAME,VERSION,STATUS from gv$instance order by 1;

 

      INSTANCE_NUMBER INSTANCE_NAME    HOST_NAME                 VERSION           STATUS

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

                    1 O02WMT1A         svd0051                  10.2.0.4.0        OPEN

                    2 O02WMT1B         svd0052                  10.2.0.4.0        OPEN

                    3 O02WMT1C         svd0053                  10.2.0.4.0        OPEN

                   

  2.使用下面查詢來生成kill session 

    select 'alter system kill session '''|| sid ||',' ||SERIAL# ||''''||';'  from  gv$session

    where sid in ('2731','2734','2720','2678','2685')

    order by inst_id;

     

    得下列kill session句,根據要求由於此次需要掉的session全部位於1,因此登1行下面的  

        

    alter system kill session '2678,8265';

   

    alter system kill session '2685,83';

   

    alter system kill session '2720,5'

   

    alter system kill session '2731,3';

    

    alter system kill session '2734,15';

    

    alter system kill session '2731,1';    --命令不需要行,session位於2

            

六、有kill session考:

   

  

  

 

七、更多

 

有關效能最佳化請參考

Oracle 硬解析與軟解析

共享池的調與優化(Shared pool Tuning)

Buffer cache 調與優化(一)

Oracle 存(caching table)的使用

 

有關閃回特性請參考

Oracle 回特性(FLASHBACK DATABASE)

Oracle 回特性(FLASHBACK DROP & RECYCLEBIN)

Oracle 回特性(Flashback Query、Flashback Table)

Oracle 回特性(Flashback Version、Flashback Transaction)

 

有關基於使用者管理的備份和備份恢復的概念請參考

Oracle 備份

Oracle 熱備份

Oracle 備份復概

Oracle 例恢

Oracle 基於用管理恢(詳細描述了介質恢復及其處理)

 

有關RMAN的恢復與管理請參考

RMAN 述及其體系結構

RMAN 配置、管理

RMAN 備份詳

RMAN 

 

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

相關文章