选择显示字体大小

oracle中kill session的研究

我们知道,在oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为:
alter system kill session ’sid,serial#’ ; 
 
被kill掉的session,状态会被标记为killed,oracle会在该用户下一次touch时清除该进程.

我们发现当一个session被kill掉以后,该session的paddr被修改,如果有多个session被kill,那么多个session的paddr都被更改为相同的进程地址:
sql> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

saddr           sid    serial# paddr    username                       status
-------- ---------- ---------- -------- ------------------------------ --------
542e0e6c         11        314 542b70e8 eygle                          inactive
542e5044         18        662 542b6d38 sys                            active


sql> alter system kill session ’11,314’;

system altered.

sql> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

saddr           sid    serial# paddr    username                       status
-------- ---------- ---------- -------- ------------------------------ --------
542e0e6c         11        314 542d6bd4 eygle                          killed
542e5044         18        662 542b6d38 sys                            active


sql> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

saddr           sid    serial# paddr    username                       status
-------- ---------- ---------- -------- ------------------------------ --------
542e0e6c         11        314 542d6bd4 eygle                          killed
542e2aa4         14        397 542b7498 eqsp                           inactive
542e5044         18        662 542b6d38 sys                            active

sql> alter system kill session ’14,397’;

system altered.

sql> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

saddr           sid    serial# paddr    username                       status
-------- ---------- ---------- -------- ------------------------------ --------
542e0e6c         11        314 542d6bd4 eygle                          killed
542e2aa4         14        397 542d6bd4 eqsp                           killed
542e5044         18        662 542b6d38 sys                            active


在这种情况下,很多时候,资源是无法释放的,我们需要查询spid,在操作系统级来kill这些进程.但是由于此时v$session.paddr已经改变,我们无法通过v$session和v$process关联来获得spid那还可以怎么办呢?
我们来看一下下面的查询:
  sql> select s.username,s.status,
  2  x.addr,x.ksllapsc,x.ksllapsn,x.ksllaspo,x.ksllid1r,x.ksllrtyp,
  3  decode(bitand (x.ksuprflg,2),0,null,1)
  4  from x$ksupr x,v$session s
  5  where s.paddr(+)=x.addr
  6  and bitand(ksspaflg,1)!=0;


username                       status   addr       ksllapsc   ksllapsn ksllaspo       ksllid1r ks d
------------------------------ -------- -------- ---------- ---------- ------------ ---------- -- -
                                        542b44a8          0          0                       0
                               active   542b4858          1         14 24069                 0    1
                               active   542b4c08         26         16 15901                 0    1
                               active   542b4fb8          7         46 24083                 0    1
                               active   542b5368         12         15 24081                 0    1
                               active   542b5718         15         46 24083                 0    1
                               active   542b5ac8         79          4 15923                 0    1
                               active   542b5e78         50         16 24085                 0    1
                               active   542b6228        754         15 24081                 0    1
                               active   542b65d8          1         14 24069                 0    1
                               active   542b6988          2         30 14571                 0    1

username                       status   addr       ksllapsc   ksllapsn ksllaspo       ksllid1r ks d
------------------------------ -------- -------- ---------- ---------- ------------ ---------- -- -
sys                            active   542b6d38          2          8 24071                 0
                                        542b70e8          1         15 24081               195 ev
                                        542b7498          1         15 24081               195 ev
sys                            inactive 542b7848          0          0                       0
sys                            inactive 542b7bf8          1         15 24081               195 ev

16 rows selected.

 
我们注意,红字标出的部分就是被kill掉的进程的进程地址.

简化一点,其实就是如下概念:
sql> select p.addr from v$process p where pid <> 1 2 minus 3 select s.paddr from v$session s;
addr
--------
542b70e8
542b7498
 

ok,现在我们获得了进程地址,就可以在v$process中找到spid,然后可以使用kill或者orakill在系统级来杀掉这些进程.实际上,我猜测:当在oracle中kill session以后, oracle只是简单的把相关session的paddr 指向同一个虚拟地址.此时v$process和v$session失去关联,进程就此中断.然后oracle就等待pmon去清除这些session.所以通常等待一个被标记为killed的session退出需要花费很长的时间.如果此时被kill的process,重新尝试执行任务,那么马上会收到进程中断的提示,process退出,此时oracle会立即启动pmon来清除该session.这被作为一次异常中断处理.


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons