Oracle中Kill session的研究

18363058955

18363058955

2016-02-19 19:46

下面图老师小编要跟大家分享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             INACTIVE542E5044     18    662 542B6D38 SYS              ACTIVESQL 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             KILLED542E5044     18    662 542B6D38 SYS              ACTIVESQL 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             KILLED542E2AA4     14    397 542B7498 EQSP              INACTIVE542E5044     18    662 542B6D38 SYS              ACTIVESQL 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             KILLED542E2AA4     14    397 542D6BD4 EQSP              KILLED542E5044     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         0542B70E8     1     15 24081        195 EV                    542B7498     1     15 24081        195 EVSYS              INACTIVE 542B7848     0     0  0SYS              INACTIVE 542B7BF8     1     15 24081        195 EV16 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--------542B70E8542B7498
  
  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.这被作为一次异常中断处理.
展开更多 50%)
分享

猜你喜欢

Oracle中Kill session的研究

编程语言 网络编程
Oracle中Kill session的研究

深入研究Application和Session对象

ASP
深入研究Application和Session对象

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

PHP中Session的概念

PHP
PHP中Session的概念

2.3 深入研究Application和Session对象

Web开发
2.3 深入研究Application和Session对象

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

深入研究Application和Session对象(1)

ASP
深入研究Application和Session对象(1)

深入研究Application和Session对象(2)

ASP
深入研究Application和Session对象(2)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

优化Oracle网络设置

优化Oracle网络设置

网页布局中CSS的Class灵活应用

网页布局中CSS的Class灵活应用
下拉加载更多内容 ↓