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

Oracle
Excel VBA连接并操作Oracle
Oracle 外连接实现代码
oracle 存储过程和函数例子
Oracle 数据库操作类
ORACLE 分区表的设计
Oracle 用户权限管理方法
Oracle In和exists not in和not exists的比较分析
利用windows任务计划实现oracle的定期备份
ORACLE11g随RHEL5系统自动启动与关闭的设置方法
在oracle 数据库查询的select 查询字段中关联其他表的方法
plsql和tsql常用函数比对
plsql与tsql的语法不同
ASP.NET调用oracle存储过程实现快速分页
执行drop表操作后数据库无法起动
分析Oracle有时会用索引来查找数据的原因
数据从MySQL迁移到 Oracle的注意事项
快速理解Oracle归档模式的命令及参数
在Oracle里加快SQL执行的三种方法
几条常见的数据库分页 SQL 语句
Oracle9I OCP认证过程

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 133 ::
收藏到网摘: 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.