ORACLE LOCK

V$LOCK
ADDR         锁定状态对象地址
KADDR      锁地址
SID             会话id
ID1              锁标识符#1
ID2              锁标识符#2
LMODE      会话持有的锁模式(0~6)
REQUEST 进程请求的锁模式(0~6)
CTIME        当前模式的时间

BLOCK       为1代表阻碍者,表示正在阻碍其它会话

  1. --查找正在阻碍其它会话(阻碍者)的会话 --sid为138的会话正在阻碍其它的会话  
  2. SQL> SELECT t.ADDR,  
  3.   2         t.KADDR,  
  4.   3         t.SID,  
  5.   4         t.TYPE,  
  6.   5         t.ID1,  
  7.   6         t.ID2,  
  8.   7         t.LMODE,  
  9.   8         t.REQUEST,  
  10.   9         t.CTIME,  
  11.  10         t.BLOCK  
  12.  11    FROM v$lock t  
  13.  12   WHERE t.BLOCK = 1  
  14.  13   ORDER BY t.CTIME DESC;  
  15.    
  16. ADDR     KADDR           SID TYPE        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK  
  17. -------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------  
  18. 289E1F90 289E1FA8        138 TM        51434          0          6          0       1092          1  
  19. 28A4917C 28A49298        138 TX       393262        353          6          0        538          1  
  20.    
  21. SQL>   
  22. --查找正在阻碍其它会话(阻碍者)的会话 --sid为138会话的详细信息   
  23. SQL> SELECT t1.SID,  
  24.   2         t1.SERIAL#,  
  25.   3         t1.USERNAME,  
  26.   4         t2.TYPE,  
  27.   5         t2.ID1,  
  28.   6         t2.ID2,  
  29.   7         t2.LMODE,  
  30.   8         t2.REQUEST,  
  31.   9         t2.CTIME,  
  32.  10         t2.BLOCK  
  33.  11    FROM v$session t1, v$lock t2  
  34.  12   WHERE t1.SID = t2.SID  
  35.  13     AND t1.USERNAME IS NOT NULL  --USERNAME为NULL代表oracle后台进程  
  36.  14     AND t2.BLOCK = 1  
  37.  15   ORDER BY t2.CTIME DESC;  
  38.    
  39.        SID    SERIAL# USERNAME                       TYPE        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK  
  40. ---------- ---------- ------------------------------ ---- ---------- ---------- ---------- ---------- ---------- ----------  
  41.        138          2 SYS                            TM        51434          0          6          0       1122          1  
  42.        138          2 SYS                            TX       393262        353          6          0        568          1  
  43.          
  44.          
  45.          
  46. --如果锁类型为(TYPE)为TM,v$lock.ID1代表锁定的对象id(dba_objects.OBJECT_ID).  
  47. SQL> SELECT t.owner,t.object_name FROM dba_objects t WHERE t.object_id=51434;  
  48.    
  49. OWNER                          OBJECT_NAME  
  50. ------------------------------ --------------------------------------------------------------------------------  
  51. SYS                            T_LOCK  
  52.   
  53. /**如果锁类型为(TYPE)为TX:  
  54.  *v$lock.ID1代表v$transaction.XIDUSN和v$transaction.XIDSLOT,(ID1的高16位为XIDUSN,低16位为XIDSLOT)。  
  55.  *v$lock.ID2为v$transaction.XIDSQN。  
  56.  *  
  57.  *以下是ID1,ID2与v$transaction列的转换  
  58.  */  
  59. SQL> SELECT s.XIDUSN,s.XIDSLOT, s.XIDSQN FROM v$transaction s WHERE s.XIDSQN=353;  
  60.    
  61.     XIDUSN    XIDSLOT     XIDSQN  
  62. ---------- ---------- ----------  
  63.          6         46        353  
  64. -- ID1转换为v$transaction.XIDUSN和v$transaction.XIDSLOT,正好与上面sql相同结果  
  65. SQL> SELECT trunc(393262 / power(2, 16)) XIDUSN,  
  66.   2          bitand(393262, to_number('ffff''xxxx')) + 0 XIDSLOT  
  67.   3     FROM dual;  
  68.    
  69.     XIDUSN    XIDSLOT  
  70. ---------- ----------  
  71.          6         46  
  72.    
  73. SQL>   
  74.    
  75. --查找被阻塞(正在等待)会话执行的sql,  
  76. SQL>  SELECT t1.SID,  
  77.   2         t1.SERIAL#,  
  78.   3         t1.USERNAME,  
  79.   4         t2.CTIME,  
  80.   5         t2.TYPE,  
  81.   6         t2.REQUEST,  
  82.   7         t3.PIECE,  
  83.   8         t3.SQL_TEXT  
  84.   9    FROM v$session t1, v$lock t2,v$sqltext t3  
  85.  10   WHERE t1.SID = t2.SID  
  86.  11     AND t1.USERNAME IS NOT NULL  
  87.  12     AND t1.LOCKWAIT=t2.KADDR  
  88.  13     --AND t3.SQL_ID = t1.SQL_ID  
  89.  14     AND t3.ADDRESS = t1.SQL_ADDRESS  
  90.  15     AND t3.HASH_VALUe= t1.SQL_HASH_VALUE  
  91.  16   ORDER BY t2.CTIME DESC,t3.PIECE;  
  92.    
  93.        SID    SERIAL# USERNAME                            CTIME TYPE    REQUEST      PIECE SQL_TEXT  
  94. ---------- ---------- ------------------------------ ---------- ---- ---------- ---------- ---------------------------------------  
  95.        131         52 SYS                                  3499 TM            4          0  lock table t_lock in share mode  
  96.        150         28 SYS                                  3036 TX            6          0  update t set text ='jerry' where id=1  
  97.   
  98. --查看阻碍者阻塞了哪些会话  
  99. SQL> SELECT t1.SID,  
  100.   2          t1.USERNAME,  
  101.   3          t1.BLOCKING_SESSION,  
  102.   4          t1.BLOCKING_SESSION_STATUS  
  103.   5     FROM v$session t1  
  104.   6    WHERE t1.LOCKWAIT IS NOT NULL  
  105.   7      AND t1.BLOCKING_SESSION = 138  
  106.   8      --AND t1.USERNAME IS NOT NULL  
  107.   9    ORDER BY t1.SID;  
  108.    
  109.        SID USERNAME                       BLOCKING_SESSION BLOCKING_SESSION_STATUS  
  110. ---------- ------------------------------ ---------------- -----------------------  
  111.        131 SYS                                         138 VALID  --ACTIVE - Session currently executing SQL  
  112.        150 SYS                                         138 VALID  
  113.          
  114. --kill会话,当确定了会话之后,可以kill,对于oracle进程要慎重  
  115. SQL> alter system kill session '131,52';  
  116.    
  117. System altered  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值