教你在Windows環(huán)境下Kill掉Oracle的線程
大家都知道,Windows 2000是一個(gè)基于線程的操作系統(tǒng),而不是象Unix、Linux那樣基于進(jìn)程的操作系統(tǒng)。整個(gè)Oracle的后臺(tái)進(jìn)程、用戶進(jìn)程等,在Windows 2000環(huán)境下,都包含在ORACLE.EXE這單獨(dú)的一個(gè)體系進(jìn)程中了,通過(guò)查看’任務(wù)管理器’――’進(jìn)程’就可以看到。如果你不是使用MTS多線程服務(wù)器的模式,如果你Kill掉ORACLE.EXE這個(gè)進(jìn)程,將導(dǎo)致整個(gè)Oracle實(shí)例關(guān)閉,如同使用Shutdown abort命令一樣。
由于Windows自己沒(méi)有提過(guò)一個(gè)專(zhuān)門(mén)用來(lái)Kill掉單個(gè)線程的工具,因此Oracle從Oracle7.3.3.6開(kāi)始,自己提供了一個(gè)基于字符界面的用來(lái)在Windows環(huán)境下強(qiáng)制Kill掉一個(gè)線程的工具――Orakill。
在NT中如果使用alter system kill session 'sid,serial#'來(lái)清楚會(huì)話,在執(zhí)行之后該會(huì)話的狀態(tài)會(huì)變?yōu)镵ILLED,但是有時(shí)候這個(gè)狀態(tài)會(huì)保持很長(zhǎng)時(shí)間,直到最后被清除。
如果想更快地從內(nèi)存中清理這個(gè)會(huì)話,那么可以在使用了alter system之后,再在NT中使用Orakill實(shí)用程序(該程序隨Oracle數(shù)據(jù)庫(kù)同時(shí)安裝)直接清除該會(huì)話的線程。
Orakill的使用方法如下:
Dos提示符下:>orakill sid thread
說(shuō)明: sid Oracle的Sid號(hào)
thread Oracle的線程id號(hào)
首先取得被殺掉的會(huì)話的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
然后在命令行窗口執(zhí)行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的核心后臺(tái)線程(DBWR, LGWR, SMON or PMON),將導(dǎo)致Oracle實(shí)例關(guān)閉。檢查Oracle的核心后臺(tái)線程的方法如下:
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
查詢結(jié)果如下:
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.
