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

徹底解決 Oracle 死鎖進程:診斷與終止完整指南

     編輯:Oracle 資料庫基礎

Oracle 死鎖成因與影響

死鎖發生在兩個或多個 Session 互相持有對方所需的鎖資源,導致雙方都無法繼續執行。Oracle 會自動偵測並回滾其中一個交易,但持有鎖的 Session 仍可能殘留,需手動清理。

死鎖進程診斷三步驟

步驟 1:識別被鎖定的物件

SELECT * FROM V$DB_OBJECT_CACHE 
WHERE OWNER = '目標用戶' AND LOCKS != '0';

步驟 2:定位持有鎖的 Session (SID)

SELECT * FROM V$ACCESS 
WHERE OWNER = '目標用戶' AND NAME = '被鎖物件名';

步驟 3:獲取完整 Session 與 OS 進程資訊

-- 取得 SID、SERIAL#、PADDR
SELECT SID, SERIAL#, PADDR FROM V$SESSION WHERE SID = '目標SID';

-- 取得作業系統進程 ID (SPID)
SELECT SPID FROM V$PROCESS WHERE ADDR = '目標PADDR';

兩階段終止策略

階段 1:Oracle 層面終止 Session

ALTER SYSTEM KILL SESSION 'SID,SERIAL#';

此命令標記 Session 為「待終止」,實際釋放資源需等待 Session 下一次資料庫呼叫。若 Session 正在執行長時間操作(如大量回滾),可能無法立即生效。

階段 2:作業系統層面強制終止

若 Oracle KILL 無效,需在 OS 層面終止對應進程:

  • Linux/Unix:kill -9 SPID
  • Windows:orakill SID SPID

綜合死鎖查詢腳本

SELECT t2.username || ' ' || t2.sid || ' ' || t2.serial# || ' ' || t2.logon_time || ' ' || t3.sql_text
FROM v$locked_object t1, v$session t2, v$sqltext t3
WHERE t1.session_id = t2.sid
  AND t2.sql_address = t3.address
ORDER BY t2.logon_time;

替代查詢:直接關聯 V$LOCKED_OBJECT 與 V$SESSION

SELECT s.username, l.object_id, l.session_id, s.serial#,
       l.oracle_username, l.os_user_name, l.process
FROM v$locked_object l, v$session s
WHERE l.session_id = s.sid;

OS 進程定位與清理

-- 取得 OS 進程 ID
SELECT p.spid FROM v$session s, v$process p
WHERE s.sid = '死鎖SID' AND s.paddr = p.addr;

-- Unix 環境驗證與終止
ps -ef | grep SPID
kill -9 SPID
ps -ef | grep SPID  -- 確認已終止

最佳實踐建議

  • 優先使用 ALTER SYSTEM KILL SESSION,給予 Session 正常清理機會
  • 搭配 IMMEDIATE 選項(12c+):ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE
  • OS 層面終止僅作為最後手段,避免留下不一致狀態
  • 事後分析應用程式邏輯,從根源預防死鎖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved