方法一:標準視圖聯查(推薦)
-- 1. 查詢被鎖對象及會話
SELECT
sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
DECODE(lo.locked_mode,
0, 'None',
1, 'Null (NULL)',
2, 'Row-S (SS)',
3, 'Row-X (SX)',
4, 'Share (S)',
5, 'S/Row-X (SSX)',
6, 'Exclusive (X)',
lo.locked_mode) locked_mode_desc
FROM v$locked_object lo
JOIN dba_objects ao ON ao.object_id = lo.object_id
JOIN v$session sess ON sess.sid = lo.session_id;
-- 2. 解鎖
ALTER SYSTEM KILL SESSION 'sid,serial#';
-- 例:ALTER SYSTEM KILL SESSION '273,45';
方法二:進程級殺掉(頑固會話)
-- 1. 找到目標會話的 PADDR
SELECT sid, username, paddr, status
FROM v$session
WHERE username = 'JCUSER' AND sid = <上一步查出的 SID>;
-- 2. 通過 PADDR 找到 OS 進程號 (SPID)
SELECT addr, pid, spid, username, serial#, terminal
FROM v$process
WHERE addr = '<上一步的 PADDR>';
-- 3. 作業系統級殺進程
-- Linux: kill -9
-- Windows: orakill (需以管理員運行)
鎖模式對照表
| LOCKED_MODE | 含義 | 典型場景 |
| 2 (Row-S) | 行共享 | SELECT ... FOR UPDATE |
| 3 (Row-X) | 行排他 | INSERT/UPDATE/DELETE |
| 4 (Share) | 共享表鎖 | CREATE INDEX |
| 6 (Exclusive) | 排他表鎖 | DROP TABLE, ALTER TABLE |
注意事項
KILL SESSION 標記會話為 killed,實際釋放資源需等待會話檢查到標記(可能被長時間操作阻塞);
- OS 級
kill -9 強制釋放,但可能留下事務不一致,需實例恢復;
- 優先嘗試
KILL SESSION,無效再用 OS 級手段。