oracle快速彻底kill掉的会话,Oracle 彻底 kill session-Oracle之路

kill session 是DBA经常碰到的事情之一。如果kill 掉了不该kill 的session,则具有破坏性,因此尽可能的避免这样的错误发生。同时也应当注意,

如果kill 的session属于Oracle 后台进程,则容易导致数据库实例宕机。

通常情况下,并不需要从操作系统级别杀掉Oracle会话进程,但并非总是如此,下面的描述中给出了在Oracle级别杀掉会话以及操作系统级别杀掉进程。

一、获得需要kill session的信息(使用V$SESSION 和 GV$SESSION视图)

SET LINESIZE 180

COLUMN spid FORMAT A10

COLUMN username FORMAT A10

COLUMN program FORMAT A40

SELECT s.inst_id,

s.sid,

s.serial#,

p.spid,

s.username,

s.program,

s.paddr,

s.STATUS

FROM   gv$session s

JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id

WHERE  s.type != 'BACKGROUND';

INST_ID        SID    SERIAL# SPID       USERNAME   PROGRAM                                       PADDR    STATUS

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

1        146         23 27573      TEST       sqlplus@oracle10g (TNS V1-V3)                 4C621950 INACTIVE

1        160         17 27610      SYS        sqlplus@oracle10g (TNS V1-V3)                 4C624174 ACTIVE

1        144         42 27641      SCOTT      sqlplus@oracle10g (TNS V1-V3)                 4C624730 INACTIVE

二、使用ALTER SYSTEM KILL SESSION 命令实现

语法:

SQL>>

SQL>>  对于RAC环境下的kill session ,需要搞清楚需要kill 的session 位于哪个节点,可以查询GV$SESSION视图获得。

kill session 的时候仅仅是将会话杀掉。在有些时候,由于较大的事务或需要运行较长的SQL语句将导致需要kill的session并不能立即杀掉。对于这种情

况将收到 "marked for kill"提示(如下),一旦会话当前事务或操作完成,该会话被立即杀掉。

alter system kill session '4730,39171'

*

ERROR at line 1:

ORA-00031: session marked for kill

在下面的操作中将杀掉会话146,144

sys@AUSTIN>>

System>

sys@AUSTIN>>

System>  sys@AUSTIN> select inst_id,saddr,sid,serial#,paddr,username,status,program from gv$session where username is not null;

INST_ID SADDR           SID    SERIAL# PADDR    USERNAME   STATUS   PROGRAM

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

1 4C70BF04        144         42 4C6545A0 SCOTT      KILLED   sqlplus@oracle10g (TNS V1-V3)

1 4C70E6B4        146         23 4C6545A0 TEST       KILLED   sqlplus@oracle10g (TNS V1-V3)

1 4C71FC84        160         17 4C624174 SYS        ACTIVE   sqlplus@oracle10g (TNS V1-V3)

注意:在查询中可以看到被杀掉的会话的PADDR地址发生了变化,参照查询结果中的红色字体。如果多个session被kill 掉,则多个session的PADDR

被改为相同的进程地址。

通过下面的语句来找回被kill 掉的ADDR先前的地址

SELECT s.username,s.status,

x.ADDR,x.KSLLAPSC,x.KSLLAPSN,x.KSLLASPO,x.KSLLID1R,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;

USERNAME   STATUS   ADDR       KSLLAPSC   KSLLAPSN KSLLASPO       KSLLID1R KS D

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

ACTIVE   4C623BB8         99          4 27468               275 EV 1

ACTIVE   4C623040          9         24 27444                 0    1

ACTIVE   4C622A84        101          4 27480               274 EV 1

ACTIVE   4C6224C8          1         48 27450                 0    1

ACTIVE   4C621F0C          1         48 27450                 0    1

ACTIVE   4C6235FC          2          4 27468                 0    1

SYS        ACTIVE   4C624174          2         15 27442                 0

ACTIVE   4C62081C          1         48 27440                 0    1

ACTIVE   4C621394          1         48 27440                 0    1

ACTIVE   4C620DD8         11         24 27476                 0    1

ACTIVE   4C61F6E8         15          4 27610                 0    1

ACTIVE   4C620260        222         24 27450                 0    1

ACTIVE   4C61FCA4          7         25 27573                 0    1

ACTIVE   4C61F12C          6         25 27573                 0    1

ACTIVE   4C61EB70          4         24 27458                 0    1

ACTIVE   4C61E5B4          1         48 27440                 0    1

ACTIVE   4C61DFF8          2         24 27444                 0    1

4C624730          0          0                       0

4C621950          0          0                       0

4C61DA3C          0          0                       0

或者根据下面的语句来获得发生变化的addr

sys@AUSTIN> select p.addr from v$process p where pid  1

2  minus

3  select s.paddr from v$session s;

ADDR

--------

4C621950

4C624730

三、在操作系统级别杀掉会话

寻找会话对应的操作系统的进程ID

sys@AUSTIN> select SPID from  v$process where ADDR in ('4C621950','4C624730') ;

SPID

----------

27573

27641

使用kill 命令来杀掉操作系统级别进程ID

kill session -9 27573

kill session -9 27641

四、获得当前会话的SID

SQL> select userenv('sid') from dual;

USERENV('SID')

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

627

五、多个会话需要kill 的处理办法

1.根据给定的SID(用户名)查找需要杀掉会话的信息,包括位于哪一个实例

set linesize 160

col program format a35

col username format a18

select inst_id,saddr,sid,serial#,paddr,username,status,program from gv$session

where sid in ('2731','2734','2720','2678','2685')

and username='CTICUST'

order by inst_id;

INST_ID SADDR                   SID    SERIAL# PADDR            USERNAME           STATUS   PROGRAM

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

1 00000003DAF8F870       2678       8265 00000003DBC6CA08 MSS4USR            INACTIVE JDBC Thin Client

1 00000003DAF98E48       2685         83 00000003DBC08510 MSS4USR            ACTIVE   JDBC Thin Client

1 00000003DAFC7B80       2720          5 00000003DBBEDA20 MSS4USR            INACTIVE JDBC Thin Client

1 00000003DAFD66F8       2731          3 00000003DBBE9AE0 SYS                ACTIVE  racgimon@svdg0028(TNS V1-V3)

1 00000003DAFDA730       2734         15 00000003DBBEC268 MSS4USR            INACTIVE JDBC Thin Client

2 00000003DAFD66F8       2731          1 00000003DBBE92F8                    ACTIVE   oracle@svdg0029 (ARC0)

上面的查询中有一个SID为2731的位于节点2上。

也可以通过下面的方式来获得RAC的节点信息,便于确定需要kill 的session究竟位于哪一个节点。

set linesize 160

col HOST_NAME format a25

SQL> select INSTANCE_NUMBER,INSTANCE_NAME,HOST_NAME,VERSION,STATUS from gv$instance order by 1;

INSTANCE_NUMBER INSTANCE_NAME    HOST_NAME                 VERSION           STATUS

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

1 O02WMT1A         svd0051                  10.2.0.4.0        OPEN

2 O02WMT1B         svd0052                  10.2.0.4.0        OPEN

3 O02WMT1C         svd0053                  10.2.0.4.0        OPEN

2.使用下面查询来生成kill session 的语句

select 'alter system kill session '''|| sid ||',' ||SERIAL# ||''''||';'  from  gv$session

where sid in ('2731','2734','2720','2678','2685')

order by inst_id;

获得下列kill session的语句,根据要求由于此次需要杀掉的session全部位于节点1,因此登录到节点节点1执行下面的语句

alter system kill session '2678,8265';

alter system kill session '2685,83';

alter system kill session '2720,5';

alter system kill session '2731,3';

alter system kill session '2734,15';

alter system kill session '2731,1';    --此条命令不需要执行,该session位于节点2。

oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值