Bloqueos en Oracle




Ver y matar Bloqueos en una BBDD

Un bloqueo sobre un objeto de una base de datos lo genera una transacción que hace operaciones que no son compatibles con otras transacciones. Por ejemplo: en un primer momento una transaccion actualiza un registro de una tabla, esto generará un bloqueo exclusivo sobre este registro, si otro proceso intentase actualizar la misma fila, este proceso se quedaría en espara del primero.

La siguiente consulta nos muestra transacciones que están esperando a que terminen otros transacciones. Estas transacciones están bloqueando tablas de la base de datos. Esta consulta puede ser un poco lenta dependiento del sistema, si te encuentras en ésta caso puedes ver el supapartado lentitud de v$lock

select /*+ rule */ lock1.sid, ' BLOQUEA ', lock2.sid, lock1.ctime/60 minutos_espera
from gv$lock lock1, gv$lock lock2
where lock1.block =1 and lock2.request > 0
and lock1.id1=lock2.id1
and lock1.id2=lock2.id2;

Para terminar con éstos bloqueos podemos matar las sesiones que están generando bloqueos mediante:

alter system kill session 'sid,serial#';

donde los campos sid y serial# los podemos sacar de la vista v$session

Para matar todos los procesos que están bloqueando en una base de datos, recomiendo crear una tabla con los SID que están bloqueando, de la forma:

create table bloqueos_drop as  select /*+ rule */ lock1.sid, lock2.sid as bloqueado
from gv$lock lock1, gv$lock lock2 where lock1.block =1 and lock2.request > 0
and lock1.id1=lock2.id1 and lock1.id2=lock2.id2;

Luego matamos todos los sid de la tabla que hemos creado bloqueos_drop

select 'alter system kill session ''' || s.sid||','|| s.serial# ||'''IMMEDIATE;'
from v$session s, v$session_wait sw, v$process p
where s.sid=sw.sid and s.paddr=p.addr and s.sid in (select sid from bloqueos_drop); 

Comentarios

Entradas populares de este blog

Ampliar tablespace Oracle

Oracle máximo de sesiones