診斷鎖阻塞需關聯 V$LOCK、V$SESSION、V$PROCESS 等多張視圖,手工查詢繁瑣。Oracle 提供內建腳本 ?/rdbms/admin/catblock.sql,一次建立 DBA_WAITERS 與 DBA_BLOCKERS 兩個視圖,極大簡化排查。
SQLPLUS / AS SYSDBA
SQL> @?/rdbms/admin/catblock.sql
-- 輸出:VIEW CREATED, SYNONYM CREATED ...
Session 1: SELECT * FROM test FOR UPDATE;
Session 2: SELECT * FROM test FOR UPDATE; -- 阻塞
Session 3 (SYS): SELECT * FROM DBA_WAITERS;
輸出:
WAITING_SESSION HOLDING_SESSION LOCK_TYPE MODE_HELD MODE_REQUESTED LOCK_ID1 LOCK_ID2
--------------- --------------- ---------- --------- -------------- -------- --------
142 150 Transaction Exclusive Exclusive 131099 2550
DBA_BLOCKERS 直接顯示持有者 150。
Session 1: SELECT * FROM obj$ FOR UPDATE; -- 鎖定資料字典
Session 2: CREATE INDEX ind_t_id ON test(object_id); -- 阻塞
Session 3: SELECT * FROM DBA_WAITERS;
輸出顯示持有者 145,等待者 150,鎖類型同為 Transaction。
V$LOCK.TYPE/LMODE。注意:
catblock.sql需在 SYS 模式下執行,僅需執行一次永久生效。