V$LOCK
ADDR 锁定状态对象地址
KADDR 锁地址
SID 会话id
ID1 锁标识符#1
ID2 锁标识符#2
LMODE 会话持有的锁模式(0~6)
REQUEST 进程请求的锁模式(0~6)
CTIME 当前模式的时间
ADDR 锁定状态对象地址
KADDR 锁地址
SID 会话id
ID1 锁标识符#1
ID2 锁标识符#2
LMODE 会话持有的锁模式(0~6)
REQUEST 进程请求的锁模式(0~6)
CTIME 当前模式的时间
BLOCK 为1代表阻碍者,表示正在阻碍其它会话
- --查找正在阻碍其它会话(阻碍者)的会话 --sid为138的会话正在阻碍其它的会话
- SQL> SELECT t.ADDR,
- 2 t.KADDR,
- 3 t.SID,
- 4 t.TYPE,
- 5 t.ID1,
- 6 t.ID2,
- 7 t.LMODE,
- 8 t.REQUEST,
- 9 t.CTIME,
- 10 t.BLOCK
- 11 FROM v$lock t
- 12 WHERE t.BLOCK = 1
- 13 ORDER BY t.CTIME DESC;
- ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
- -------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
- 289E1F90 289E1FA8 138 TM 51434 0 6 0 1092 1
- 28A4917C 28A49298 138 TX 393262 353 6 0 538 1
- SQL>
- --查找正在阻碍其它会话(阻碍者)的会话 --sid为138会话的详细信息
- SQL> SELECT t1.SID,
- 2 t1.SERIAL#,
- 3 t1.USERNAME,
- 4 t2.TYPE,
- 5 t2.ID1,
- 6 t2.ID2,
- 7 t2.LMODE,
- 8 t2.REQUEST,
- 9 t2.CTIME,
- 10 t2.BLOCK
- 11 FROM v$session t1, v$lock t2
- 12 WHERE t1.SID = t2.SID
- 13 AND t1.USERNAME IS NOT NULL --USERNAME为NULL代表oracle后台进程
- 14 AND t2.BLOCK = 1
- 15 ORDER BY t2.CTIME DESC;
- SID SERIAL# USERNAME TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
- ---------- ---------- ------------------------------ ---- ---------- ---------- ---------- ---------- ---------- ----------
- 138 2 SYS TM 51434 0 6 0 1122 1
- 138 2 SYS TX 393262 353 6 0 568 1
- --如果锁类型为(TYPE)为TM,v$lock.ID1代表锁定的对象id(dba_objects.OBJECT_ID).
- SQL> SELECT t.owner,t.object_name FROM dba_objects t WHERE t.object_id=51434;
- OWNER OBJECT_NAME
- ------------------------------ --------------------------------------------------------------------------------
- SYS T_LOCK
- /**如果锁类型为(TYPE)为TX:
- *v$lock.ID1代表v$transaction.XIDUSN和v$transaction.XIDSLOT,(ID1的高16位为XIDUSN,低16位为XIDSLOT)。
- *v$lock.ID2为v$transaction.XIDSQN。
- *
- *以下是ID1,ID2与v$transaction列的转换
- */
- SQL> SELECT s.XIDUSN,s.XIDSLOT, s.XIDSQN FROM v$transaction s WHERE s.XIDSQN=353;
- XIDUSN XIDSLOT XIDSQN
- ---------- ---------- ----------
- 6 46 353
- -- ID1转换为v$transaction.XIDUSN和v$transaction.XIDSLOT,正好与上面sql相同结果
- SQL> SELECT trunc(393262 / power(2, 16)) XIDUSN,
- 2 bitand(393262, to_number('ffff', 'xxxx')) + 0 XIDSLOT
- 3 FROM dual;
- XIDUSN XIDSLOT
- ---------- ----------
- 6 46
- SQL>
- --查找被阻塞(正在等待)会话执行的sql,
- SQL> SELECT t1.SID,
- 2 t1.SERIAL#,
- 3 t1.USERNAME,
- 4 t2.CTIME,
- 5 t2.TYPE,
- 6 t2.REQUEST,
- 7 t3.PIECE,
- 8 t3.SQL_TEXT
- 9 FROM v$session t1, v$lock t2,v$sqltext t3
- 10 WHERE t1.SID = t2.SID
- 11 AND t1.USERNAME IS NOT NULL
- 12 AND t1.LOCKWAIT=t2.KADDR
- 13 --AND t3.SQL_ID = t1.SQL_ID
- 14 AND t3.ADDRESS = t1.SQL_ADDRESS
- 15 AND t3.HASH_VALUe= t1.SQL_HASH_VALUE
- 16 ORDER BY t2.CTIME DESC,t3.PIECE;
- SID SERIAL# USERNAME CTIME TYPE REQUEST PIECE SQL_TEXT
- ---------- ---------- ------------------------------ ---------- ---- ---------- ---------- ---------------------------------------
- 131 52 SYS 3499 TM 4 0 lock table t_lock in share mode
- 150 28 SYS 3036 TX 6 0 update t set text ='jerry' where id=1
- --查看阻碍者阻塞了哪些会话
- SQL> SELECT t1.SID,
- 2 t1.USERNAME,
- 3 t1.BLOCKING_SESSION,
- 4 t1.BLOCKING_SESSION_STATUS
- 5 FROM v$session t1
- 6 WHERE t1.LOCKWAIT IS NOT NULL
- 7 AND t1.BLOCKING_SESSION = 138
- 8 --AND t1.USERNAME IS NOT NULL
- 9 ORDER BY t1.SID;
- SID USERNAME BLOCKING_SESSION BLOCKING_SESSION_STATUS
- ---------- ------------------------------ ---------------- -----------------------
- 131 SYS 138 VALID --ACTIVE - Session currently executing SQL
- 150 SYS 138 VALID
- --kill会话,当确定了会话之后,可以kill,对于oracle进程要慎重
- SQL> alter system kill session '131,52';
- System altered