遭遇 ALTER SYSTEM KILL SESSION 執行後狀態顯示 KILLED 卻長時間不釋放鎖?需進階至作業系統層強制終止影子進程/執行緒。本文提供四步驟標準處理流程,涵蓋 Unix/Linux kill -9 與 Windows ORAKILL 實戰指令。
SELECT o.object_name,
s.sid, s.serial#,
s.username, s.osuser, s.machine, s.program, s.logon_time
FROM v$locked_object l
JOIN dba_objects o ON l.object_id = o.object_id
JOIN v$session s ON l.session_id = s.sid;
記錄 SID、SERIAL#、OSUSER、MACHINE、PROGRAM。
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
IMMEDIATE(10g+):立即回滾、釋放鎖、斷開連線,不等待客戶端確認。IMMEDIATE,Session 狀態變 KILLED,需等客戶端下一條指令才真正釋放資源。SELECT p.spid, s.osuser, s.program
FROM v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE s.sid = :target_sid;
記錄 SPID(Linux/Unix 為 PID,Windows 為執行緒 ID)。
| 平台 | 指令 | 說明 |
|---|---|---|
| Linux/Unix | kill -9 | 需 root 或 oracle OS 權限;-9 為 SIGKILL,不可被捕獲/忽略 |
| Windows | ORAKILL | ORAKILL.EXE 位於 %ORACLE_HOME%\BIN; |
C:\> orakill ORCL 12345
-- 12345 為 v$process.spid 對應的執行緒 ID
GV$SESSION.INST_ID 不同,需登入該節點執行 ORAKILL/kill。SRVCTL STOP INSTANCE -d -i -o IMMEDIATE 強制關閉整個實例(極端手段)。VALIDATE CONNECTION、IDLE TIMEOUT,避免殭屍 Session。SQLNET.EXPIRE_TIME=10(sqlnet.ora),偵測斷線客戶端並自動清理。V$SESSION.STATUS='KILLED' 超過 5 分鐘者,自動升級至 OS KILL。ALTER SYSTEM KILL SESSION IMMEDIATE → 可能導致資料檔不一致、需執行個體恢復。oracle.exe 主進程 → 會摧毀整個實例,所有 Session 全斷。建立「資料庫層優先、OS 層補充、監控自動化」三層防線,徹底解決「殺不掉的鎖」難題,保障核心業務連續運行。