首页 > 数据库 > Oracle > Oracle中Kill session的研究
Oracle中Kill session的研究
参考http://www.eygle.com/faq/Kill_Session.htm
SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
-------- ---------- ---------- -------- ---------- ----------------
29EF8638 139 4 29E214B8 SCOTT INACTIVE
29EFBEA8 142 25 29E21A70 LJG INACTIVE
29EFD178 143 8 29E20F00 SYSTEM INACTIVE
29F0FE78 159 3 29E1E6F8 SYS ACTIVE
记录kill 之前的paddr
SQL> alter system kill session '142,25';
System altered.
SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
-------- ---------- ---------- -------- ---------- ----------------
29EF8638 139 4 29E214B8 SCOTT INACTIVE
29EFBEA8 142 25 29E4FE9C LJG KILLED
29EFD178 143 8 29E20F00 SYSTEM INACTIVE
29F0FE78 159 3 29E1E6F8 SYS ACTIVE
SQL> alter system kill session '139,4';
System altered.
SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
-------- ---------- ---------- -------- ---------- ----------------
29EF8638 139 4 29E4FE9C SCOTT KILLED
29EFBEA8 142 25 29E4FE9C LJG KILLED
29EFD178 143 8 29E20F00 SYSTEM INACTIVE
29F0FE78 159 3 29E1E6F8 SYS ACTIVE
当一个session被kill掉以后,该session的paddr被修改,如果有多个session被kill,那么多个session的paddr都被更改为相同的进程地址。
在这种情况下,很多时候,资源是无法释放的,我们需要查询spid,在操作系统级来kill这些进程.但是由于此时v$session.paddr已经改变,我们无法通过v$session和v$process关联来获得spid
简单的方法可以用V$PROCESS与V$SESSION进行比较,得到SPID。
SQL> select p.addr from v$process p where pid <> 1
2 minus
3 select s.paddr from v$session s;
ADDR
--------
29E214B8
29E21A70
SQL>select spid from v$process where addr in(
select p.addr from v$process p where pid <> 1
minus
select s.paddr from v$session s);
SPID
------
3810
3832
这样就可以找到之前kill掉的session的spid,可以通过OS的kill来杀进程。
[root@linx130 ~]# kill -9 3810
[root@linx130 ~]# kill -9 3832
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/271283/viewspace-1001212/ ,如需转载,请注明出处,否则将追究法律责任。