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
Publicar un comentario