一、实战部分
-- session1 SQL> conn test/test 已连接。 SQL> select distinct sid from v$mystat;
SID ---------- 11
SQL> select sid, serial# from v$session where sid=11;
SID SERIAL# ---------- ---------- 11 141
SQL> |
-- session2 SQL> conn test/test 已连接。 SQL> select distinct sid from v$mystat;
SID ---------- 17
SQL> select sid, status from v$session where sid =11; SID STATUS
SQL> alter system kill session '11, 141';
系统已更改。
SQL> select sid, status from v$session where sid =11; SID STATUS SQL> |
-- session1 SQL> select sid, serial# from v$session where sid=11; select sid, serial# from v$session where sid=11 * ERROR 位于第 1 行: ORA-00028: 您的会话己被删去
SQL> |
-- session2 SQL> select sid, status from v$session where sid =11;
未选定行
SQL> |
-- session1 C:\Documents and Settings\YUECHAOTIAN>set oracle_sid=ora2
C:\Documents and Settings\YUECHAOTIAN>sqlplus
SQL*Plus: Release 9.2.0.1.0 - Production on 星期一 4月 14 11:37:04 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
请输入用户名: yuechaotian/test
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.1.0 - Production
SQL> select distinct sid from v$mystat;
SID ---------- 11
SQL> |
我要在另一个会话2里,删除会话1:
-- session2 SQL> conn yuechaotian/test 已连接。 SQL> select distinct sid from v$mystat;
SID ---------- 17
SQL> host Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\YUECHAOTIAN>orakill
Usage: orakill sid thread
where sid = the Oracle instance to target thread = the thread id of the thread to kill
The thread id should be retrieved from the spid column of a query such as:
select spid, osuser, s.program from v$process p, v$session s where p.addr=s.paddr
C:\Documents and Settings\YUECHAOTIAN>exit
SQL> set pagesize 100 SQL> set linesize 1000 SQL> select s.sid, spid, osuser, s.program from 2 v$process p, v$session s where p.addr=s.paddr;
SID SPID OSUSER PROGRAM ---- ------- ------------------- ----------- 1 3636 SYSTEM ORACLE.EXE 2 3444 SYSTEM ORACLE.EXE 3 3496 SYSTEM ORACLE.EXE 4 3100 SYSTEM ORACLE.EXE 5 2460 SYSTEM ORACLE.EXE 6 296 SYSTEM ORACLE.EXE 7 696 SYSTEM ORACLE.EXE 8 1820 SYSTEM ORACLE.EXE 9 2912 SYSTEM ORACLE.EXE 10 3212 SYSTEM ORACLE.EXE 11 3412 YUECHAOTIAN\tianyc sqlplus.exe 17 3536 YUECHAOTIAN\tianyc sqlplus.exe
已选择12行。
SQL> select instance_name from v$instance; INSTANCE_NAME
SQL> host Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\YUECHAOTIAN>orakill ora2 3412
Kill of thread id 3412 in instance ora2 successfully signalled.
C:\Documents and Settings\YUECHAOTIAN>exit
SQL> select sid from v$session where sid=11;
未选定行
SQL> |
SQL> conn test/test 已连接。 SQL> select distinct sid from v$mystat;
SID ---------- 18
SQL> |
SQL> conn test/test 已连接。 SQL> select distinct sid from v$mystat;
SID ---------- 16
SQL> |
SQL> conn test/test 已连接。 SQL> select distinct sid from v$mystat;
SID ---------- 11
SQL> select sid, serial#, status, paddr from v$session where sid in(16, 18); SID SERIAL# STATUS PADDR
SQL> select ADDR, PID, SPID, USERNAME, SERIAL#, TERMINAL 2 from v$process where addr in('681E82BC','681E7EFC');
ADDR PID SPID USERNAME SERIAL# TERMINAL -------- ---- ------ --------- ---------- ----------- 681E7EFC 17 324 SYSTEM 2 YUECHAOTIAN 681E82BC 18 3120 SYSTEM 1 YUECHAOTIAN
SQL> alter system kill session '16,18';
系统已更改。
SQL> alter system kill session '18,49';
系统已更改。
SQL> select sid, serial#, status, paddr from v$session where sid in(16, 18);
SID SERIAL# STATUS PADDR ---------- ---------- -------- -------- 16 18 KILLED 682071D0 18 49 KILLED 682071D0
SQL> select ADDR, PID, SPID, USERNAME, SERIAL#, TERMINAL 2 from v$process where addr in('681E82BC','681E7EFC');
ADDR PID SPID USERNAME SERIAL# TERMINAL -------- ------- ------- --------- ---------- ----------- 681E7EFC 17 324 SYSTEM 2 YUECHAOTIAN 681E82BC 18 3120 SYSTEM 1 YUECHAOTIAN
SQL> |
SQL> select addr from v$process where pid <> 1 2 minus 3 select paddr from v$session;
ADDR -------- 681E64BC 681E687C
SQL> |
二、引用eygle文章部分
转载:http://www.eygle.com/faq/Kill_Session.htm
我们知道,在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; |
在这种情况下,很多时候,资源是无法释放的,我们需要查询spid,在操作系统级来kill这些进程.
但是由于此时v$session.paddr已经改变,我们无法通过v$session和v$process关联来获得spid
那还可以怎么办呢?
我们来看一下下面的查询:
SQL> SELECT s.username,s.status,
|
我们注意,红字标出的部分就是被Kill掉的进程的进程地址.
简化一点,其实就是如下概念:
SQL> select p.addr from v$process p where pid <> 1 ADDR
|
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.这被作为一次异常中断处理.
-The End-
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/95233/viewspace-604236/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/95233/viewspace-604236/