你遇到過下面類似的情況嗎?一個用戶進程長期占用資源而不釋放
導致Oracle進程占用了系統的大量資源
Oralce系統的效率變得很低
如果簡單的關閉重啟Oracle 實例
勢必影響所有的用戶
有沒有辦法僅僅只Kill掉有問題的用戶進程而不用關閉整個Oralce實例呢?答案是可以的
使用Oralce提供的一個名叫Orakill的工具
大家都知道
Windows
是一個基於線程的操作系統
而不是象Unix
Linux那樣基於進程的操作系統
整個Oracle的後台進程
用戶進程等
在Windows
環境下
都包含在ORACLE
EXE這單獨的一個體系進程中了
通過查看
任務管理器
――
進程
就可以看到
如果你不是使用MTS多線程服務器的模式
如果你Kill掉ORACLE
EXE這個進程
將導致整個Oracle實例關閉
如同使用Shutdown abort命令一樣
由於Windows自己沒有提過一個專門用來Kill掉單個線程的工具
因此Oracle從Oracle
開始
自己提供了一個基於字符界面的用來在Windows環境下強制Kill掉一個線程的工具――Orakill
Orakill的使用方法如下
Dos提示符下:>orakill sid thread
說明
sid Oracle的Sid號
thread Oracle的線程id號
在Sql*plus工具裡面可以查詢到Oracle的線程號
sql:>Select p
spid THREADID
s
osuser
s
program
sql:>From v$process p
v$session s
sql:>Where p
addr = s
addr
結果如下
THREADID OSUSER PROGRAM
SYSTEM ORACLE
EXE
SYSTEM ORACLE
EXE
SYSTEM ORACLE
EXE
SYSTEM ORACLE
EXE
SYSTEM ORACLE
EXE
SYSTEM ORACLE
EXE
SYSTEM ORACLE
EXE
SYSTEM ORACLE
EXE
PROD_NT\djones SVRMGRL
EXE
SSMITH
PC\ssmith SQLPLUSW
EXE
rows selected
需要注意的是
如果你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 <>
and
sql:>vb
paddr = vp
addr and
sql:>vp
addr = vs
paddr
查詢結果如下
NOME PROCESSNAME THREADID SID
PMON ORACLE
EXE
DBW
ORACLE
EXE
LGWR ORACLE
EXE
CKPT ORACLE
EXE
SMON ORACLE
EXE
RECO ORACLE
EXE
SNP
ORACLE
EXE
SNP
ORACLE
EXE
rows selected
From:http://tw.wingwit.com/Article/program/Oracle/201311/18840.html