जवाबों:
आपकी तालिका पहले से ही कुछ क्वेरी द्वारा लॉक है। उदाहरण के लिए, आपने "अपडेट के लिए चयन" निष्पादित किया हो सकता है और अभी तक कोई अन्य क्वेरी चयनित नहीं की / रोलबैक किया और निकाल दिया। अपनी क्वेरी निष्पादित करने से पहले एक कमिट / रोलबैक करें।
यहां से ORA-00054: संसाधन व्यस्त और NowAIT के साथ अधिग्रहण
आप sql, उपयोगकर्ता नाम, मशीन, पोर्ट जानकारी भी देख सकते हैं और वास्तविक प्रक्रिया से जुड़ सकते हैं जो कनेक्शन रखती है
SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM,S.USERNAME,
S.MACHINE,S.PORT , S.LOGON_TIME,SQ.SQL_FULLTEXT
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S,
V$PROCESS P, V$SQL SQ
WHERE L.OBJECT_ID = O.OBJECT_ID
AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR
AND S.SQL_ADDRESS = SQ.ADDRESS;
कृपया Oracle सत्र को मारें
सक्रिय सत्र जानकारी की जाँच करने के लिए क्वेरी के नीचे का उपयोग करें
SELECT
O.OBJECT_NAME,
S.SID,
S.SERIAL#,
P.SPID,
S.PROGRAM,
SQ.SQL_FULLTEXT,
S.LOGON_TIME
FROM
V$LOCKED_OBJECT L,
DBA_OBJECTS O,
V$SESSION S,
V$PROCESS P,
V$SQL SQ
WHERE
L.OBJECT_ID = O.OBJECT_ID
AND L.SESSION_ID = S.SID
AND S.PADDR = P.ADDR
AND S.SQL_ADDRESS = SQ.ADDRESS;
जैसे मारना
alter system kill session 'SID,SERIAL#';
(उदाहरण के लिए alter system kill session '13,36543'
;)
संदर्भ http://abeytom.blogspot.com/2012/08/finding-and-fixing-ora-00054-resource.html
CONNECT
और है RESOURCE
, लेकिन मेरे पास जो भी खाता है, उसकी जरूरत नहीं है, और कहता है ORA-00942: table or view does not exist
। इस धागे को पढ़ने वाले सभी के पास SYS
खाता नहीं होगा।
alter system kill session '13,36543'
समय समाप्त हो जाएगा और सत्र मर नहीं जाएगा। उस मामले में देखें: stackoverflow.com/a/24306610/587365
connection object
में python
मैं कुछ त्रुटि मिली। फिर python script
ठीक से बंद किए बिना बंद कर दिया जाता है connection object
। जब मैं दूसरे सत्र में तालिका को छोड़ने का प्रयास करता हूं तो मुझे "LOCKWAIT" त्रुटि मिल रही है। जब मैं कोशिश करता kill session
हूं तो मेरे पास पर्याप्त निजीकरण नहीं है। इससे छुटकारा पाने के लिए और क्या किया जा सकता है?
इस समस्या के लिए आस-पास बहुत आसान काम है।
यदि आप अपने सत्र पर 10046 ट्रेस चलाते हैं (यह समझाने के लिए बहुत अधिक ...)। आप देखेंगे कि किसी भी DDL ऑपरेशन से पहले Oracle निम्नलिखित कार्य करता है:
LOCK TABLE 'TABLE_NAME' NO WAIT
इसलिए यदि किसी अन्य सत्र में एक खुला लेनदेन होता है तो आपको एक त्रुटि मिलती है। तो तय है ... ड्रम रोल कृपया। DDL से पहले अपना स्वयं का लॉक जारी करें और 'NO WAIT' छोड़ दें।
विशेष लेख:
यदि आप विभाजन को विभाजित कर रहे हैं / विभाजन कर रहे हैं तो विभाजन को बंद कर देता है। - तो यो विभाजन विभाजन को बंद कर सकता है।
इसलिए ... निम्नलिखित चरण समस्या को ठीक करते हैं।
डीएमएल स्टेटमेंट 'प्रतीक्षा' करेगा या जैसा कि टेबल लॉक होने के दौरान डेवलपर्स इसे 'हैंग' कहते हैं।
मैं इसका उपयोग कोड में करता हूं जो विभाजन छोड़ने के लिए नौकरी से चलता है। यह बढ़िया काम करता है। यह एक डेटाबेस में है जो लगातार कई सौ आवेषण / सेकंड की दर से सम्मिलित कर रहा है। त्रुटियाँ नहीं।
अगर आप सोच रहे हैं। ऐसा करने से 11 ग्रा। मैंने पहले भी 10 जी में ऐसा किया है।
KILL SESSION
इन लोगों के लिए सही उत्तर है।
set_ddl_timeout
और यह क्या होना चाहिए?
यह त्रुटि तब होती है जब संसाधन व्यस्त होता है। जाँच करें कि क्या आपके पास क्वेरी में कोई संदर्भ संबंधी बाधाएँ हैं। या यहां तक कि आपके द्वारा क्वेरी में उल्लिखित तालिकाएं व्यस्त हो सकती हैं। वे कुछ अन्य नौकरी से जुड़े हो सकते हैं जो निश्चित रूप से निम्नलिखित क्वेरी परिणामों में सूचीबद्ध होंगे:
SELECT * FROM V$SESSION WHERE STATUS = 'ACTIVE'
SID ढूँढें,
SELECT * FROM V$OPEN_CURSOR WHERE SID = --the id
ORA-00942: table or view does not exist
।
यह तब होता है जब तालिका को बदलने के लिए उपयोग किए जाने वाले सत्र के अलावा कोई सत्र डीएमएल (अपडेट / डिलीट / इंसर्ट) के कारण लॉक होने की संभावना रखता है। यदि आप एक नई प्रणाली विकसित कर रहे हैं, तो यह संभावना है कि आप या आपकी टीम में कोई व्यक्ति अपडेट स्टेटमेंट जारी करता है और आप बहुत परिणाम के बिना सत्र को मार सकते हैं। या आप उस सत्र से प्रतिबद्ध हो सकते हैं जब आप जानते हैं कि किसके पास सत्र खुला है।
यदि आपके पास SQL व्यवस्थापक सिस्टम तक पहुंच है, तो इसका उपयोग आपत्तिजनक सत्र खोजने के लिए कर सकते हैं। और शायद इसे मार दें।
आप v $ सत्र और v $ लॉक और अन्य का उपयोग कर सकते हैं, लेकिन मैं आपको सुझाव देता हूं कि उस सत्र को कैसे खोजना है और फिर इसे कैसे मारना है।
एक उत्पादन प्रणाली में, यह वास्तव में निर्भर करता है। Org 10g और पुराने के लिए, आप निष्पादित कर सकते हैं
LOCK TABLE mytable in exclusive mode;
alter table mytable modify mycolumn varchar2(5);
एक अलग सत्र में, लेकिन निम्नलिखित मामले में तैयार होने में बहुत लंबा समय लगता है।
alter system kill session '....
यह इस बात पर निर्भर करता है कि आपके पास क्या सिस्टम है, पुराने सिस्टम में हर एक बार कमिटमेंट नहीं होने की संभावना है। यह एक समस्या है क्योंकि लंबे समय तक ताले हो सकते हैं। तो आपका लॉक किसी भी नए ताले को रोक देगा और एक लॉक का इंतजार करेगा जो जानता है कि कब जारी किया जाएगा। इसीलिए आपके पास दूसरा वक्तव्य तैयार है। या आप PLSQL स्क्रिप्ट की तलाश कर सकते हैं जो कि इसी तरह की चीजें स्वचालित रूप से करती हैं।
संस्करण 11 जी में एक नया पर्यावरण चर है जो प्रतीक्षा समय निर्धारित करता है। मुझे लगता है कि यह संभव है कि जैसा मैंने वर्णित किया है वैसा ही कुछ हो। ध्यान रहे कि लॉकिंग मुद्दे दूर नहीं जाते हैं।
ALTER SYSTEM SET ddl_lock_timeout=20;
alter table mytable modify mycolumn varchar2(5);
अंत में इस तरह के रखरखाव के लिए सिस्टम में कुछ उपयोगकर्ता होने तक इंतजार करना सबसे अच्छा हो सकता है।
alter system kill session '....
यदि आप प्रबंधन के विचारों तक पहुंच नहीं रखते हैं , तो आप सत्र को कैसे मार सकते हैं?
मेरे मामले में, मुझे पूरा यकीन था कि यह मेरे अपने सत्रों में से एक था जो अवरुद्ध था। इसलिए, निम्न कार्य करना सुरक्षित था:
मुझे इसके साथ अपमानजनक सत्र मिला:
SELECT * FROM V$SESSION WHERE OSUSER='my_local_username';
सत्र निष्क्रिय था , लेकिन फिर भी इसने किसी तरह ताला बंद कर दिया। ध्यान दें, यदि आप कुछ अन्य उपयोग करना पड़ सकता है कि जहां आपके मामले में हालत (जैसे की कोशिश USERNAME
या MACHINE
क्षेत्रों)।
सत्र का उपयोग करते हुए ID
और SERIAL#
ऊपर प्राप्त किया गया:
alter system kill session '<id>, <serial#>';
@Thermz द्वारा संपादित: यदि पिछले खुले सत्र में से कोई भी काम नहीं करता है, तो यह प्रयास करें। सत्र की हत्या करते समय यह क्वेरी आपको सिंटैक्स त्रुटियों से बचने में मदद कर सकती है:
SELECT 'ALTER SYSTEM KILL SESSION '''||SID||','||SERIAL#||''' immediate;' FROM V$SESSION WHERE OSUSER='my_local_username_on_OS'
बस सत्र को पकड़ने की प्रक्रिया की जाँच करें और इसे मार दें। वापस सामान्य करने के लिए।
एसक्यूएल के नीचे आपकी प्रक्रिया मिलेगी
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.program FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id;
फिर इसे मार डालो
ALTER SYSTEM KILL SESSION 'sid,serial#'
या
कुछ उदाहरण जो मुझे ऑनलाइन मिले हैं, उदाहरण के लिए आईडी आईडी के साथ-साथ सिस्टम किल सेशन '130,620, @ 1' की जरूरत है;
आपकी समस्या यह लगती है कि आप DML और DDL संचालन को मिला रहे हैं। यह URL देखें जो इस समस्या की व्याख्या करता है:
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;
ALTER SYSTEM KILL SESSION 'sid,serial#';
मैं केवल एक टेबल बनाते समय इस त्रुटि को मारने में कामयाब रहा! एक मेज पर स्पष्ट रूप से कोई विवाद की समस्या नहीं थी जो अभी तक मौजूद नहीं थी। CREATE TABLE
बयान एक निहित CONSTRAINT fk_name FOREIGN KEY
एक अच्छी तरह से आबादी वाले तालिका संदर्भित खंड। मुझे करना पड़ा:
novalidate
खंड जोड़ा alter table add constraint
। यह किसी तरह इसे चलाने देता है, लेकिन यह लॉक हो जाता है। फिर मैंने सत्र के ताले को देखा कि यह किस सत्र में बंद है। और फिर मैंने उस सत्र को मार दिया।
मुझे यह त्रुटि तब हुई जब मेरे पास 2 स्क्रिप्ट थीं जो मैं चला रहा था। मैं था:
मैंने टेबल ड्रॉप चलाया, फिर खाता # 1 के रूप में टेबल क्रिएट किया। मैंने # 2 के सत्र में एक टेबल अपडेट चलाया। बदलाव नहीं किया। खाता # 1 के रूप में तालिका ड्रॉप / निर्माण स्क्रिप्ट को फिर से चलाया। drop table x
कमांड पर त्रुटि हुई ।
मैंने इसे COMMIT;
खाता * 2 के SQL * प्लस सत्र में चलाकर हल किया ।
COMMIT;
। यदि आप एक तालिका भी नहीं छोड़ सकते हैं, तो आपके पास ऐसी कोई भी चीज़ को बदलने की अनुमति नहीं है जो आपको इस मुद्दे पर पहली बार में आएगी।
मैं भी इसी तरह के मुद्दे का सामना करता हूं। इस त्रुटि को हल करने के लिए कुछ भी प्रोग्रामर को नहीं करना है। मैंने अपने ओरेकल डीबीए टीम को सूचित किया। उन्होंने सत्र को मार दिया और एक आकर्षण की तरह काम किया।
शशि के लिंक द्वारा दिया गया समाधान सबसे अच्छा है ... dba या किसी और से संपर्क करने की आवश्यकता नहीं है
एक बैकअप बनाओ
create table xxxx_backup as select * from xxxx;
सभी पंक्तियों को हटा दें
delete from xxxx;
commit;
अपना बैकअप डालें।
insert into xxxx (select * from xxxx_backup);
commit;