立即释放kill session后仍占用的资源

转自:舒剑辉 查看原文

在oracle中kill一个session采用如下语句:alter system kill session 'sid,serial#' ;
通过以下实验我们发现kill session并没有真正释放资源,还需要我们在OS里kill进程来达到资源的真正释放。
 
SQL> select sid,serial#,paddr,username,status from v$session where username is not null;
       SID    SERIAL# PADDR    USERNAME                       STATUS
---------- ---------- -------- ------------------------------ --------
       145         10 6CE4DDCC SJH                            INACTIVE
       147         21 6CE4E3BC SFX                            INACTIVE
       152         10 6CE4D1EC SYS                            ACTIVE
       158         19 6CE4CBFC SYS                            INACTIVE
SQL> alter system kill session '145,10';
System altered
SQL> alter system kill session '147,21';
System altered
SQL> select sid,serial#,paddr,username,status from v$session where username is not null;
       SID    SERIAL# PADDR    USERNAME                       STATUS
---------- ---------- -------- ------------------------------ --------
       145         10 6CE7F368 SJH                            KILLED
       147         21 6CE7F368 SFX                            KILLED
       152         10 6CE4D1EC SYS                            ACTIVE
       158         19 6CE4CBFC SYS                            INACTIVE
 
--kill session后PADDR这个字段变成一样的了。由于PADDR字段已经改变,我们无法通过v$session和v$process关联来获得 spid(v$session的paddr和v$process的addr字段进行关联)。怎么处理?用进程和session之间的关系处理如下:
 
SQL> select p.addr from v$process p where pid <> 1
  2  minus
  3  select s.paddr from v$session s;
ADDR
--------
6CE4DDCC
6CE4E3BC
 
--ADDR找到了,那进程的spid也就是进程号就找到了。
 
SQL> select ADDR,PID,SPID FROM v$process where addr='6CE4DDCC';
ADDR            PID SPID
-------- ---------- ------------
6CE4DDCC         19 3444
SQL> select ADDR,PID,SPID FROM v$process where addr='6CE4E3BC';
ADDR            PID SPID
-------- ---------- ------------
6CE4E3BC         20 260
 
最后在unix环境用kill -9 spid杀掉进程,在windows环境用orakill sid spid杀掉进程。
 
从上面的实验我们发现oracle只是简单的把相关的session的paddr指向同一个虚拟地址。这样导致v$session和 v$process关联失败,进程中断。oracle使用PMON进程去清理这些session,但等待一个被标记kill的session退出往往很花 时间。实验结束的时候查看session:

SQL> select sid,serial#,paddr,username,status from v$session where username is not null;
       SID    SERIAL# PADDR    USERNAME                       STATUS
---------- ---------- -------- ------------------------------ --------
       142         54 6CE4E9AC SYS                            INACTIVE
       145         10 6CE7F368 SJH                            KILLED
       147         21 6CE7F368 SFX                            KILLED
       152         10 6CE4D1EC SYS                            ACTIVE
       158         19 6CE4CBFC SYS                            INACTIVE
 
--依然还在。但重新在session上执行操作的时候,会被告之ORA-00028: 您的会话己被终止。再次查询:
 
SQL> select sid,serial#,paddr,username,status from v$session where username is not null;
       SID    SERIAL# PADDR    USERNAME                       STATUS
---------- ---------- -------- ------------------------------ --------
       142         54 6CE4E9AC SYS                            INACTIVE
       152         10 6CE4D1EC SYS                            ACTIVE
       158         19 6CE4CBFC SYS                            INACTIVE
 
--session消失了。估计重新执行被kill的process,oracle会立即启动PMON来清除killed的session。实 际上不杀进程,如果在killed的session上执行操作也会告之ORA-00028: 您的会话己被终止。PMON也会去立即清理该session。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21468125/viewspace-609628/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21468125/viewspace-609628/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值