오라클

오라클 락(사용자 확인및 해당쿼리 조회, 사용자 세션 kill)

사라링 2014. 10. 21. 15:44

### 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'