viernes, 5 de octubre de 2007

Oracle : Tablas y objetos bloqueados

Para obtener una lista con los objetos bloqueados ejecucutados:

select substr(a.os_user_name,1,8) "OS User"
, substr(b.object_name,1,30) "Object Name"
, substr(b.object_type,1,8) "Type"
, substr(c.segment_name,1,10) "RBS"
, e.process "PROCESS"
, substr(d.used_urec,1,8) "# of Records"
, e.sid
, e.serial#
, p.*
from v$locked_object a
, dba_objects b
, dba_rollback_segs c
, v$transaction d
, v$session e
, v$process p
where a.object_id = b.object_id
and a.xidusn = c.segment_id
and a.xidusn = d.xidusn
and a.xidslot = d.xidslot
and d.addr = e.taddr
and p.addr = e.paddr


Si intentamos por ejemplo hacer un "drop table" obtendremos un error del tipo ORA-00054: recurso ocupado y obtenido con NOWAIT.

Para desbloquear uno de los objetos usamos alguna de las siguientes sentencias

ALTER SYSTEM DISCONNECT SESSION 'SID, SERIAL' IMMEDIATE;

o bien

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
En el caso de que no finalice el proceso podemos matarlo desde el SO. Para ello utilizaremos lo siguiente desde un entorno linux:

kill -9 SPID
Donde el SPID lo podemos obtener en la consulta escrita anteriormente.

4 comentarios:

cuevasljc dijo...

Gracia me salvaron la vida me funciona el de maravilla

Dante dijo...

Me sirvio gracias!

Leo ktupq dijo...

graciasssss

Bernardo Quinteros dijo...

gracias me sirvio de lo lindo :)