当前位置: 首页 > 图文教程 > 数据库 > Oracle > 浅谈在Windows环境下Kill掉Oracle的线程

Oracle
常见的一些Oracle初学者的问题
ORACLE认证系统概述
数据库考试简介:Oracle认证
Oracle认证基础知识介绍
ADO连接Oracle Access示例及记录集处理源码
SQL Server和MySQL的安全性分析
用Oracle和SQL Server数据库组合利弊分析
Oracle 11g分区功能新革命
Flashback Query 恢复误删除的数据
基于Oracle高性能动态SQL程序开发
怎样在Oracle 9i中正确的转换时区
Oracle 10g导出的数据库能否导入Oracle 9i?
增加Distinct后查询效率反而提高
Oracle限制返回结果集的大小
Java语言数据库操作的基本流程
美国甲骨文(ORACLE)公司入驻渝中区大都会商厦
RHEL AS4上安装oracle 10R2 的方法
DB中如何查询Table占用空间的大小
编写高质量高性能的MySQL语法
Oracle数据库自动备份的具体实现步骤

浅谈在Windows环境下Kill掉Oracle的线程


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 122 ::
收藏到网摘: n/a

 你遇到过下面类似的情况吗?一个用户进程长期占用资源而不释放,导致Oracle进程占用了系统的大量资源,Oralce系统的效率变得很低。如果简单的关闭重启Oracle 实例,势必影响所有的用户。有没有办法仅仅只Kill掉有问题的用户进程而不用关闭整个Oralce实例呢?答案是可以的,使用Oralce提供的一个名叫Orakill的工具。

  大家都知道,Windows 2000是一个基于线程的操作系统,而不是象Unix、Linux那样基于进程的操作系统。整个Oracle的后台进程、用户进程等,在Windows 2000环境下,都包含在ORACLE.EXE这单独的一个体系进程中了,通过查看’任务管理器’――’进程’就可以看到。如果你不是使用MTS多线程服务器的模式,如果你Kill掉ORACLE.EXE这个进程,将导致整个Oracle实例关闭,如同使用Shutdown abort命令一样。

  由于Windows自己没有提过一个专门用来Kill掉单个线程的工具,因此Oracle从Oracle7.3.3.6开始,自己提供了一个基于字符界面的用来在Windows环境下强制Kill掉一个线程的工具――Orakill。

  在NT中如果使用alter system kill session 'sid,serial#'来清楚会话,在执行之后该会话的状态会变为KILLED,但是有时候这个状态会保持很长时间,直到最后被清除。

  如果想更快地从内存中清理这个会话,那么可以在使用了alter system之后,再在NT中使用Orakill实用程序(该程序随Oracle数据库同时安装)直接清除该会话的线程。

  Orakill的使用方法如下:

  Dos提示符下:>orakill sid thread

  说明: sid Oracle的Sid号

  thread Oracle的线程id号

  首先取得被杀掉的会话的Thread Number:


  SET pagesize 100
  SET linesize 100
  COLUMN Program format a20
  SELECT s.sid AS "Sid", s.serial# AS "Serial#", p.spid AS "ThreadID",
  s.osuser
  AS "OSUser", s.program AS "Program"
  FROM v$process p, v$session s
  WHERE p.addr = s.paddr(+)
  ORDER BY s.sid

  输出可能如下:


  Sid Serial# ThreadID OSUser Program
  --- ------- -------- ------ -------
  ...
  10 809 102 User01 Prog.exe
  11 345 333 SeUser App.exe
  15 719 422 User01 Prge.exe
  20 345 123 SeUs Acco.exe
  555
  324

然后在命令行窗口执行Orakill命令

  例:orakill ORCL 555

  orakill ORCL 324

  orakill的命令帮助如下:


  C:>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;

  需要注意的是,如果你Kill掉的是Oracle的核心后台线程(DBWR, LGWR, SMON or PMON),将导致Oracle实例关闭。检查Oracle的核心后台线程的方法如下:


  sql:>Select vb.name NOME, vp.programe PROCESSNAME, vp.spid THREADID, vs,sid SID
  sql:>From v$session vs, v$process vp, v$bgprocess vb
  sql:>Where vb.addr <> ‘00’ and
  sql:>vb.paddr = vp.addr and
  sql:>vp.addr = vs.paddr

  查询结果如下:


  NOME PROCESSNAME THREADID SID
  ----- ----------------------------------- --------- ------
  PMON ORACLE.EXE 169 1
  DBW0 ORACLE.EXE 215 2
  LGWR ORACLE.EXE 280 3
  CKPT ORACLE.EXE 267 4
  SMON ORACLE.EXE 287 5
  RECO ORACLE.EXE 288 6
  SNP0 ORACLE.EXE 271 7
  SNP1 ORACLE.EXE 282 8
  8 rows selected.