生產環境遭遇死鎖時,快速定位阻塞會話並安全終結是 DBA 必備技能。本文提供基於動態視圖的四步標準化流程:鎖對象 → 會話 SID → 進程 SPID → 雙層殺進程(數據庫層 + OS 層),並附關鍵 SQL 與注意事項。
V$DB_OBJECT_CACHE)SELECT * FROM V$DB_OBJECT_CACHE
WHERE OWNER = '<對象擁有者>' AND LOCKS != '0';
找出被鎖定的對象名(如存儲過程、包)。
V$ACCESS)SELECT * FROM V$ACCESS
WHERE OWNER = '<對象擁有者>' AND NAME = '<步驟1查到的對象名>';
獲取持有該對象鎖的會話 SID。
-- 會話詳情
SELECT SID, SERIAL#, PADDR FROM V$SESSION WHERE SID = '<步驟2的SID>';
-- 映射到 OS 進程
SELECT SPID FROM V$PROCESS WHERE ADDR = '<上一步的PADDR>';
-- 1. 數據庫層:標記會話為 KILLED,釋放鎖資源
ALTER SYSTEM KILL SESSION '<SID>,<SERIAL#>';
-- 2. OS 層:若會話因長事務回滾未立即消失,強制殺 OS 進程
-- Linux/Unix:
kill -9 <SPID>
-- Windows (需 Oracle 安裝目錄下的 orakill.exe):
orakill <SID> <SPID>
ALTER SYSTEM KILL SESSION 只是打標記,PMON 進程異步清理。若會話正在大事務回滾、或陷入不可中斷系統調用,可能長時間不退出。kill -9 直接終結進程,徹底釋放共享內存、信號量等 IPC 資源,配合 ipcrm 清理共享內存段/信號量(極端情況)。| 視圖 | 用途 | 關鍵列 |
|---|---|---|
| V$LOCK | 當前鎖等待鏈 | SID, TYPE, ID1, ID2, LMODE, REQUEST, BLOCK |
| V$SESSION_WAIT | 會話等待事件 | SID, EVENT, SECONDS_IN_WAIT |
| V$SESSION_BLOCKERS | 直接顯示阻塞鏈 | BLOCKING_SESSION, BLOCKED_SESSION |
| DBA_BLOCKERS / DBA_WAITERS | 傳統阻塞查詢 | HOLDING_SESSION, WAITING_SESSION |