Oracle中Kill session的研究

原创 2007年09月28日 15:06:00
Oracle中Kill session的研究     CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次。

我们知道,在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  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  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  EYGLE                          KILLED542E2AA4         14        397  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  EYGLE                          KILLED542E2AA4         14        397  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    1USERNAME                       STATUS   ADDR       KSLLAPSC   KSLLAPSN KSLLASPO       KSLLID1R KS D------------------------------ -------- -------- ---------- ---------- ------------ ---------- -- -SYS                            ACTIVE   542B6D38          2          8 24071                 0SYS                            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
--------
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.这被作为一次异常中断处理. 

shell 脚本kill oracle 数据库指定用户

步骤一: 找到指定的用户的session信息,凑出执行脚本: #!/bin/ksh echo "conn sys/sys as sysdba select 'alter system kill ses...
  • yanenshun
  • yanenshun
  • 2016年12月22日 09:01
  • 356

oracle查看已经kill掉了session,但没有被kill的process

select * from v$process p where p.ADDR not in (select b.paddr from v$bgprocess b)   and p.ADDR not i...
  • fycghy0803
  • fycghy0803
  • 2013年11月20日 16:28
  • 775

Oracle 批量解除锁定,kill session。

拼接语句:SELECT 'alter system kill session '''||SID || ',' || SERIAL#||''';' FROM V$SESSION WHERE S...
  • yuanboshe
  • yuanboshe
  • 2011年04月22日 17:14
  • 599

关于oracle被锁kill_session问题

开锁select object_id,session_id,locked_mode from v$locked_object;--查看数据库锁 select b.OWNER ,b.OBJECT_NAM...
  • tlcjbl
  • tlcjbl
  • 2016年09月27日 11:16
  • 878

关于oracle的锁表解决session marked for kill

1.查询哪些对象被锁:     select object_name,machine,s.sid,s.serial#     from v$locked_object l,dba_objects ...
  • wxlbrxhb
  • wxlbrxhb
  • 2014年09月06日 11:58
  • 1484

【转】ORACLE快速彻底Kill掉的会话

在ORACLE数据库当中,有时候会使用ALTER SYSTEM KILL SESSION 'sid,serial#'杀掉一个会话进程,但是使用这个SQL语句杀掉会话后,数据库并不会立即释放掉相关的资源...
  • shcqupc
  • shcqupc
  • 2016年03月14日 20:55
  • 578

ORA-00031: session marked for kill 处理Oracle中杀不掉的锁

ORA-00031: session marked for kill 处理Oracle中杀不掉的锁2008-01-04 11:19 ...
  • terryhuang
  • terryhuang
  • 2008年07月07日 20:02
  • 26474

Kill session 和orakill 杀会话及进程总结

一个用户进程偶尔会挂起或占用过多资源而拒绝其它会话。如果DBA依然能够访问数据库,她通常可以发出以下查询: select s.username, s.osuser, s.sid, s.serial#...
  • tonyzhou_cn
  • tonyzhou_cn
  • 2013年04月28日 13:28
  • 1405

oracle alter kill和alter kill immediate会话的区别

一般情况下,在杀一个会话的时候,直接执行alter system kill session ‘sid,serial#’;Administrator's Guide说,当session是active的时...
  • wenzhongyan
  • wenzhongyan
  • 2015年10月28日 17:19
  • 2396

RAC环境kill session

在RAC环境下,如果想kill掉一个session,可能会遇到这个session并不在你登陆的机器上,导致报错:session不存在,这个时候有2 个办法解决: 1.如果是11g之前的版本,可以修...
  • qinyu100
  • qinyu100
  • 2014年01月05日 13:53
  • 1031
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle中Kill session的研究
举报原因:
原因补充:

(最多只允许输入30个字)