jueves, 2 de diciembre de 2010

Eliminar Bloqueo en la Base desde la Linea de Comandos del SO

Muchas veces nos encontramos ante bloqueos dentro de la base de datos. Y hay otras tantas de esas veces en las que no podemos matar al proceso desde dentro de la base de datos y debemos hacerlo desde el sistema operativo, matando la sesion que está produciendo dicho problema.

Detectando un Bloqueo:

Una de las tantas formas de detectar un bloqueo es haciendo una consulta a la v$lock.

Como veremos en el siguiente ejemplo se encontro una sesion bloqueando un recurso y otra que lo estaba pidiendo.

SQL> select * from v$lock where block!=0 or request!=0;


ADDR     KADDR           SID TY        ID1        ID2      LMODE    REQUEST
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ----
5F2557E0 5F2557F4        544 UL 1073785182          0          6          0
5F255898 5F2558AC        531 UL 1073785182          0          0          6

Como se puede ver, de aquí podemos obtener el SID de la sesion que se encuentra bloqueando el recurso. En este caso es 544.

Con dicho SID haremos una consulta a la v$session para obtener el campo PADDR.

SQL> select paddr from v$session where SID='544';


PADDR
--------
5F5D3A4C


Por último ya podremos consultar la v$process para obtener el SPID de esa sesion que se encuentra produciendo el bloqueo.

SQL> select spid from v$process where ADDR='5F5D3A4C';


SPID
------------
11184

Eliminando el Bloqueo:

Lo último que debemos realizar será matar el proceso desde la linea de comando del sistema operativo:


[production@XXXXXXX ~]$ kill -9 11184


Y si nos logueamos nuevamente a la base y consultamos la v$lock nuevamente veremos que el SID que obtuvimos al principio ya no aparecerá listado.

No hay comentarios:

Publicar un comentario