方法一:透過系統視圖層層追蹤
- 查詢被鎖物件:
SELECT * FROM V$DB_OBJECT_CACHE
WHERE OWNER = '進程擁有者' AND LOCKS != '0';
- 查詢 SID:
SELECT * FROM V$ACCESS
WHERE OWNER = '進程擁有者' AND NAME = '上一步查到的進程名';
- 取得 SID、SERIAL#、PADDR:
SELECT SID, SERIAL#, PADDR FROM V$SESSION WHERE SID = '上一步查到的 SID';
- 取得作業系統進程號 (SPID):
SELECT SPID FROM V$PROCESS WHERE ADDR = '上一步查到的 PADDR';
- 殺掉進程 (兩步驟):
-- 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 為最後手段,可能導致資料不一致,需謹慎使用。
- 殺掉進程後,建議檢查應用程式連線池是否自動重連,避免業務中斷。