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

Oracle 死鎖進程徹底清理:從 SQL 層到 OS 層的分級殺戮指南

     編輯:Oracle 資料庫基礎

現象:Session 標記 KILLED 但鎖持續佔用

ALTER SYSTEM KILL SESSION 僅標記 Session 為 KILLED,實際資源釋放需等待 Session 自行清理。若進程卡住(如等待 I/O、無限迴圈),鎖不釋放,業務阻塞。

四步分級清理流程

Step 1:定位被鎖物件與 Session

COL object_name FOR A30
COL machine FOR A20
SELECT o.object_name, s.machine, s.sid, s.serial#
FROM v$locked_object l, dba_objects o, v$session s
WHERE l.object_id = o.object_id
  AND l.session_id = s.sid;

Step 2:SQL 層優雅終止

ALTER SYSTEM KILL SESSION 'sid,serial#';  -- 例:'42,21993'

-- 批量生成殺 Session 語句
SELECT 'ALTER SYSTEM KILL SESSION ''' || s.sid || ',' || s.serial# || ''';'
FROM v$locked_object l, dba_objects o, v$session s
WHERE l.object_id = o.object_id AND l.session_id = s.sid;

Step 3:OS 層強制收割(若 Step 2 無效)

先查詢對應 OS Process/Thread ID:

SELECT p.spid, s.osuser, s.program
FROM v$session s, v$process p
WHERE s.paddr = p.addr AND s.sid = :target_sid;

Linux (root)

kill -9 

Windows (orakill.exe)

orakill  
-- 例:orakill ORCL 12345

orakill.exe 位於 $ORACLE_HOME/bin,專門終結 Oracle 執行緒,比 Task Manager 安全。

Step 4:自動化與風險控制

可編寫 PL/SQL 包裹上述四步自動執行,但生產環境強烈不建議常態化:

  • OS 層 Kill 需 root/Administrator 權限,誤殺風險高。
  • 可能導致資料檔不一致、需執行實例恢復。
  • 優先排查根因:應用邏輯死鎖、長跑 SQL、資源不足、參數設定不當。

最佳實踐建議

  1. 建立監控告警:V$SESSION_WAIT + V$LOCK 即時發現阻塞鏈。
  2. 設定 SQLNET.EXPIRE_TIME 清理斷連 Session。
  3. 應用層統一異常處理與連接池回收機制。
  4. 定期審核長跑交易與無索引外鍵(易致全表鎖)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved