首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 死鎖進程排查與終結實戰:四步定位殺進程全流程

     編輯:Oracle 資料庫基礎

前言

生產環境遭遇死鎖時,快速定位阻塞會話並安全終結是 DBA 必備技能。本文提供基於動態視圖的四步標準化流程:鎖對象 → 會話 SID → 進程 SPID → 雙層殺進程(數據庫層 + OS 層),並附關鍵 SQL 與注意事項。

四步定位法

步驟 1:查被鎖對象(V$DB_OBJECT_CACHE)

SELECT * FROM V$DB_OBJECT_CACHE
WHERE OWNER = '<對象擁有者>' AND LOCKS != '0';

找出被鎖定的對象名(如存儲過程、包)。

步驟 2:查持有鎖的 SID(V$ACCESS)

SELECT * FROM V$ACCESS
WHERE OWNER = '<對象擁有者>' AND NAME = '<步驟1查到的對象名>';

獲取持有該對象鎖的會話 SID。

步驟 3:獲取 SID、SERIAL#、OS 進程號 SPID

-- 會話詳情
SELECT SID, SERIAL#, PADDR FROM V$SESSION WHERE SID = '<步驟2的SID>';

-- 映射到 OS 進程
SELECT SPID FROM V$PROCESS WHERE ADDR = '<上一步的PADDR>';

步驟 4:雙層殺進程(關鍵:先數據庫層,後 OS 層)

-- 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 進程異步清理。若會話正在大事務回滾、或陷入不可中斷系統調用,可能長時間不退出。
  • OS 層 kill -9 直接終結進程,徹底釋放共享內存、信號量等 IPC 資源,配合 ipcrm 清理共享內存段/信號量(極端情況)。

輔助排查視圖速查表

最佳實踐建議

  1. 先查 V$LOCK 確認阻塞鏈,避免誤殺正常長運行會話。
  2. 優先 ALTER SYSTEM KILL SESSION,給 PMON 幾秒清理時間。
  3. 必要時 OS 強殺,隨後檢查 Alert 日志確認實例穩定。
  4. 事後複盤:分析死鎖跟蹤文件(USER_DUMP_DEST 下 ora_*_trc),優化應用邏輯(統一訪問順序、縮短事務、避免長事務)。

總結

「鎖對象 → SID → SPID → 雙層殺」四步法標準化、可腳本化。平時多演練,關鍵時刻才能從容應對,將業務影響降到最低。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
視圖用途關鍵列
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