SELECT para ver bloqueos

¿Alguna vez has necesitado saber si algún proceso está bloqueando alguna de tus tablas?
A continuación una Select para Oracle que permite consultar los procesos que estan produciendo bloqueos en la Base de Datos. IMPORTANTE: Sólo funcionará si se ejecuta con privilegios de DBA, ya que consulta tablas del sistema de la BD.

SELECT decode(L.TYPE,'TM','TABLE','TX','Record(s)') TIPO_BLOQUEO,
       decode(L.REQUEST,0,'NO','YES') ESPERA,
       S.SECONDS_IN_WAIT SEGUNDOS_EN_ESPERA,
       decode(l.LMODE,0,'none',1,'null (NULL)',2,'row-S (SS)',3,'row-X (SX)',4,'share (S)',5,'S/Row-X (SSX)',6,'exclusive (X)') MODO_BLOQUEO,
       S.OSUSER USUARIO_SIST_OPERAT,
       S.USERNAME USUARIO_BD,
       S.PROCESS PROCESS_LOCKER,
       S.MACHINE MAQUINA,
       O.OBJECT_NAME OBJETO_BLOQUEADO,
       O.OBJECT_TYPE OBJETO_TIPO,
       concat(' ',s.PROGRAM) PROGRAMA,
       O.OWNER PROPIETARIO,
       S.SID,
       S.SERIAL#
  FROM v$lock L,
       dba_objects O,
       v$session S
 WHERE L.ID1 = O.OBJECT_ID
   AND S.SID = L.SID
   AND L.TYPE in ('TM','TX') ;


Se utilizan las tablas dba_objects (para algún dato del objeto bloqueado), v$lock y v$session (que son tablas de Oracle que contienen datos de las sesiones activas en cada momento y los bloqueos).

En mi caso, y como ejemplo, creé una ventana con una DataWindow con esta Select, que se refresca cada 5 segundos. Más tarde lo cambié a 30, y más tarde puse una lista para que cada uno elija el tiempo que quiera. En una Base de Datos muy utilizada como es la de mi trabajo, se veían los bloqueos apareciendo y desapareciendo de una forma muy elegante.


La columna de "SEGUNDOS_EN_ESPERA" se puede formatear con una función del tipo "RelativeTime('00:00:00',NSegundos)" para mostrarlo de forma más clara.

Las columnas SID y #Serial (que a priori no nos dicen nada) se utilizan para construir el botón "Matar", ya que necesité cortar algunas de las sesiones que estaba viendo porque los bloqueos eran constantes, eternos y provocados por un funcionamiento erróneo de la aplicación.
En el [siguiente artículo] pondré el código de este botón que mata una de las sesiones vistas en esta Select.

2 comentarios:

  1. Muy interesante; me va genial en Oracle 11, pero en la 9i me da un fallo "S.SECONDS_IN_WAIT". Aún a´si, me vale. Gracias

    ResponderEliminar
  2. Excelente explicación y de mucha utilidad la consulta!! Gracias!

    ResponderEliminar

Mi foto
Geek y Friki de amplio espectro pero de baja intensidad. Bloguero, forero y jugón online. Y Papá. Cada vez con menos tiempo para los hobbies.
Experto en PowerBuilder.
¿Te ha gustado? Haz un +1 en Google!

También te puede interesar...