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?
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
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 by Burleson Consulting http://www.dba-Oracle.com/t_find_Oracle_locked_objects.htm
Vous pouvez interroger les objets actuellement verrouillés depuis V $ LOCKED_OBJECT .
Cependant, il n'y a pas d'historique pour les verrous, la journalisation de tous les verrous entraînerait une énorme surcharge de performances 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 de 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é.
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;
Vous pouvez vérifier le verrouillage de la table depuis v$lock
et dba_objects
vue. 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
Si vous souhaitez déverrouiller le verrou sur un objet verrouillé, supprimez 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';