¿Cómo determinar si una tabla de Oracle está bloqueada o no?

22

Hemos estado utilizando software de BI y una base de datos de repositorio que está instalada en Oracle Enterprise 11gR2.

Algunos de estos informes por lotes intentarán acceder a una tabla de base de datos que aún puede estar bloqueada. ¿Cómo puedo saber si una tabla de Oracle está bloqueada o no? ¿Hay alguna instrucción SQL que se muestre como detalles del historial para el análisis?

Selahattin
fuente
Quiero decir que quiero mostrar cosas dentro de un intervalo de tiempo específico.
Selahattin
Por ejemplo: quiero enumerar todas las tablas bloqueadas entre las 02:00:00 p.m. y las 05:00:00 p.m. para un análisis más detallado.
Selahattin
En general, quiero encontrar tablas bloqueadas en Oracle?
Selahattin
1
@Selahattin ¿Estás hablando de un bloqueo de nivel de aplicación? Oracle generalmente no realiza el bloqueo de tablas debido a su nivel de serialización y diseño
Philᵀᴹ

Respuestas:

32

La siguiente consulta proporciona detalles de todos los bloqueos.

SELECT B.Owner, B.Object_Name, A.Oracle_Username, A.OS_User_Name  
FROM V$Locked_Object A, All_Objects B
WHERE A.Object_ID = B.Object_ID
Ravindra Reddy
fuente
10

El siguiente script se puede utilizar para identificar rápidamente todos los objetos de bloqueo dentro de su sistema Oracle.

select
   c.owner,
   c.object_name,
   c.object_type,
   b.sid,
   b.serial#,
   b.status,
   b.osuser,
   b.machine
from
   v$locked_object a ,
   v$session b,
   dba_objects c
where
   b.sid = a.session_id
and
   a.object_id = c.object_id;

Referencia: -Oracle Tips por Burleson Consulting http://www.dba-oracle.com/t_find_oracle_locked_objects.htm

Ali786
fuente
2

Puede consultar los objetos actualmente bloqueados desde V $ LOCKED_OBJECT .

Sin embargo, no hay historial para los bloqueos, el registro de todos los bloqueos generaría una sobrecarga de rendimiento enorme y una gran cantidad de datos para almacenar.

Lo más cercano que tiene la base de datos es el historial de sesión activa V $ ACTIVE_SESSION_HISTORY , DBA_HIST_ACTIVE_SESS_HISTORY (si tiene la licencia adecuada para usarlo), donde puede ver sesiones de bloqueo, declaraciones y otra información, pero no tablas bloqueadas. De lo contrario, puede intentar consultar las vistas apropiadas y guardar los datos necesarios con su propio script personalizado.

Balazs Papp
fuente
2

Usando la consulta a continuación, puede encontrar bloqueos en la tabla.

column oracle_username format a15;
column os_user_name format a15;
column object_name format a37;
column object_type format a37;
select a.session_id,a.oracle_username, a.os_user_name, b.owner "OBJECT OWNER", b.object_name,b.object_type,a.locked_mode from 
(select object_id, SESSION_ID, ORACLE_USERNAME, OS_USER_NAME, LOCKED_MODE from v$locked_object) a, 
(select object_id, owner, object_name,object_type from dba_objects) b
where a.object_id=b.object_id;

Bloqueo de cerraduras

santosh
fuente
0

Si desea liberar el bloqueo del objeto bloqueado, elimine la sesión correspondiente.

-- Query to Get List of all locked objects
SELECT B.Owner, B.Object_Name, A.Oracle_Username, A.OS_User_Name  
FROM V$Locked_Object A, All_Objects B
WHERE A.Object_ID = B.Object_ID ; 
-- and A.OS_USER_NAME = 'mahendar' 

-- Query to Get List of locked sessions        
select SID,SERIAL#,INST_ID from gv$session a  where schemaname = 'SYSTEM';
-- and osuser =  'mahendar';
-- o/p: 314 26513   1

-- Statement to Kill the session [pass values in the same order and append @ for inst_id]
alter system kill session '314,26513,@1';
mahi_0707
fuente
0

Puede verificar el bloqueo de la tabla desde v$locky dba_objectsver. La consulta a continuación le dará los detalles del bloqueo.

select a.sid||'|'|| a.serial#||'|'|| a.process
from v$session a, v$locked_object b, dba_objects c
where b.object_id = c.object_id
and a.sid = b.session_id
and OBJECT_NAME=upper('&TABLE_NAME');

Consulta 2:

select
(select username from v$session where sid=a.sid) blocker,
a.sid,
' is blocking ',
(select username from v$session where sid=b.sid) blockee,
b.sid
from
v$lock a,
v$lock b
where
a.block = 1
and
b.request > 0
and
a.id1 = b.id1
and
a.id2 = b.id2;

Puede usar la consulta a continuación que le dará más detalles. Bloqueo de mesa

santosh
fuente