क्या डेटाबेस लिंक पर क्वेरी के लिए कोई समय-सीमा है?


11

संपादित करें / प्रस्तावना: यह प्रश्न SO से माइग्रेट किया गया है क्योंकि मैं विशेष रूप से DB लिंक प्रश्नों पर टाइमआउट के सवाल पर दिलचस्पी रखता हूं। SO से प्रदान किया गया वर्कअराउंड कुछ हद तक ठीक है, लेकिन मैं वास्तव में इस सवाल में दिलचस्पी रखता हूं।

प्रेरणा:
मैंने एक क्वेरी "हमेशा के लिए" (2 दिन से अधिक, जब तक मैंने सत्र को मार दिया) चला रहा था, जो डेटाबेस लिंक का उपयोग कर रहा था। समस्या यह प्रतीत होती है कि दूरस्थ डेटाबेस अनुपलब्ध हो गया है और कुछ कारणों से अभी तक कोई कारण नहीं ORA-02068उठाया गया है (यहां चर्चा नहीं की जानी चाहिए) और क्वेरी बस इंतजार और इंतजार कर रही थी।

(क्वेरी dbms_scheduler जॉब द्वारा जारी की जाती है, जो PL / SQL पैकेज में एक प्रक्रिया निष्पादित करता है। परिणाम के रूप में, नौकरी भी अटक गई थी। लेकिन इस प्रश्न के मूल के लिए विशेष रुचि नहीं है)

मैंने अपने परीक्षण DBs में से एक को मोड में डालकर इस स्थिति का अनुकरण किया है और इसे एक डेटाबेस लिंक पर छोड़ दिया है। जैसा कि अनुमान था, क्वेरी तब तक प्रतीक्षा कर रही थी जब तक कि मैन्युअल रूप से रद्द न कर दी गई हो या रिमोट DB अनछुए न हो।

प्रश्न:
रिमोट डेटाबेस के व्यवहार और अप-टाइम पर मेरा कोई नियंत्रण नहीं है, इसलिए मैं एक क्वेरी पर एक टाइमआउट सेट करने के लिए कुछ संभावना की तलाश में हूं जो डेटाबेस लिंक का उपयोग कर रहा है।

मैंने पहले से ही प्रोफ़ाइल ( CPU_PER_CALLआदि), sqlnet.oraमापदंडों में देखा है, कनेक्टिंग स्ट्रिंग में सीधे स्थानीय नामकरण मापदंडों को जोड़ना (जैसे (connect_timeout=10)डेटाबेस लिंक परिभाषा में जोड़ना ), के साथ एक कमांड चलाना ... for update wait 1, लेकिन वे या तो व्यस्त या निष्क्रिय सत्र के लिए काम करते हैं, लेकिन नहीं प्रतीक्षा में सत्र के लिए।

इसलिए मैं डेटाबेस लिंक के "स्थानीय" पक्ष पर कुछ विकल्प की तलाश में हूं, जो डेटाबेस लिंक पर प्रश्नों के लिए टाइमआउट सेट करता है।
कुछ समाधान जैसे alter session set xyzया select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)सराहना की जाएगी, क्योंकि मेरे पास इन विशेष डीबी पर कोई डीबीए अधिकार नहीं है।

मैं वर्तमान में 10gR2 पर हूं, लेकिन कुछ ही हफ्तों में 11gR2 में अपग्रेड कर रहा हूं, इसलिए इनमें से किसी भी संस्करण के लिए विचार उपयोगी होंगे।


क्वेरी का उपयोग कैसे किया जाता है? एक बड़ी प्रक्रिया / पैकेज का एक हिस्सा, एक बाहरी दृश्य से चलाने के लिए एक चटाई दृश्य के लिए अंतर्निहित SQL, ...? मुझे एक सरल "प्रतीक्षा XXX" सिंटैक्स का पता नहीं है, आपके समाधान को एक बड़े कार्यक्रम का हिस्सा बनने की आवश्यकता हो सकती है, आपके उपयोग पर निर्भर करता है।

क्वेरी dbms_scheduler कार्य द्वारा जारी की जाती है, जो पीएल / एसक्यूएल पैकेज में एक प्रक्रिया निष्पादित करता है। (उस के साथ अद्यतन सवाल)
GWu

जवाबों:


4

चूंकि आप dbms_scheduler का उपयोग कर रहे हैं, तो आप कुछ सीमा तक कार्य की max_run_duration विशेषता सेट कर सकते हैं , और उसके बाद शेड्यूलर ईमेल आपके पास हो सकता है यदि वह घटना सामने आई है। दृश्यों के पीछे ओरेकल कतारबद्ध तालिकाओं का उपयोग करता है (जो आपको एक घटना के होने पर आग पैदा करने वाली नौकरियों को बनाने में सक्षम कर सकता है , यदि आप अपनी प्रतिक्रिया के आसपास अधिक स्वचालन करने के लिए अतिरिक्त कदम उठाना चाहते थे)। लेकिन मूल रूप से ऐसी कोई भी नौकरी जो आपके सेटअप पर चलने वाली max_run_duration पर चलती है: इवेंट प्रकार: JOB_OVER_MUN_UR

ईमेल टुकड़ा 11gr2 में बनाया गया है, अच्छे राइटअप के लिए यहां देखें ।

उम्मीद है की वो मदद करदे।


महान विचार, धन्यवाद! यह वास्तव में DB लिंक पर टाइमआउट पर विशिष्ट प्रश्न का उत्तर नहीं है, लेकिन मुझे लगता है कि यह मेरे प्रारंभिक मुद्दे को वैसे भी हल करता है, इसलिए +1 :-)। मैं max_run_duration के बारे में नहीं जानता था और इससे शुरू करके मैंने पाया कि कैसे लटका हुआ काम रोकना और छोड़ना है ( forum.oracle.com/forums/thread.jspa?threadID=521939#2002982 )
गेरु

किसी कारण से मैं max_run_durationइस घटना को नहीं उठा पा रहा हूँ, इसलिए मैंने एक नया सवाल यहाँ रखा
GWu

0

मैं यह नहीं कह रहा हूं कि मेरे पास एक समाधान है, लेकिन मैं इस बात पर भी अधिक चर्चा करना चाहूंगा कि एक डब्लिंक टाइमआउट को कैसे नियंत्रित किया जाए। मुझे लगता है कि यह उस घटना को लिखने के लिए बोधगम्य हो सकता है जो एक घटना को आग लगाती है, या एक टीएनएस टाइमआउट घटना की प्रतीक्षा करती है, और फिर निष्पादित होती है:

ALTER SESSION CLOSE DATABASE LINK dblink;

आप इससे पहले दूरस्थ सर्वर को पोल कर सकते हैं:

select * from dual@dblink

यह जाँचने के लिए कि क्या उपलब्ध है, लेकिन यह रिमोट पर बहुत लंबे समय तक चलने वाले कोड के मुद्दे को ठीक नहीं करता है। खराब रिमोट कोड को प्रतीक्षा घटनाओं को फायर करना चाहिए, इसलिए मुझे लगता है कि वे फंस सकते हैं (यहां तक ​​कि 12 सी में वर्ग स्तर पर)। यह अभी भी हमें समय-समय पर एक dblink सत्र के लिए मजबूर करने का एक सुरुचिपूर्ण समाधान नहीं देता है।

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