ओरेकल - किसी विशेष तालिका में बिना किसी परिवर्तन के देखने का कोई तरीका?


24

मैं वर्तमान में एक बैच प्रक्रिया के माध्यम से डिबगिंग कर रहा हूं जो बहुत सारे डीएमएल स्टेटमेंट करता है, लेकिन अभी एक कमिट नहीं करता है। लेन-देन के लिए प्रतिबद्ध नहीं होने पर, दूसरे सत्र से "लंबित" परिवर्तनों को देखने में सक्षम होना अच्छा होगा। क्या यह संभव है?

उदाहरण:

Insert into table myTable (col1, col2) values ("col1", "col2");

--Somehow view the pending transaction maybe by system view?....

...other DML statements....

commit;

इसे करने का एक से अधिक तरीका है। उदाहरण के लिए, यहाँ एसक्यूएल स्टेटमेंट हल कर सकते हैं: ducquoc.wordpress.com/2012/07/14/oracle-uncommited-changes गुड लक,

जवाबों:


18

आपके बैच प्रक्रिया के विवरण के आधार पर कुछ अलग-अलग दृष्टिकोण हैं और आप अनकांशस परिवर्तनों को देखने का प्रयास क्यों कर रहे हैं।

1) ओरेकल वर्कस्पेस मैनेजर एक ऐसा उपकरण है जिसे मूल रूप से ऐसे लोगों को विकसित करने के लिए डिज़ाइन किया गया है जो स्थानिक अनुप्रयोगों को विकसित कर रहे हैं, जिनके पास लंबे समय तक चलने वाले लेन-देन के बराबर है (यानी ऐसे लेनदेन जिनके लिए कई दिनों या हफ्तों के मनुष्यों की आवश्यकता हो सकती है जहां एक लेन-देन में पाइपलाइन चलाना है। )। आपकी बैच प्रक्रिया एक नया कार्यक्षेत्र बना सकती है (जो तार्किक रूप से एक नया लेन-देन बनाने की तरह है), जब भी वह चाहे, तो उस कार्यक्षेत्र में जो भी परिवर्तन करना चाहते हैं, वे करें। एक अलग सत्र में, आपको बैच प्रक्रिया के कार्यक्षेत्र में प्रवेश करने तक कोई भी परिवर्तन दिखाई नहीं देगा। जब बैच प्रक्रिया समाप्त हो जाती है, तो यह विलय कर सकता है कि यह कार्यक्षेत्र वापस लाइव कार्यक्षेत्र में हो सकता है जो लेनदेन करने के बराबर है।

2) DBMS_XA पैकेज का उपयोग आपको एक सत्र से दूसरे सत्र में "लेन-देन" करने और एक सत्र से दूसरे सत्र से शुरू होने वाले लेनदेन से जुड़ने की अनुमति देने के लिए किया जा सकता है। यह उपयोग करने के लिए एक सुंदर अस्पष्ट पैकेज है, लेकिन हाल ही में पीएल / एसक्यूएल चैलेंज ( इसका उपयोग करने के लिए आपको एक मुफ्त खाते की आवश्यकता हो सकती है) में इसका उपयोग करने का एक अच्छा उदाहरण था ।

3) यदि आप वास्तविक डेटा को देखने के बजाय केवल बैच प्रक्रिया की स्थिति देखने की कोशिश कर रहे हैं, तो बैच प्रक्रिया स्वायत्त लेनदेन का उपयोग करके लॉगिंग जानकारी लिख सकती है जिसे आप किसी अन्य सत्र से क्वेरी कर सकते हैं। या आप DBMS_APPLICATION_INFO पैकेज का उपयोग V $ SESSION और / या V $ SESSION_LONGOPS में विभिन्न विशेषताओं को अपडेट करने के लिए कर सकते हैं ताकि आप दूसरे सत्र से लोड की स्थिति की निगरानी कर सकें।


10

संपादित करें: यह प्रश्न स्पष्ट होने से पहले लिखा गया था

आप अपने स्वयं के बिना डेटा के टेबल को देखने के लिए फ्लैशबैक प्रश्नों का उपयोग कर सकते हैं ।

विचार करें:

SQL> CREATE TABLE my_table
  2  AS SELECT ROWNUM ID FROM dual CONNECT BY LEVEL <= 5;

Table created

SQL> INSERT INTO my_table VALUES (6);

1 row inserted

मेरे लेन-देन और तालिका के बीच अंतर को देखने के लिए जैसा कि मैं दूसरों के द्वारा देखा जा सकता है:

SQL> SELECT * FROM my_table
  2  MINUS
  3  SELECT * FROM my_table AS OF TIMESTAMP (systimestamp);

        ID
----------
         6

2
@jack: यह स्पष्ट नहीं है कि यदि ओपी अपने सत्र के बाहर बिना डेटा के देखना चाहता है (छद्म लिपि एकल सत्र में हो सकती है)। मेरा जवाब केवल एक टेबल पर अपने स्वयं के लंबित संशोधनों को देखने के लिए काम करेगा।
विंसेंट मालाग्रेट

आप सही हैं, क्षमा करें। बहुत बढ़िया जवाब।
जैक डगलस

8

हां - LogMiner ऐसा कर सकता है। वास्तव में, यदि आप केवल प्रतिबद्ध लेनदेन चाहते हैं, तो आपको विशेष रूप से आउटपुट को फ़िल्टर करना होगा! और वहाँ है TABLE_NAMEमें V$LOGMINER_CONTENTSहै कि आप एक ही मेज पर दिखाई देंगे।


8

ओरेकल के पास जो कुछ भी नहीं है वह एक पढ़ा हुआ अलग-थलग मोड है । दूसरे शब्दों में, आप किसी अन्य लेन-देन में बिना डेटा के क्वेरी नहीं कर पाएंगे।

लंबे समय से चल रहे लेन-देन के बारे में जानकारी प्राप्त करने के तरीके हैं - अभी तक उल्लेखित एक भी स्वायत्त लेनदेन नहीं है (जिसे सावधानी के साथ इस्तेमाल किया जाना चाहिए)


5

कोई प्रत्यक्ष विधि नहीं है; आपको या तो लॉग्स के माध्यम से पार्स करना होगा (जैसा कि एक अन्य उत्तर में बताया गया है), या एक लंबी चलने वाली प्रक्रिया में क्या हो रहा है, यह देखने के लिए वैकल्पिक तरीकों का उपयोग करें।

व्यक्तिगत रूप से, मैं इस सुविधा को सक्षम करने के लिए स्वायत्त लेनदेन का उपयोग करने का सुझाव देता हूं - लेन-देन पर ही नहीं, बल्कि एक लॉगिंग तंत्र के रूप में आपको यह बताता है कि क्या चल रहा है। उदाहरण के लिए, आपके पास PROCEDURE LONG_ACTION कॉल प्रक्रिया हो सकती है WRITE_LOG_ENTRY (जिसे एक स्वायत्त लेनदेन के रूप में परिभाषित किया गया है) जो VARCHAR2 को किसी अन्य तालिका में लिख देगा। स्वायत्त लेनदेन आपके वर्तमान लेन-देन (एक तार्किक दृष्टिकोण से, प्रदर्शन के संभावित प्रभावों से सावधान) के साथ हस्तक्षेप नहीं करते हैं और इसलिए आप देख सकते हैं कि आपके चालू लेनदेन में COMMIT या ROLLBACK की परवाह किए बिना आपकी लॉगिंग प्रविष्टियों के माध्यम से क्या हो रहा है। उस ने कहा, आप एक बड़े पैमाने पर डीएमएल बयान के साथ ऐसा कर सकते हैं; आपको एक लूप का उपयोग करना होगा।

विचार करें:

TABLE LOG_ENTRIES defined as
    activity_date  date,
    log_entry varchar2(2000)

TABLE BIG_JOB (definition doesn't really matter)

PROCEDURE WRITE_LOG_ENTRY
                        ( str VARCHAR2 )
IS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO LOG_ENTRIES VALUES ( SYSDATE, str );
    COMMIT;
END;

PROCEDURE LONG_ACTION IS
    c NUMBER;
BEGIN
    FOR r IN ( SELECT * FROM BIG_JOB )
    LOOP
       c := c + 1;
       UPDATE BIG_JOB z
          SET fld = hairy_calculation
        WHERE z.rowid = r.rowid;
       IF MOD(c,500) = 0 THEN
           WRITE_LOG_ENTRY ( c || ' rows processed.' );
       END IF;
    END LOOP;
    COMMIT;
END;

उपरोक्त को देखते हुए, आपको लंबी कार्रवाई की सफलता की परवाह किए बिना संसाधित की गई प्रत्येक 500 पंक्तियों के लिए एक लॉग प्रविष्टि मिलेगी। अगर आपको यह देखने के लिए डेटा की एक सटीक डुप्लिकेट की आवश्यकता है कि यह काम कर रहा है, तो मैं एक डुप्लिकेट तालिका बनाने और डेटा को डुप्लिकेट करने वाली प्रक्रिया (स्वायत्त लेनदेन होने वाली प्रक्रिया) को कॉल करने का सुझाव देता हूं। फिर इस तथ्य के बाद डेटा को न्यूक करें। (नकल की कोई आवश्यकता नहीं।)

इसके अलावा, यदि यह एक डिबगिंग उद्देश्य के लिए है, तो मैं सुझाव देता हूं कि जब चीजों का परीक्षण किया गया हो तो ऐसे लॉगिंग की आवश्यकता को कम करना या कम करना। और, हमेशा की तरह, परीक्षण, परीक्षण, अपने सिस्टम पर परीक्षण करें कि कैसे काम करेगा। (लॉग को अत्यधिक प्रभावित करने वाले प्रदर्शन के अच्छे उदाहरण के लिए Niall की टिप्पणी देखें।)

(अंत में, क्योंकि मैंने इससे पहले इसका उल्लेख करने की उपेक्षा की: स्वायत्त लेनदेन से सावधान रहें। लागू करने से पहले उन्हें पूरी तरह से समझें, और "सिर्फ इसलिए" उनका उपयोग न करें। उन्हें गलत तरीके से एक लाख तरीके से इस्तेमाल किया जा सकता है (उदाहरण के लिए, ATTEMPT को। ट्रिगर में एक म्यूट त्रुटि से बचें), इसलिए यदि संभव हो तो विकल्प ढूंढना हमेशा सबसे अच्छा होता है। यदि आप नहीं कर सकते हैं, तो सावधानी के साथ। लंबे समय तक चलने वाले ऑप्स के दौरान लॉगिंग हमेशा एक मामला रहा है जहां यह काफी सुरक्षित है (अनदेखी प्रदर्शन के मुद्दे), लेकिन परिणाम जानने के बिना इसे अन्य उपयोगों में लागू करने में जल्दबाजी न करें।)


1
इस सुझाव के अंत में मेरे लंबे जवाब (कोड के साथ) orawin.info/blog/2011/09/06/advice-from-the-internet पर आगे के विवरणों का पता लगाया गया है । संक्षेप में इस दृष्टिकोण को अपनाने से गंभीर और प्रतिकूल रूप से कोड को प्रभावित हो सकता है जो पहले से ही धीमा है।
नियाल लीचफील्ड

1
@ निल लीचफील्ड, हमेशा की तरह, जब इंटरनेट से सलाह लेते हैं, तो हमेशा परीक्षण, परीक्षण, परीक्षण करना चाहिए। जब उल्लेख किया गया है कि स्वायत्त लेनदेन लेनदेन को प्रभावित नहीं करता है, तो मैं इस तथ्य का उल्लेख कर रहा था कि यह आपके वर्तमान लेनदेन को कम या कम नहीं करता है; इसलिए एक तार्किक अर्थ में, यह आपके वर्तमान लेनदेन के लिए कुछ भी नहीं करता है। हां, निश्चित रूप से, ओरेकल ने चीजों को काम करने के लिए पीछे के काम किए हैं, जो प्रदर्शन की समस्याओं का मतलब हो सकता है, केवल लेन-देन के दृष्टिकोण से, स्वायत्त लेनदेन मेरे वर्तमान लेनदेन की स्थिति के रास्ते में नहीं आता है।
केर्री शॉट्स

@ निल लीचफील्ड, सभी ने कहा, स्वायत्त लेनदेन में समस्याओं का अपना उचित हिस्सा होता है (जिनमें से एक ऐसा होता है कि लोग उन्हें एक म्यूटिंग टेबल के आसपास पाने के लिए इस्तेमाल करने की कोशिश करते हैं), और इसलिए मैं उन्हें संयम से और सावधानी से सलाह देता हूं, और केवल समझ के साथ कि क्या हो रहा है।
केर्री शॉट्स

3

10g में उपलब्ध नहीं है, लेकिन DBMS_XA लेनदेन को कई सत्रों को पार करने की अनुमति दे सकता है। दूसरे सत्र का उपयोग करके देख सकते हैं कि लेनदेन में क्या खुशी है


3

यहां अन्य जानकारी के अलावा, एक अनकही लेन-देन के बारे में जानकारी भेजने के कुछ अतिरिक्त तरीके एक ईमेल भेजना या एक पाठ फ़ाइल में लिखना होगा।

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