資料庫鎖定是並發控制的必然產物,但長時間阻塞會導致業務雪崩。本文提供從告警發現、鎖定鏈追蹤、會話終止到作業系統層面強制清理的標準化處理流程,並強調 RAC 環境下的跨節點診斷要點。
Enterprise Manager / Cloud Control 將持久阻塞寫入此視圖,可直接查詢:
SELECT * FROM dba_outstanding_alerts
WHERE message_type = 'BLOCKING_SESSION';
輸出包含 SESSION_ID、SERIAL#、阻塞持續時間、影響物件等關鍵資訊。
SELECT lo.object_id, o.object_name, o.object_type,
lo.session_id, lo.locked_mode, lo.oracle_username, lo.os_user_name
FROM v$locked_object lo
JOIN dba_objects o ON lo.object_id = o.object_id
ORDER BY lo.session_id;
locked_mode 解碼:0=None, 1=Null, 2=Row-S (SS), 3=Row-X (SX), 4=Share, 5=S/Row-X (SSX), 6=Exclusive (X)。
SELECT s.sid, s.serial#, s.username, s.status, s.osuser, s.machine, s.program,
l.type, l.lmode, l.request, l.id1, l.id2
FROM v$session s
JOIN v$lock l ON s.sid = l.sid
WHERE l.id1 = (SELECT object_id FROM dba_objects WHERE object_name = UPPER('YOUR_TABLE'))
AND l.type IN ('TM','TX');
-- GV$ 視圖自動聚合所有節點
SELECT inst_id, sid, serial#, username, status, blocking_session, blocking_instance
FROM gv$session
WHERE blocking_session IS NOT NULL
ORDER BY inst_id, blocking_session;
關鍵:BLOCKING_INSTANCE 指出阻塞源頭節點,避免在錯誤節點殺會話。
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
IMMEDIATE:立即回滾未提交事務、釋放鎖、標記會話為 KILLED,客戶端收到 ORA-00028IMMEDIATE:標記為待終止,等待會話下一次資料庫呼叫時生效-- 1. 找出對應 OS Process ID
SELECT p.spid, s.osuser, s.program, s.sid, s.serial#
FROM v$session s, v$process p
WHERE s.paddr = p.addr AND s.sid = :target_sid;
-- 2. 作業系統終止 (Linux/Unix)
kill -9
-- Windows (需管理員權限)
orakill
警示:kill -9 會導致 PMON 執行實例恢復,可能產生大量 REDO 回滾,僅在正常終止失效時使用。
DBA_OUTSTANDING_ALERTS 獲取 SID/SERIAL#GV$SESSION.BLOCKING_SESSION 確認阻塞者與受害者ALTER SYSTEM KILL SESSION ... IMMEDIATEV$LOCKED_OBJECT 確認鎖消失kill -9 SPIDDBMS_REDEFINITION、ALTER INDEX ... REBUILD ONLINEV$SESSION_WAIT、DBA_BLOCKERS、AWR 「Top Blocking Sessions」| 誤區 | 正確認知 |
|---|---|
| 看到鎖就立即 KILL | 先確認事務業務意義,長事務回滾可能比等待更久 |
| 只查 V$LOCK | 必須結合 V$SESSION、V$LOCKED_OBJECT、GV$ 多維度 |
| RAC 只在本節點查 | 阻塞源頭可能在其他節點,必須用 GV$ 視圖 |
| 以為 KILL SESSION 即時生效 | 無 IMMEDIATE 時需等待下一次 DB Call |
鎖定處理的核心原則:快速診斷、謹慎決策、最小影響、事後復盤。建立標準化 Runbook,讓值班人員在壓力下也能按流程操作。