Windows 架構下,Oracle 所有背景與前景進程皆運行於單一 ORACLE.EXE 進程內,以執行緒區分。若某使用者 Session 跑離控制(如失控查詢、死鎖持有鎖),在任務管理員強制結束 ORACLE.EXE 等同 SHUTDOWN ABORT,所有使用者斷線。此時需要精準「斬殺」單一執行緒的工具 —— ORAKILL。
%ORACLE_HOME%\bin\orakill.exe。ALTER SYSTEM KILL SESSION:後者僅標記 Session 為 KILLED,實際清理需等待 PMON,耗時不可控;ORAKILL 立即從作業系統層面回收資源。SET PAGESIZE 100 LINESIZE 150
COLUMN program FORMAT A30
COLUMN osuser FORMAT A15
SELECT s.sid, s.serial#, p.spid AS thread_id,
s.osuser, s.program, s.status, s.logon_time
FROM v$process p, v$session s
WHERE p.addr = s.paddr
ORDER BY s.sid;
輸出範例:
SID SERIAL# THREAD_ID OSUSER PROGRAM STATUS
--- ------- --------- ------- ----------------- ------
10 809 102 User01 Prog.exe ACTIVE
15 719 422 User01 Prge.exe INACTIVE
20 345 123 SeUs Acco.exe KILLED
記下目標 Session 的 THREAD_ID (SPID),如 102。
開啟 CMD (需具備 Oracle 安裝擁有者或 Administrators 權限):
C:\> orakill ORCL 102
ORCL:目標資料庫 SID (對應 ORACLE_SID 環境變數)。102:步驟 1 取得的 SPID。重新查詢 V$SESSION,目標 SID 應已消失;作業系統層面對應執行緒已回收。
殺掉 DBWR、LGWR、SMON、PMON、CKPT、RECO 等核心背景執行緒會導致實例立即崩潰。查詢核心背景執行緒 SPID:
SELECT vb.name, vp.program, vp.spid AS thread_id, vs.sid
FROM v$bgprocess vb, v$process vp, v$session vs
WHERE vb.paddr = vp.addr
AND vp.addr = vs.paddr
AND vb.addr != '00';
輸出範例:
NAME PROGRAM THREAD_ID 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
鐵律:執行 ORAKILL 前,務必交叉比對 SPID 不在上述清單中。
ALTER SYSTEM KILL SESSION。ORAKILL 是 Windows 版 Oracle DBA 的「手術刀」,能精準切除病灶而不傷及全身。掌握 V$PROCESS.SPID 定位與核心背景進程排除兩大核心技能,即可在生產環境從容應對 Session 失控危機,將影響範圍縮至單一使用者。