Comment déterminer si une table Oracle est verrouillée ou non?


22

Nous utilisons un logiciel de BI et une base de données de référentiel installés sur Oracle Enterprise 11gR2.

Certains de ces rapports par lots tenteront d'accéder à une table de base de données qui peut toujours être verrouillée. Comment savoir si une table Oracle est verrouillée ou non? Existe-t-il une instruction SQL qui s'affiche comme les détails de l'historique à analyser?


Je veux dire que je veux afficher les choses dans un intervalle de temps spécifique.
Selahattin

Par exemple: je souhaite répertorier toutes les tables verrouillées entre 14h00 et 17h00 pour une analyse plus approfondie.
Selahattin

En général, je veux trouver des tables verrouillées dans Oracle?
Selahattin

1
@Selahattin Parlez-vous d'un verrou au niveau de l'application? Oracle n'effectue généralement pas le verrouillage de table en raison de son niveau de sérialisation et de sa conception
Philᵀᴹ

Réponses:


32

La requête suivante donne des détails sur tous les verrous.

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

10

Le script suivant peut être utilisé pour identifier rapidement tous les objets de verrouillage dans votre système 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;

Référence: -Oracle Tips par Burleson Consulting http://www.dba-oracle.com/t_find_oracle_locked_objects.htm


2

Vous pouvez interroger les objets actuellement verrouillés à partir de V $ LOCKED_OBJECT .

Il n'y a pas d'historique pour les verrous cependant, la journalisation de tous les verrous entraînerait une surcharge de performances énorme et beaucoup de données à stocker.

La base de données la plus proche est l'historique de session active V $ ACTIVE_SESSION_HISTORY , DBA_HIST_ACTIVE_SESS_HISTORY (si vous avez la licence appropriée pour l'utiliser), où vous pouvez afficher les sessions de blocage, les instructions et d'autres informations, mais pas les tables verrouillées. Sinon, vous pouvez essayer d'interroger les vues appropriées et enregistrer les données nécessaires avec votre propre script personnalisé.


2

En utilisant la requête ci-dessous, vous pouvez trouver des verrous sur la table.

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;

Verrous de blocage


0

Si vous souhaitez libérer le verrou sur un objet verrouillé, alors tuez la session correspondante.

-- 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';

0

Vous pouvez vérifier verrou de table à partir v$locket dba_objectsvue. La requête ci-dessous vous donnera les détails du verrou.

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');

REQUÊTE 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;

Vous pouvez utiliser la requête ci-dessous qui vous donnera plus de détails. Verrou de table

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.