ALTER SYSTEM KILL SESSION 執行後會話變為 KILLED 卻長期不釋放鎖,是 DBA 夜間值班的噩夢。本文提供從 SQL 層到 OS 層的分級強制清理方案。
SELECT o.object_name, s.machine, s.sid, s.serial#
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;
ALTER SYSTEM KILL SESSION 'sid,serial#'; -- 如 '24,111'
可在 Enterprise Manager / SQL Developer 圖形化操作。
現象:會話狀態 KILLED,但鎖未釋放,事務回滾極慢或卡住。
SELECT p.spid, s.osuser, s.program
FROM v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE s.sid = 24; -- 目標 SID
# kill -9 12345 -- SPID
orakill 殺線程orakill SID THREAD_ID
-- 例:C:\> orakill ORCL 12345
SID:實例名 (非會話 SID)THREAD_ID:即 V$PROCESS.SPID (Windows 下為線程 ID)| 場景 | 建議 |
|---|---|
| 大批量 DML | 分批提交,避免單事務超大 |
| 長時間運行報表 | 使用只讀備庫 / ADG,隔離主庫 |
| 應用連接池洩漏 | 配置 INACTIVITY_TIMEOUT、MAX_LIFETIME_SESSION (DRCP) |
| 定期巡檢 | 監控 V$SESSION.STATUS = 'KILLED' 持續 > 10 分鐘者自動告警 |
若單會話阻塞核心業務且上述均無效:
SHUTDOWN ABORT → STARTUP (實例級重啟,最快恢復可用性)