यह कैसे निर्धारित किया जाए कि कोई ओरेकल टेबल लॉक है या नहीं?


22

हम बीआई सॉफ्टवेयर और एक रिपॉजिटरी डेटाबेस का उपयोग कर रहे हैं जो ओरेकल एंटरप्राइज 11 जीआर 2 पर स्थापित हैं।

इन बैच रिपोर्टों में से कुछ एक डेटाबेस तालिका तक पहुंचने की कोशिश करेंगे जो अभी भी लॉक हो सकते हैं। मैं कैसे पता लगा सकता हूं कि कोई ओरेकल टेबल लॉक है या नहीं? क्या कोई एसक्यूएल स्टेटमेंट है जो विश्लेषण के लिए इतिहास विवरण की तरह प्रदर्शित होता है?


मेरा मतलब है कि मैं विशिष्ट समय अंतराल के भीतर चीजों को प्रदर्शित करना चाहता हूं।
सेलाहट्टिन

उदाहरण के लिए: मैं आगे के विश्लेषण के लिए 02:00:00 अपराह्न - 05:00:00 बजे के बीच सभी बंद तालिकाओं को सूचीबद्ध करना चाहता हूं।
सेलहट्टिन

आम तौर पर मैं ओरेकल में बंद तालिकाओं को ढूंढना चाहता हूं?
सेलहट्टिन

1
@Selahattin क्या आप किसी एप्लिकेशन स्तर के लॉक के बारे में बात कर रहे हैं? ओरेकल आम तौर पर अपने क्रमांकन स्तर और डिज़ाइन के कारण टेबल लॉकिंग नहीं करता है
फिलो

जवाबों:


32

निम्नलिखित क्वेरी सभी तालों का विवरण देती है।

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

निम्न स्क्रिप्ट का उपयोग आपके ओरेकल सिस्टम में सभी लॉक ऑब्जेक्ट्स को जल्दी से पहचानने के लिए किया जा सकता है।

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;

संदर्भ: -बर्ल्स कंसल्टिंग द्वारा अंकल टिप्स http://www.dba-oracle.com/t_find_oracle_locked_object.htm


2

आप वर्तमान में V $ LOCKED_OBJECT से लॉक की गई वस्तुओं को क्वेरी कर सकते हैं ।

हालांकि ताले के लिए कोई इतिहास नहीं है, सभी तालों को लॉग करने से भारी प्रदर्शन खत्म हो जाएगा और बहुत सारा डेटा संग्रहीत किया जाएगा।

निकटतम डेटाबेस है कि सक्रिय सत्र इतिहास V $ ACTIVE_SESSION_HISTORY , DBA_HIST_ACTIVE_SESS_HISTORY (यदि आपके पास इसका उपयोग करने के लिए उचित लाइसेंस है), जहां आप अवरुद्ध सत्र, कथन और अन्य जानकारी देख सकते हैं, लेकिन लॉक किए गए टेबल नहीं। अन्यथा आप उपयुक्त दृश्यों को क्वेरी करने और अपने स्वयं के, कस्टम स्क्रिप्ट के साथ आवश्यक डेटा को सहेजने का प्रयास कर सकते हैं।


2

नीचे दी गई क्वेरी का उपयोग करके आप टेबल पर ताले लगा सकते हैं।

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;

ताले लगाना


0

यदि आप लॉक किए गए ऑब्जेक्ट पर लॉक जारी करना चाहते हैं, तो संबंधित सत्र को मार दें।

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

आप टेबल लॉक को देख सकते हैं v$lockऔर dba_objectsदेख सकते हैं। नीचे क्वेरी आपको लॉक विवरण देगी।

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

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

आप नीचे क्वेरी का उपयोग कर सकते हैं जो आपको अधिक विवरण देगा। टेबल लॉक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.