|
【赛迪网-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.
|