Oracle的关于session的销毁资源回收问题的解决方案

    xiaoxiao2021-12-14  17

    在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。

    本文来自融心-心灵的旅程(http://hexun.com/weiyingjun/default.html) 详细出处参考:http://weiyingjun.blog.hexun.com/54996653_d.html

    转载请注明原文地址: https://ju.6miu.com/read-964354.html

    最新回复(0)