Páginas

sábado, 3 de agosto de 2013

[Oracle] - Identificar Locks em Sessões


Bom pessoal, segue dica rápida para identificar locks entre sessões no Oracle.

select h.session_id Sessao_Travadora, ub.username Usuario_Travador ,
w.session_id Sessao_Esperando, uw.username Usuario_Esperando,
w.lock_type,
h.mode_held,
w.mode_requested,
w.lock_id1,
w.lock_id2
from dba_locks w, dba_locks h, v$session ub, v$session uw
where h.blocking_others = 'Blocking'
and h.mode_held != 'None'
and h.mode_held != 'Null'
and h.session_id = ub.sid
and w.mode_requested != 'None'
and w.lock_type  = h.lock_type
and w.lock_id1  = h.lock_id1
and w.lock_id2 = h.lock_id2
and w.session_id = uw.sid;


Espero que essa dica possa ajudar a outros profissionais de Banco de dados que estejam precisando identificar problemas com locks entre sessões. Que a Graças e Paz estejam com todos.

Segue abaixo, alguns selects para auxiliar na identificação de sessões em lock:
select vs.audsid audsid,
 to_char(locks.sid) sid,
 to_char(vs.serial#) serial,
 vs.username oracle_user,
 vs.osuser os_user,
 vs.program program,
 vs.module module,
 vs.action action,
 vs.terminal,
 vs.process process,
 decode(locks.lmode,
       1, NULL,
       2, 'Row Share',
       3, 'Row Exclusive',
       4, 'Share',
       5, 'Share Row Exclusive',
       6, 'Exclusive', 'None') lock_mode_held,
 decode(locks.request,
       1, NULL,
       2, 'Row Share',
       3, 'Row Exclusive',
       4, 'Share',
       5, 'Share Row Exclusive',
       6, 'Exclusive', 'None') lock_mode_requested,
 decode(locks.type,
       'MR', 'Media Recovery',
       'RT', 'Redo Thread',
       'UN', 'User Name',
       'TX', 'Transaction',
       'TM', 'DML',
       'UL', 'PL/SQL User Lock',
       'DX', 'Distributed Xaction',
       'CF', 'Control File',
       'IS', 'Instance State',
       'FS', 'File Set',
       'IR', 'Instance Recovery',
       'ST', 'Disk Space Transaction',
       'TS', 'Temp Segment',
       'IV', 'Library Cache Invalidation',
       'LS', 'Log Start or Log Switch',
       'RW', 'Row Wait',
       'SQ', 'Sequence Number',
       'TE', 'Extend Table',
       'TT', 'Temp Table',
       locks.type) lock_type, 
 objs.owner object_owner,
 objs.object_name object_name,
 objs.object_type object_type,
 round( locks.ctime/60, 2 ) lock_time_in_minutes
from v$session vs,
         v$lock locks,
         all_objects objs,
         all_tables tbls
where locks.id1 = objs.object_id
 and vs.sid = locks.sid
 and objs.owner = tbls.owner
 and objs.object_name =  tbls.table_name
 and objs.owner != 'SYS'
 and locks.type = 'TM'
 order by lock_time_in_minutes;

--------------------------------------------------------------------------------
Abaixo, select para verificar o select que está ocasionando o lock na sessão:

select /*+ ORDERED USE_NL(st) */ sql_text
  from v$session ses,
       v$sqltext st
  where st.address = ses.sql_address
   and st.hash_value=ses.sql_hash_value
   and ses.sid= &sid
order by piece;

Fonte:
http://dicasoracledba.blogspot.com.br/2009/04/identificar-locks-entre-sessoes.html

Nenhum comentário:

Postar um comentário