2009-09-08 11 views
6

हटाने में असमर्थ मैं अपनी तालिकाओं में से एक में 11 जी अंतराल विभाजन सुविधा का उपयोग कर रहा हूं। मैंने इसे टाइमस्टैंप फ़ील्ड पर 1 दिन विभाजन बनाने के लिए सेट किया और 3 महीने पुराना डेटा हटाने के लिए एक नौकरी बनाई। जब मैं सबसे पुराने विभाजन मैं निम्नलिखित त्रुटि मिलती है हटाने का प्रयास:सबसे पुराना टेबल विभाजन

ORA-14758: Last partition in the range section cannot be dropped

मैंने सोचा है कि "अंतिम" नवीनतम विभाजन और नहीं सबसे पुराने को संदर्भित करता होगा। मुझे इस त्रुटि की व्याख्या कैसे करनी चाहिए? क्या मेरे विभाजन में कुछ गड़बड़ है या क्या मुझे वास्तव में सबसे पुराना विभाजन हमेशा रखना चाहिए?

उत्तर

4

हां, त्रुटि संदेश कुछ हद तक भ्रामक है, लेकिन यह अंतिम सांख्यिकीय रूप से बनाए गए विभाजन को संदर्भित करता है (आपके मूल तालिका डीडीएल में ओरेकल ने विभाजन को स्वचालित रूप से बनाना शुरू कर दिया था। मुझे लगता है कि इससे बचने का एकमात्र तरीका एक कलात्मक " MINVAL "विभाजन है कि आप सुनिश्चित हैं इस्तेमाल किया जाएगा कभी नहीं किया और फिर इस ऊपर वास्तविक विभाजन ड्रॉप

[टिप्पणी के आदान-प्रदान के बाद संपादित करें]

मुझे लगता है इस परीक्षण का मामला आपकी समस्या reproduces:।

CREATE TABLE test 
    (t_time  DATE 
    ) 
    PARTITION BY RANGE (t_time) 
    INTERVAL(NUMTODSINTERVAL(1, 'DAY')) 
    (PARTITION p0 VALUES LESS THAN (TO_DATE('09-1-2009', 'MM-DD-YYYY')), 
     PARTITION p1 VALUES LESS THAN (TO_DATE('09-2-2009', 'MM-DD-YYYY')), 
     PARTITION p2 VALUES LESS THAN (TO_DATE('09-3-2009', 'MM-DD-YYYY')), 
     PARTITION p3 VALUES LESS THAN (TO_DATE('09-4-2009', 'MM-DD-YYYY')) 
); 
insert into test values(TO_DATE('08-29-2009', 'MM-DD-YYYY')); 
insert into test values(TO_DATE('09-1-2009', 'MM-DD-YYYY')); 
insert into test values(TO_DATE('09-3-2009', 'MM-DD-YYYY')); 
insert into test values(TO_DATE('09-10-2009', 'MM-DD-YYYY')); 

जब मैं ऐसा करता हूं तो मैं विभाजन पी 0, पी 1, और पी 2 छोड़ सकता हूं लेकिन पी 3 ड्रॉप करने का प्रयास करते समय अपनी त्रुटि प्राप्त करें, भले ही सिस्टम से उत्पन्न विभाजन हो।

alter table test set interval(); 

और फिर विभाजन p3 ड्रॉप:

केवल वैकल्पिक हल मैं मिल सकता है अस्थायी रूप से करके तालिका विभाजन को फिर से परिभाषित करने के लिए किया गया था। dpbradley के जवाब में

alter table test set INTERVAL(NUMTODSINTERVAL(1, 'DAY')); 
+0

विभाजन के नाम से मैं यह कह सकता हूं कि यह स्वचालित रूप से बनाया गया था और अजीब बात यह है कि मैं उस से पहले स्थिर रूप से बनाए गए विभाजन को हटाने में सक्षम था। किसी भी तरह से मैं आपके सुझाव का प्रयास करना चाहता था और मुझे यह त्रुटि मिली: तालिका बदलें तालिका तालिका 1 विभाजन परीक्षा जोड़ें ('07 -JUL-09 11.59.00.000000000 PM '); पंक्ति 1: ओआरए -14760: त्रुटि जोड़ें अंतराल विभाजित वस्तुओं पर कोई विचार? धन्यवाद, पीजे –

+0

क्षमा करें, धन्यवाद कहना भूल गया :) –

+0

हमम ... मैं आपकी समस्या में भाग गया और यह मेरे मामले में स्टेटिक बनाम डायनामिक पोजिशनिंग मुद्दा था। जब मैंने MINVAL विभाजन का उल्लेख किया था, तो मैं इस एकल विभाजन (और अंतराल विभाजन परिभाषित) के साथ तालिका को फिर से बनाने की सोच रहा था और फिर डेटा को फिर से सम्मिलित करना - क्या यह आपकी स्थिति में संभव है? – dpbradley

2

सभी सही: तो फिर तुम से मूल विनिर्देश के अनुसार विभाजन को फिर से परिभाषित कर सकते हैं। लेकिन यह अधिक सुरक्षित तरीके से किया जा सकता है आप सबसे पुराने विभाजन (रों) गिर रहे हैं:

वास्तव में यह काफी सिर्फ इस तरह अंतराल रीसेट करने के लिए है:

alter table test set interval(); 
alter table test set INTERVAL(NUMTODSINTERVAL(1, 'DAY')); 

और फिर विभाजन सबसे पुराने विभाजन छोड़ देते हैं।

अन्यथा ड्रॉप विभाजन विफल होने पर जोखिम होता है तो तालिका में कोई अंतराल नहीं होगा। इसलिए सभी अपवादों को पकड़ने और इसे संभालने की आवश्यकता है।

संबंधित मुद्दे