एक टेबलस्पेस से तार्किक स्थान पुनर्प्राप्त करना


11

मेरे पास DATA नामक एक टेबलस्पेस है, और यह ऑटो-एक्सटेंशन के साथ झूठा है। इस टेबलस्पेस में दो डेटाफाइल्स हैं और इसे स्थापित किया गया है ताकि यह 350 जीबी भौतिक स्थान ले सके।

एक हफ्ते पहले मैंने user_tablespaces और dba_data_files को क्वेर किया और देखा कि इसमें उपलब्ध लॉजिकल स्पेस का 20% हिस्सा था। फिर मैंने एक सफाई के साथ प्रक्रिया की और इस तालिकाओं में तालिकाओं से कई रिकॉर्ड हटा दिए। हम उपलब्ध स्थान में एक बड़ी वृद्धि देखने की उम्मीद कर रहे थे। दुर्भाग्य से जब मैंने उन विचारों पर ध्यान दिया, जिन्हें मैंने देखा कि उपलब्ध स्थान अब 20.5% था।

क्या यह डेटा विखंडन के कारण हो सकता है? क्या हम किसी तरह टेबलस्पॉट को "डीफ्रैग" कर सकते हैं और खोई हुई जगह को पुनः प्राप्त कर सकते हैं? या क्या हमें खरोंच से टेबलस्पेस को फिर से बनाने की आवश्यकता है?

जवाबों:


14

जब आप रिकॉर्ड हटाते हैं, तो ऐसा कुछ भी नहीं होता है जो स्वचालित रूप से खंड को संकुचित करता है, इसलिए आपको अंतरिक्ष को पुनः प्राप्त करने के लिए एक खंड हटना होगा। यहां 11.2 प्रशासक की गाइड पर पुनःप्राप्त व्यर्थ स्थान का अंश दिया गया है :

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

खंडित मुक्त स्थान वाली वस्तुओं के परिणामस्वरूप बहुत अधिक बर्बादी हो सकती है, और डेटाबेस के प्रदर्शन को प्रभावित कर सकता है। इस स्थान को डीफ़्रैग्मेन्ट करने और पुनः प्राप्त करने का पसंदीदा तरीका एक ऑनलाइन सेगमेंट सिकोड़ना है। यह प्रक्रिया उच्च जल चिह्न के नीचे खंडित मुक्त स्थान को समेकित करती है और खंड को संकुचित करती है। संघनन के बाद, उच्च पानी के निशान को स्थानांतरित किया जाता है, जिसके परिणामस्वरूप उच्च पानी के निशान के ऊपर नया खाली स्थान होता है। उच्च जल चिह्न के ऊपर की जगह को तब हटा दिया जाता है। अधिकांश ऑपरेशन के दौरान क्वेरीज़ और डीएमएल के लिए यह खंड उपलब्ध रहता है, और किसी अतिरिक्त डिस्क स्थान को आवंटित करने की आवश्यकता नहीं होती है।

उसी पृष्ठ पर आगे आप इसे पढ़ सकते हैं:

सेगमेंट हटना एक ऑनलाइन, इन-प्लेस ऑपरेशन है। खंड के सिकुड़न के डेटा आंदोलन चरण के दौरान डीएमएल संचालन और क्वेरीज़ जारी की जा सकती हैं। समवर्ती ऑपरेशन के अंत में समवर्ती डीएमएल संचालन को थोड़े समय के लिए अवरुद्ध कर दिया जाता है, जब अंतरिक्ष को हटा दिया जाता है। सिकुड़न ऑपरेशन के दौरान सूचकांक बनाए रखा जाता है और ऑपरेशन पूरा होने के बाद प्रयोग करने योग्य रहता है। खंड हटने के लिए अतिरिक्त डिस्क स्थान आवंटित करने की आवश्यकता नहीं होती है।

खंड हटना उच्च जल चिह्न के ऊपर और नीचे दोनों जगह अप्रयुक्त स्थान को हटा देता है। इसके विपरीत, अंतरिक्ष से होने वाले फैलाव ने अप्रयुक्त स्थान को केवल उच्च जल चिह्न से ऊपर रखा। डिफ़ॉल्ट रूप से सिकुड़ने के संचालन में, डेटाबेस खंड को संकुचित करता है, उच्च पानी के निशान को समायोजित करता है, और पुनः प्राप्त स्थान को जारी करता है।

पृष्ठ में उदाहरण सहित समस्या पर बहुत अधिक जानकारी शामिल है।

"सेगमेंट अंतरिक्ष और उच्च जल मार्क" अवधारणाओं से अनुभाग गाइड भी उपयोगी हो सकती।


9

हाँ, यह विखंडन के कारण होगा।

अंतरिक्ष को पुनः प्राप्त करने के लिए, पहले टेबल में टेबल की एक सूची प्राप्त करें जिसमें निम्नलिखित प्रश्न हैं (विभाजन को अनदेखा करते हुए - यदि आप उनका उपयोग कर रहे हैं तो अपने प्रश्न को संपादित करें):

select distinct table_name from dba_tables where tablespace_name = 'DATA';

फिर प्रत्येक तालिका के लिए, पंक्ति संचलन सक्षम करें:

alter table TABLEINDATAPARTITION enable row movement;

तब आप तालिका को सिकोड़ सकते हैं:

alter table TABLEINDATAPARTITION shrink space;

इसके बाद डेटा फ़ाइलों को सिकोड़ें:

alter database datafile '/path/to/my/file/data01.dbf' resize 20480M;

डेटाफ़ाइल नाम DBA_DATA_FILESदृश्य से प्राप्त किए जा सकते हैं , जिनके बारे में आप पहले से जानते हैं।


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