Como determinar se uma tabela Oracle está bloqueada ou não?

22

Estamos usando o software de BI e um banco de dados de repositório instalado no Oracle Enterprise 11gR2.

Alguns desses relatórios em lote tentam acessar uma tabela de banco de dados que ainda pode estar bloqueada. Como posso descobrir se uma tabela do Oracle está bloqueada ou não? Existe alguma instrução SQL exibida como detalhes do histórico para análise?

Selahattin
fonte
Quero dizer, quero exibir as coisas dentro de um intervalo de tempo específico.
Selahattin 12/01
Por exemplo: desejo listar todas as tabelas bloqueadas entre 14:00 - 17:00 para análise posterior.
Selahattin 12/01
Geralmente eu quero encontrar tabelas bloqueadas no oracle?
Selahattin 12/01
1
@Selahattin Você está falando sobre um bloqueio no nível do aplicativo? Oracle não executam geralmente bloqueio tabela devido ao seu nível de serialização e projetar
Philᵀᴹ

Respostas:

32

A consulta a seguir fornece detalhes de todos os bloqueios.

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
fonte
10

O script a seguir pode ser usado para identificar rapidamente todos os objetos de bloqueio em seu 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;

Referência: -Dicas de oráculo da Burleson Consulting http://www.dba-oracle.com/t_find_oracle_locked_objects.htm

Ali786
fonte
2

Você pode consultar os objetos bloqueados no momento em V $ LOCKED_OBJECT .

No entanto, não há histórico para os bloqueios, o registro de todos os bloqueios causaria uma sobrecarga de desempenho enorme e muitos dados a serem armazenados.

O mais próximo que o banco de dados tem é o histórico de sessões ativas V $ ACTIVE_SESSION_HISTORY , DBA_HIST_ACTIVE_SESS_HISTORY (se você tiver a licença adequada para usá-lo), onde é possível visualizar sessões de bloqueio, instruções e outras informações, mas não tabelas bloqueadas. Caso contrário, você pode tentar consultar as visualizações apropriadas e salvar os dados necessários com seu próprio script personalizado.

Balazs Papp
fonte
2

Usando a consulta abaixo, você pode descobrir bloqueios na tabela.

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;

Bloqueios de bloqueio

santosh
fonte
0

Se você deseja liberar o bloqueio no objeto bloqueado, mate a sessão correspondente.

-- 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
fonte
0

Você pode verificar o bloqueio da tabela v$locke dba_objectsvisualizar. A consulta abaixo fornece os detalhes do bloqueio.

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;

Você pode usar a consulta abaixo, que fornecerá mais detalhes. Bloqueio de mesa

santosh
fonte