Chinaunix首页 | 论坛 | 博客
  • 博客访问: 72315
  • 博文数量: 25
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 215
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-08 09:35
文章分类

全部博文(25)

文章存档

2011年(1)

2009年(18)

2008年(6)

我的朋友

分类: Oracle

2009-02-16 09:16:27

1 查询出线程
SELECT p.SPID as THREADID,v.SID as SESSION_ID,v.SERIAL#,v.action Action,v.osuser OSUSER, 
v.process AP_PID,p.SPID DB_PID,p.PROGRAM
from v$session v, V$PROCESS p
where v.paddr = p.addr
  and p.PROGRAM like 'ORACLE.EXE (J%'
 
2、在win上,还可以采用oracle提供的orakill杀掉一个线程
C:>orakill SID THREADID

====================================================================
====================================================================

KILL
 
开启一个会话1:

-- 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>

 

在另一个会话2里,删除该会话:

-- 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
---------- --------
        11 INACTIVE

 

SQL> alter system kill session '11, 141';

 

系统已更改。

 

SQL> select sid, status from v$session where sid =11;

       SID STATUS
---------- --------
        11 KILLED

SQL>

 

先前的会话1再做查询,就会提示该会话已经被删除:

-- 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>

 

此时,在会话2中再次查看会话1的状态,就发现已经没有了:

-- session2

SQL> select sid, status from v$session where sid =11;

 

未选定行

 

SQL>

 

因为会话1被kill掉后,它的状态为kill,而当它试图做某操作时,才会清除会话1信息。
 
那么,如果会话1一直不做任何操作,该会话会一直消耗着资源的。我们需要使用orakill命令,在操作系统级删除该进程。
 
 
 
ORAKILL
 
我们先看看orakill的用法:
 
开启一个会话1:

-- 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
----------------
ora2

 

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>

 
 
 
联合使用KILL与ORAKILL
 
刚才我们看到kill掉的会话还有可能占用资源,很容易想到的办法就是再使用orakill删除已经kill的会话。
使用orakill时需要提供thread的(也就是v$process.spid),这就需要v$session.paddr与v$process.addr相关联。而kill session后,v$session.paddr发生了变化。我们重新看一下kill session时v$session.paddr的变化:
 
开启会话1:

SQL> conn test/test

已连接。

SQL> select distinct sid from v$mystat;

 

       SID

----------

        18

 

SQL>

 

开启会话2:

SQL> conn test/test

已连接。

SQL> select distinct sid from v$mystat;

 

       SID

----------

        16

 

SQL>

 

开启会话3,看看删除会话1和会话2前后v$session.paddr的变化:

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
---------- ---------- -------- --------
        16         18 INACTIVE 681E82BC
        18         49 INACTIVE 681E7EFC

 

SQL> select ADDR, PID, SPID, USERNAME, SERIAL#, TERMINAL

 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>

 

我们看,kill掉会话1和会话2后,它们的v$session.paddr都被改变,而且变成了相同的值,但v$process.addr的值没变。对此,eygle做了个
 
可以求v$process.addr与v$session.paddr之差,来查找需要orakill的进程。不过我的oracle刚启动时就有两个差值了:

 

SQL> select addr from v$process where pid <> 1

  2  minus

  3  select paddr from v$session;

 

ADDR

--------

681E64BC

681E687C

 

SQL>

 

而且orakill掉之后,还会再生成两个新的记录,好像是Oracle自动启动的两个进程。有空再研究一下。
阅读(1023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~