死鎖發生在兩個或多個 Session 互相持有對方所需的鎖資源,導致雙方都無法繼續執行。Oracle 會自動偵測並回滾其中一個交易,但持有鎖的 Session 仍可能殘留,需手動清理。
SELECT * FROM V$DB_OBJECT_CACHE
WHERE OWNER = '目標用戶' AND LOCKS != '0';
SELECT * FROM V$ACCESS
WHERE OWNER = '目標用戶' AND NAME = '被鎖物件名';
-- 取得 SID、SERIAL#、PADDR
SELECT SID, SERIAL#, PADDR FROM V$SESSION WHERE SID = '目標SID';
-- 取得作業系統進程 ID (SPID)
SELECT SPID FROM V$PROCESS WHERE ADDR = '目標PADDR';
ALTER SYSTEM KILL SESSION 'SID,SERIAL#';
此命令標記 Session 為「待終止」,實際釋放資源需等待 Session 下一次資料庫呼叫。若 Session 正在執行長時間操作(如大量回滾),可能無法立即生效。
若 Oracle KILL 無效,需在 OS 層面終止對應進程:
kill -9 SPIDorakill SID SPIDSELECT 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;
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 進程 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