Oracle_Kill_Session_终极篇

GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
https://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=1600

Oracle Kill Session 终极篇

环境:

         NLSRTL                                                                              10.2.0.2.0         Production

Oracle Database 10g Enterprise Edition        10.2.0.2.0         64bi

PL/SQL                                                                               10.2.0.2.0         Production

TNS for IBM/AIX RISC System/6000:               10.2.0.2.0         Productio

问题/解决:

         在用Toad 使用sys as dba用户登录,kill oracle session时,发现有一些session并杀不掉于是用命令行进行杀。

用于查找有所有session的语句:

select sid,serial#,username,status from v$session where status!='KILLED' and username is not null;

kill session的语句:

         Alter system kill session ‘sid,serial#’;

Kill session后,需要等待一段时间,执行以下语句,看看是否有还有没有杀掉的进程:

select sid,serial#,username,status from v$session where status ='KILLED';

发现过了1个小时,还有以下四个进程并没有被杀掉,于是就需要强行杀掉该进程了。

       SID    SERIAL# USERNAME                       STATUS 

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

      1047        355 SYMBOLS                        KILLED 

      1059       1599 SYMBOLS                        KILLED 

      1103          1 SYS                            KILLED 

      1104          2 SYS                            KILLED 

执行以下语句,此语句是为了获得进程地址:

select * from (select s.username,s.serial#,s.sid,s.status,x.addr,x.ksllapsc,x.ksllapsn,x.ksllaspo,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) a,(select p.addr from v$process p where pid <> 1

 minus

select s.paddr from v$session s where s.status='KILLED') b where a.addr = b.addr;

结果如图所示:

可以看到如上图所示,此处username、serial#、sid、status均为空的则是我们需要的已经被Killed的,我们可以通过此处的地址,在v$process中找到spid也就是我们需要杀的进程,下面没行后面跟的数字就是我查到的spid。

select spid from v$process where addr ='070000004F7BDE78'; 2597048

select spid from v$process where addr ='070000004F7B9798'; 2609252

select spid from v$process where addr ='070000004F79C6F8'; 463032

select spid from v$process where addr ='070000004F79CED8'; 352444

select spid from v$process where addr ='070000004F7A0DD8'; 1142874

select spid from v$process where addr ='070000004F7BA758'; 1519700

select spid from v$process where addr ='070000004F7A05F8'; 1261676

这里有一个问题,就是我们上面在被killed的session只有4个,而这里却有7个,于是,我们需要在服务器上面查找相关的进程,如下图所示:

我发现在查找7个进程的时候,有4个后面明显带有f10001003ac24a0之类的地址,也就是f1000开头的,于是就kill掉这4个进程,在察看数据库中果然好了,哈哈。

GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
https://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=1600

原文地址:https://www.cnblogs.com/cnsend/p/15113487.html