Oracle 彻底 kill session

本文详细介绍Oracle环境下如何使用SQL命令及操作系统命令kill会话(session),包括获取待kill会话信息、执行killsession命令的方法及注意事项,适用于Oracle DBA及高级用户。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

-- 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         2327573   TEST       sqlplus@oracle10g (TNS V1-V3)    4C621950 INACTIVE
       1   160         1727610   SYS        sqlplus@oracle10g (TNS V1-V3)    4C624174 ACTIVE
       1   144         4227641   SCOTT      sqlplus@oracle10g (TNS V1-V3)    4C624730 INACTIVE

二、使用ALTER SYSTEM KILL SESSION命令实现

  法:

SQL> ALTERSYSTEMKILLSESSION'sid,serial#';
SQL> ALTERSYSTEMKILLSESSION'sid,serial#'IMMEDIATE;

RAC境下的kill session ,需要搞清楚需要kill 的session 位于哪个节点,可以查询GV$SESSION视图获得。

kill session仅仅将会话杀掉。在有些候,由于大的事或需要较长SQL将导致需要kill的session不能立即掉。这种情况将收到 "marked for kill"提示(如下),一旦会话当前事或操作完成,该会话被立即掉。

alter system kill session '4730,39171'
*
ERRORat line 1:
ORA-00031: session marked forkill

 在下面的操作中将杀会话146144

 

sys@AUSTIN> altersystemkillsession'146,23';
System altered.

sys@AUSTIN> altersystemkillsession'144,42';
System altered.

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

INST_ID SADDR       SID    SERIAL#  PADDR    USERNAME   STATUS   PROGRAM
------- -------- ------- ---------- -------- ---------- -------- ---------------------------------------------
     14 C70BF04     144         424  C6545A0 SCOTT      KILLED   sqlplus@oracle10g (TNS V1-V3)
     14 C70E6B4     146         234  C6545A0 TEST       KILLED   sqlplus@oracle10g (TNS V1-V3)
     14 C71FC84     160         174  C624174 SYS        ACTIVE   sqlplus@oracle10g (TNS V1-V3)

 注意:在查询中可以看到被掉的会话PADDR地址生了化,查询结果中的色字体。如果多session被kill 掉,session的PADDR被改为相同的程地址

 通过下面的找回被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
    andbitand(ksspaflg,1)!=0;      

    USERNAME   STATUS   ADDR       KSLLAPSC   KSLLAPSN KSLLASPO       KSLLID1R KS D
    ---------- -------- -------- ---------- ---------- ------------ ---------- -- -
               ACTIVE   4C623BB8         99          427468               275 EV 1
               ACTIVE   4C623040          9         2427444                 0    1
               ACTIVE   4C622A84        101          427480               274 EV 1
               ACTIVE   4C6224C8          1         4827450                 0    1
               ACTIVE   4C621F0C          1         4827450                 0    1
               ACTIVE   4C6235FC          2          427468                 0    1
    SYS        ACTIVE   4C624174          2         1527442                 0
               ACTIVE   4C62081C          1         4827440                 0    1
               ACTIVE   4C621394          1         4827440                 0    1
               ACTIVE   4C620DD8         11         2427476                 0    1
               ACTIVE   4C61F6E8         15          427610                 0    1
               ACTIVE   4C620260        222         2427450                 0    1
               ACTIVE   4C61FCA4          7         2527573                 0    1
               ACTIVE   4C61F12C          6         2527573                 0    1
               ACTIVE   4C61EB70          4         2427458                 0    1
               ACTIVE   4C61E5B4          1         4827440                 0    1
               ACTIVE   4C61DFF8          2         2427444                 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 -927573
kill session -927641    

四、会话SID

 

SQL> selectuserenv('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
    wheresidin ('2731','2734','2720','2678','2685')
    and username='CTICUST'
    orderby inst_id;

       INST_ID SADDR                   SID    SERIAL# PADDR            USERNAME           STATUS   PROGRAM
    ---------- ---------------- ---------- ---------- ---------------- ------------------ -------- ---------------------------
             100000003DAF8F870       2678       826500000003DBC6CA08 MSS4USR            INACTIVE JDBC Thin Client
             100000003DAF98E48       2685         8300000003DBC08510 MSS4USR            ACTIVE   JDBC Thin Client
             100000003DAFC7B80       2720          500000003DBBEDA20 MSS4USR            INACTIVE JDBC Thin Client
             100000003DAFD66F8       2731          300000003DBBE9AE0 SYS                ACTIVE  racgimon@svdg0028(TNS V1-V3)
             100000003DAFDA730       2734         1500000003DBBEC268 MSS4USR            INACTIVE JDBC Thin Client
             200000003DAFD66F8       2731          100000003DBBE92F8                    ACTIVE   oracle@svdg0029 (ARC0)  

   上面的查询中有一SID2731的位于2上。

    也可以通下面的方式来获RAC点信息,便于确定需要kill 的session究竟位于个节点。

set linesize 160
col HOST_NAME format a25
SQL> select INSTANCE_NUMBER,INSTANCE_NAME,HOST_NAME,VERSION,STATUS from gv$instance orderby1;

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')
orderby 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 How To:如何快速杀死占用过多资源(CPU,内存)的数据库进程   

  Oracle中Kill session的研究

  Killing Oracle Sessions

 

七、更多

 

有关性能优化请参考

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 还原与恢复

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值