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

Oracle 鎖表查詢與解鎖實操:V$LOCKED_OBJECT、V$SESSION、V$PROCESS 聯查

     編輯:Oracle 資料庫基礎

方法一:標準視圖聯查(推薦)

-- 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 級手段。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved