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

Oracle 死鎖進程查殺完整指南:兩種實用方法與 SQL 腳本

     編輯:Oracle 資料庫基礎

方法一:透過系統視圖層層追蹤

  1. 查詢被鎖物件:
    SELECT * FROM V$DB_OBJECT_CACHE 
    WHERE OWNER = '進程擁有者' AND LOCKS != '0';
    
  2. 查詢 SID:
    SELECT * FROM V$ACCESS 
    WHERE OWNER = '進程擁有者' AND NAME = '上一步查到的進程名';
    
  3. 取得 SID、SERIAL#、PADDR:
    SELECT SID, SERIAL#, PADDR FROM V$SESSION WHERE SID = '上一步查到的 SID';
    
  4. 取得作業系統進程號 (SPID):
    SELECT SPID FROM V$PROCESS WHERE ADDR = '上一步查到的 PADDR';
    
  5. 殺掉進程 (兩步驟):
    -- 1. 先殺 Oracle Session
    ALTER SYSTEM KILL SESSION 'SID,SERIAL#';
    
    -- 2. 再殺作業系統進程
    KILL -9 SPID          -- Linux/Unix
    ORAKILL SID SPID      -- Windows
    

方法二:單一 SQL 直取鎖定資訊 (推薦)

-- 1. 以 SYSDBA 登入
sqlplus "/as sysdba"

-- 2. 查找死鎖進程詳細資訊
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;

-- 3. 立即殺掉 Session
ALTER SYSTEM KILL SESSION 'sid,serial#';  -- sid = l.session_id

-- 4. 若無效,查詢 OS 進程號並強制終止
SELECT pro.spid FROM v$session ses, v$process pro
WHERE ses.sid = '死鎖SID' AND ses.paddr = pro.addr;
-- 離開 SQL*Plus
-- 在 OS 層執行: ps -ef | grep spid  然後 kill -9 spid

關鍵提醒

  • 優先使用 ALTER SYSTEM KILL SESSION 讓 Oracle 乾淨釋放資源。
  • OS 層 KILL -9 為最後手段,可能導致資料不一致,需謹慎使用。
  • 殺掉進程後,建議檢查應用程式連線池是否自動重連,避免業務中斷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved