Oracle 資料庫運行久了難免遇到鎖表問題,導致業務阻塞。本文整理四種常用查詢鎖定物件的 SQL,以及解鎖的標準指令,供 DBA 現場快速排查使用。
SELECT l.session_id sid,
s.serial#,
l.locked_mode,
l.oracle_username,
l.os_user_name,
s.machine,
s.terminal,
o.object_name,
s.logon_time
FROM v$locked_object l,
all_objects o,
v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial#;
說明:直接關聯 V$LOCKED_OBJECT、ALL_OBJECTS、V$SESSION,可快速定位鎖定物件名、鎖模式、客戶端機器與登入時間。
SELECT /*+ RULE */
s.username,
DECODE(l.type, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) lock_level,
o.owner,
o.object_name,
o.object_type,
s.sid,
s.serial#,
s.terminal,
s.machine,
s.program,
s.osuser
FROM v$session s,
v$lock l,
dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username IS NOT NULL;
重點:任何 DML 實際會產生兩把鎖——TM(表鎖)與 TX(列鎖),此查詢可一次列出兩者。
SELECT a.owner,
a.object_name,
b.xidusn,
b.xidslot,
b.xidsqn,
b.session_id,
b.oracle_username,
b.os_user_name,
b.process,
b.locked_mode,
c.machine,
c.status,
c.server,
c.sid,
c.serial#,
c.program
FROM all_objects a,
v$locked_object b,
sys.gv_$session c
WHERE a.object_id = b.object_id
AND b.process = c.process
AND c.status = 'ACTIVE'
ORDER BY 1, 2;
適用場景:需依作業系統 Process ID 追蹤具體 Session。
ALTER SYSTEM KILL SESSION 'sid,serial#';
⚠️ 注意:
KILLED,實際釋放資源需等待 PMON 背景程序清理。@inst_id 指定例項:ALTER SYSTEM KILL SESSION 'sid,serial#,@1';ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION; 或在 OS 層面 kill -9 spid(謹慎操作)。鎖表排查核心在於「快速定位 → 確認業務影響 → 決定是否強制釋放」。建議將上述 SQL 存為腳本,納入日常巡檢工具箱。