服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 数据库技术 > Oracle技术 > Oracle开发 > 查看文档

教你在windows环境下kill掉oracle的线程

【赛迪网-it技术报道】你遇到过下面类似的情况吗?一个用户进程长期占用资源而不释放,导致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.

扫描关注微信公众号