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