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

Oracle 殺不掉的鎖完整處理流程:V$LOCKED_OBJECT → ALTER SYSTEM KILL → OS 層 KILL/ORAKILL

     編輯:Oracle 資料庫基礎

遭遇 ALTER SYSTEM KILL SESSION 執行後狀態顯示 KILLED 卻長時間不釋放鎖?需進階至作業系統層強制終止影子進程/執行緒。本文提供四步驟標準處理流程,涵蓋 Unix/Linux kill -9 與 Windows ORAKILL 實戰指令。

四步驟標準流程

步驟 1:定位被鎖物件與持有 Session

SELECT o.object_name,
       s.sid, s.serial#,
       s.username, s.osuser, s.machine, s.program, s.logon_time
FROM   v$locked_object l
JOIN   dba_objects o ON l.object_id = o.object_id
JOIN   v$session s   ON l.session_id = s.sid;

記錄 SID、SERIAL#、OSUSER、MACHINE、PROGRAM。

步驟 2:資料庫層嘗試正常終止

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
  • IMMEDIATE(10g+):立即回滾、釋放鎖、斷開連線,不等待客戶端確認。
  • 若無 IMMEDIATE,Session 狀態變 KILLED,需等客戶端下一條指令才真正釋放資源。

步驟 3:查詢對應 OS 進程/執行緒 ID (SPID)

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

記錄 SPID(Linux/Unix 為 PID,Windows 為執行緒 ID)。

步驟 4:作業系統層強制終止

平台指令說明
Linux/Unixkill -9 需 root 或 oracle OS 權限;-9 為 SIGKILL,不可被捕獲/忽略
WindowsORAKILL ORAKILL.EXE 位於 %ORACLE_HOME%\BIN; 為實例名, 為步驟 3 取得的執行緒 ID

Windows 實戰範例

C:\> orakill ORCL 12345
-- 12345 為 v$process.spid 對應的執行緒 ID

進階:RAC 環境下的跨節點處理

  1. 在持有鎖的節點執行步驟 1-4。
  2. 若 GV$SESSION.INST_ID 不同,需登入該節點執行 ORAKILL/kill。
  3. 或使用 SRVCTL STOP INSTANCE -d -i -o IMMEDIATE 強制關閉整個實例(極端手段)。

預防長時間 KILLED 狀態的最佳實務

  • 應用程式連線池設定 VALIDATE CONNECTION、IDLE TIMEOUT,避免殭屍 Session。
  • 啟用 SQLNET.EXPIRE_TIME=10(sqlnet.ora),偵測斷線客戶端並自動清理。
  • 長交易拆分為短交易,縮短鎖持有時間。
  • 監控腳本定期掃描 V$SESSION.STATUS='KILLED' 超過 5 分鐘者,自動升級至 OS KILL。

常見誤區

  • ❌ 直接 OS KILL 未先嘗試 ALTER SYSTEM KILL SESSION IMMEDIATE → 可能導致資料檔不一致、需執行個體恢復。
  • ❌ Windows 用 Task Manager 結束 oracle.exe 主進程 → 會摧毀整個實例,所有 Session 全斷。
  • ✅ 正確順序:DB 層 KILL IMMEDIATE → 等待 1-2 分鐘 → 仍為 KILLED → OS 層精準終止對應 SPID。

建立「資料庫層優先、OS 層補充、監控自動化」三層防線,徹底解決「殺不掉的鎖」難題,保障核心業務連續運行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved