TECH
QUESTION
자주하는 질문답변 입니다.
Oracle
작성자 | 유건데이타 | 등록일 | 2015-05-13 |
제목 | DB 전체의 TX, TM LOCK 현상 확인 SCRIPT | ||
---|---|---|---|
DB 전체의 TX, TM LOCK 현상 확인 SCRIPT
===================================== database 전체에 대해서 user table에 관계된 lock만을 확인하는 script를 기존 catblock.sql을 변형하여 작성하였다. 기존의 catblock.sql이 해당 lock을 waiting하는 session이 있을 때에만 결과가 나타나, 실제 waiting이 없는 경우 현재 lock 상태를 보지 못하였던 점과, 각 lock 상태에 대해서 바로 해당 object를 함께 display하도록 수정하였다. [NOTE 1] sys user에서 수행하여야 하며 system 등 다른 dba 권한을 가진 user에서 수행하고자 한다면 다음과 같이 sys user에서 grant를 주 어야 한다. SQL>grant select on v_$lock to system; [NOTE 2] 전체 lock현황이 아니고 waiting이 발생하는 경우만을 보여주고자 한다면 첫번째 문장의 where절에 request !=0 를 첨가한다. 다음과 같이 된다. where request !=0 and type = 'TX' or type = 'TM'; ---------------------------------------------------------------------- create or replace view EYKIM_LOCK as select sid session_id, decode(type, 'TX', 'Transaction', 'TM', 'DML', 'DX', 'Distributed Xaction', type) lock_type, decode(lmode, 0, 'None', /* Mon Lock equivalent */ 1, 'Null', /* N */ 2, 'Row-S (SS)', /* L */ 3, 'Row-X (SX)', /* R */ 4, 'Share', /* S */ 5, 'S/Row-X (SSX)', /* C */ 6, 'Exclusive', /* X */ to_char(lmode)) mode_held, decode(request, 0, 'None', /* Mon Lock equivalent */ 1, 'Null', /* N */ 2, 'Row-S (SS)', /* L */ 3, 'Row-X (SX)', /* R */ 4, 'Share', /* S */ 5, 'S/Row-X (SSX)', /* C */ 6, 'Exclusive', /* X */ to_char(request)) mode_requested, to_char(id1) lock_id1, to_char(id2) lock_id2, decode(block, 0, 'Not Blocking', /* Not blocking any other processes */ 1, 'Blocking', /* This lock blocks other processes */ 2, 'Global', /* This lock is global, so we can't tell */ to_char(block)) blocking_others from v$lock where type = 'TX' or type = 'TM'; drop table eykim_holders; create table EYKIM_HOLDERS /* temporary table */ ( waiting_session number, holding_session number, lock_type varchar2(26), mode_held varchar2(14), mode_requested varchar2(14), lock_table varchar2(22), lock_owner varchar2(30) ); insert into eykim_holders select w.session_id, h.session_id, w.lock_type, nvl(h.mode_held, w.mode_held), w.mode_requested, o.object_name, o.owner from (select session_id, lock_type, mode_held, lock_id1, lock_id2 from eykim_lock where blocking_others = 'Blocking' and mode_held != 'None' and mode_held != 'Null' ) h, (select session_id, lock_type, mode_held, mode_requested, lock_id1, lock_id2 from eykim_lock where lock_type = 'Transaction') w, eykim_lock a, dba_objects o where w.lock_type = h.lock_type(+) and w.lock_id1 = h.lock_id1(+) and w.lock_id2 = h.lock_id2(+) and w.session_id = a.session_id and a.lock_type = 'DML' and a.lock_id1 = o.object_id; commit; insert into eykim_holders select holding_session, null, 'None', null, null, null, null from eykim_holders minus select waiting_session, null, 'None', null, null, null, null from eykim_holders; commit; col lock_type format a12 col lock_owner format a8 col lock_table format a10 select lpad(' ',3*(level-1)) || waiting_session waiting_session, lock_type, mode_requested, mode_held, lock_table, lock_owner from eykim_holders connect by prior waiting_session = holding_session start with holding_session is null; select * from eykim_holders; |
Comment | |||
---|---|---|---|
등록된 코멘트가 없습니다. |