Wie kann man feststellen, ob eine Oracle-Tabelle gesperrt ist oder nicht?

22

Wir haben BI-Software und eine Repository-Datenbank verwendet, die auf Oracle Enterprise 11gR2 installiert sind.

Einige dieser Stapelberichte versuchen, auf eine Datenbanktabelle zuzugreifen, die möglicherweise noch gesperrt ist. Wie kann ich herausfinden, ob eine Oracle-Tabelle gesperrt ist oder nicht? Gibt es eine SQL-Anweisung, die Verlaufsdetails für die Analyse anzeigt?

Selahattin
quelle
Ich meine, ich möchte Dinge innerhalb eines bestimmten Zeitintervalls anzeigen.
Selahattin
Zum Beispiel: Ich möchte alle gesperrten Tabellen zwischen 14.00 und 17.00 Uhr zur weiteren Analyse auflisten.
Selahattin
Im Allgemeinen möchte ich gesperrte Tabellen in Oracle finden?
Selahattin
1
@ Selahattin Sprechen Sie über eine Sperre auf Anwendungsebene? Oracle führt aufgrund seiner Serialisierungsstufe und seines Designs im Allgemeinen keine Tabellensperrung durch
Philᵀᴹ

Antworten:

32

Die folgende Abfrage enthält Details zu allen Sperren.

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

Das folgende Skript kann verwendet werden, um alle Sperrobjekte in Ihrem Oracle-System schnell zu identifizieren.

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;

Referenz: -Oracle Tips von Burleson Consulting http://www.dba-oracle.com/t_find_oracle_locked_objects.htm

Ali786
quelle
2

Sie können die aktuell gesperrten Objekte in V $ LOCKED_OBJECT abfragen .

Es gibt jedoch keinen Verlauf für die Sperren, da das Protokollieren aller Sperren einen hohen Leistungsaufwand verursachen und viele Daten gespeichert werden müssen.

Das Protokoll für aktive Sitzungen in der Datenbank ist das Protokoll für aktive Sitzungen V $ ACTIVE_SESSION_HISTORY , DBA_HIST_ACTIVE_SESS_HISTORY (sofern Sie über die entsprechende Lizenz verfügen), in dem Sie blockierende Sitzungen, Anweisungen und andere Informationen, jedoch keine gesperrten Tabellen anzeigen können. Andernfalls können Sie versuchen, die entsprechenden Ansichten abzufragen und die erforderlichen Daten mit Ihrem eigenen benutzerdefinierten Skript zu speichern.

Balazs Papp
quelle
2

Mit der folgenden Abfrage können Sie Sperren für die Tabelle ermitteln.

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;

Sperren

Santosh
quelle
0

Wenn Sie die Sperre für gesperrte Objekte aufheben möchten, beenden Sie die entsprechende Sitzung.

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

Sie können die Tabellensperre überprüfen v$lockund dba_objectsanzeigen. Die folgende Abfrage gibt Ihnen die Details der Sperre.

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

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

Sie können die folgende Abfrage verwenden, um weitere Details zu erhalten. Tischsperre

Santosh
quelle