오라클 테이블 락 ( Table lock오라클 테이블 락 ( Table lock

Posted at 2013. 8. 30. 18:05 | Posted in DataBase
반응형

### Lock 확인 쿼리 
SELECT do.object_name, do.owner, do.object_type,do.owner, vo.xidusn, vo.session_id, 
vo.locked_mode 
FROM v$locked_object vo , dba_objects do 
WHERE vo.object_id = do.object_id ; 

####  어떤 object에 어떤 lock이 걸렸는지 확인 
SELECT  T1.object_name, DECODE(locked_mode, 2, 'ROW SHARE', 3, 'ROW EXCLUSIVE',  4, 'SHARE', 5, 'SHARE ROW EXCLUSIVE', 6, 'EXCLUSIVE', 'UNKNOWN') lock_mode 
FROM  dba_objects T1, v$locked_object T2 
WHERE T1.object_id = T2.object_id; 

#### session 확인 
select * from v$session where status = 'ACTIVE' 

#### cursor 확인 
v$open_cursor 

#### 테이블의 lock 확인 
SELECT A.SID, A.SERIAL#, B.TYPE, C.OBJECT_NAME 
FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C 
WHERE A.SID=B.SID 
AND B.ID1=C.OBJECT_ID 
AND B.TYPE='TM' 
AND C.OBJECT_NAME IN ('<테이블이름>'); 

/******************************************************************************* 
* LOCK 관련 
*******************************************************************************/ 
--V$LOCK 을 사용한 잠금 경합 모니터링 
SELECT s.username, s.sid, s.serial#, s.logon_time, 
  DECODE(l.type, 'TM', 'TABLE LOCK', 
        'TX', 'ROW LOCK', 
      NULL) "LOCK LEVEL", 
  o.owner, o.object_name, o.object_type 
FROM v$session s, v$lock l, dba_objects o 
WHERE s.sid = l.sid 
AND o.object_id = l.id1 
AND s.username IS NOT NULL    

--락이 걸린 세션 자세히 알아보기 
select a.sid, a.serial#,a.username,a.process,b.object_name, 
decode(c.lmode,2,'RS',3,'RX',4,'S',5,'SRX',8,'X','NO') "TABLE LOCK", 
decode (a.command,2,'INSERT',3,'SELECT',6,'UPDATE',7,'DELETE',12,'DROP TABLE',26,'LOCK TABLE','UNknown') "SQL", 
decode(a.lockwait, NULL,'NO wait','Wait') "STATUS" 
from v$session a,dba_objects b, v$lock c 
where a.sid=c.sid and b.object_id=c.id1 
and c.type='TM' 

--락이 걸린 세션 간단히 알아보기 
select a.sid, a.serial#, b.type, c.object_name, a.program, a.lockwait, 
      a.logon_time, a.process, a.osuser, a.terminal 
from v$session a, v$lock b, dba_objects c 
where a.sid = b.sid 
  and b.id1 = c.object_id 
  and b.type = 'TM'; 

select a.sid, a.serial#, a.username, a.process, b.object_name 
from v$session a , dba_objects b, v$lock c 
where a.sid=c.sid and b.object_id = c.id1 
and c.type = 'TM' 

--락이 걸린 세션을 찾아 내어 세션을 죽이려고 해도 죽지 않는 경우 
--아래 쿼리문으로 OS단의 PROCESS ID를 찾아내어 OS에서 죽인다 
--kill -9 프로세스아이디 
select substr(s.username,1,11) "ORACLE USER", p.pid "PROCESS ID", 
s.sid "SESSION ID", s.serial#, osuser "OS USER", 
p.spid "PROC SPID",s.process "SESS SPID", s.lockwait "LOCK WAIT" 
from v$process p, v$session s, v$access a 
where a.sid=s.sid and 
p.addr=s.paddr and 
s.username != 'SYS' 

--위 쿼리문의 결과가 있다면 락이 걸린 세션이 있다는것이므로 아래의 쿼리문으로 세션을 죽인다 
ALTER SYSTEM KILL SESSION '11,39061' 

반응형

//