तालिका क्षेत्र को हटाने के बाद डिस्क स्थान का दावा करना


16

मैं sql 2008 r2 चला रहा हूं और db पिछले 3 वर्षों से ठीक और तेजी से काम कर रहा था, लगभग 3 महीने पहले हमने बहुत सक्रिय और उपयोग की गई टेबल पर ntext फ़ील्ड जोड़ी। अब हम इस तालिका के विशाल विस्तार के कारण सर्वर स्थान से बाहर निकलना शुरू कर रहे हैं।

मैंने पढ़ा कि सिकुड़ते हुए, हम db की अनुक्रमणिका को ढीला नहीं करना चाहते क्योंकि यह वर्षों से तेजी से काम कर रहा था और हम विखंडन का विस्तार नहीं करना चाहते हैं।

हमने उस फ़ील्ड और उसके सभी मानों को हटाने का निर्णय लिया: क्या ntext फ़ील्ड और उसके सभी मूल्यों को हटाने का कोई तरीका है और बिना इंडेक्सिंग को हटाए, बिना सिकुड़ाये, db प्रदर्शन को खोए बिना स्पेस छोड़ दें?

मैं आपको पिछले 5 महीनों के आकार का विस्तार दिखाने के लिए db आकार क्वेरी आउटपुट संलग्न कर रहा हूं।

यहाँ छवि विवरण दर्ज करें

जवाबों:


12

हमने उस क्षेत्र और उसके सभी मूल्यों को हटाने का फैसला किया: क्या ntext फ़ील्ड और उसके सभी मूल्यों को हटाने और बिना इंडेक्सिंग को हटाए, बिना सिकुड़ते, db प्रदर्शन को खोए बिना अंतरिक्ष को खाली करने का एक तरीका है?

मैं (BOL से) उपयोग करने की सलाह दूंगा:

DBCC CLEANTABLE
(
    { database_name | database_id | 0 }
    , { table_name | table_id | view_name | view_id }
    [ , batch_size ]
)
[ WITH NO_INFOMSGS ]

DBCC स्पष्ट एक चर लंबाई स्तंभ गिरा दिया है के बाद अंतरिक्ष को फिर से बताता है। एक चर-लंबाई स्तंभ निम्नलिखित डेटा प्रकारों में से एक हो सकता है: varchar, nvarchar, varchar (max), nvarchar (max), varbinary, varbinary (max), पाठ, ntext, image, sql_ariariant, और xml। निश्चित-लंबाई वाले स्तंभ को गिरा दिए जाने के बाद कमांड स्थान को पुनः प्राप्त नहीं करता है।

!! चेतावनी !! ( एक सावधान बैच आकार का उपयोग करें - इस पैरामीटर का उपयोग करने की सलाह दी जाती है यदि आपकी मेज बड़े पैमाने पर है) :

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

यह ऑपरेशन पूरी तरह से लॉग इन है।

एक साधारण repro साबित होगा कि DBCC CLEANTABLESHRINKING से बेहतर है (और विखंडन की कोई चिंता नहीं :-)

-- clean up
drop table dbo.Test

-- create test table with ntext column that we will drop later
create table dbo.Test (
    col1 int
    ,col2 char(25)
    ,col3 ntext
    );

-- insert  1000 rows of test data
declare @cnt int;

set @cnt = 0;

while @cnt < 1000
begin
    select @cnt = @cnt + 1;

    insert dbo.Test (
        col1
        ,col2
        ,col3
        )
    values (
        @cnt
        ,'This is a test row # ' + CAST(@cnt as varchar(10)) + 'A'
        ,REPLICATE('KIN', ROUND(RAND() * @cnt, 0))
        );
end

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

--drop the ntext column
ALTER TABLE dbo.Test DROP COLUMN col3 ;

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

--reclaim the space from the table
-- Note that my table is only having 1000 records, so I have not used a batch size
-- YMMV .. so find a maintenance window and you an appropriate batch size 
-- TEST TEST and TEST before implementing in PROD.. so you know the outcome !!
DBCC CLEANTABLE('tempdb', 'dbo.Test') ;

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें


आपके द्वारा DBCC CLEANTABLE कमांड को निष्पादित करने के बाद, आपको स्थान वापस पाने के लिए तालिका में एक होने पर अपने क्लस्टर किए गए अनुक्रमणिका को पुन: उपयोग करने की आवश्यकता है। आपके पुनरीक्षण पर भारत सूचकांक सूचकांक का नाम;
श्री टीए

6

ज्यादातर हिस्सों के लिए मैं पॉल रान्डेल के इनसाइड स्टोरेज इंजन ब्लॉग श्रृंखला का उल्लेख कर रहा हूं ।

SQLServer में डेटाबेस फ़ाइलों से अप्रयुक्त स्थान को पुनः प्राप्त करने का एकमात्र तरीका DBCC SHRINK कमांड का उपयोग कर रहा है जो डेटाबेस फ़ाइलों को मुक्त करने वाले पृष्ठों के भीतर डेटा को पुन: प्राप्त करता है और ग्लोबल आवंटन मानचित्र से हटाने के बाद उन्हें डेटाबेस फ़ाइल से हटा देता है। यह ऑपरेशन धीमा है, डेटाबेस के भीतर विखंडन पैदा करता है और LOB पृष्ठों से निपटने के दौरान भी धीमा होता है क्योंकि वे डेटाबेस फ़ाइलों के भीतर लिंक की गई सूचियों के रूप में संग्रहीत होते हैं।

चूंकि आप NTEXT कॉलम को छोड़ रहे हैं, इसलिए आपको सिकुड़ने से पहले डेटा को साफ़ करने के लिए घोस्ट क्लीनअप प्रक्रिया की प्रतीक्षा करनी होगी।

अब डेटाबेस फ़ाइलों में बहुत सारी खाली जगह होने से वास्तव में आपको कोई नुकसान नहीं होगा, अगर आपके पास डिस्क स्थान है, तो बैकअप संपीड़न फ़ाइलों के भीतर मुक्त स्थान का ख्याल रखेगा।

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


क्या भूत सफाई की प्रक्रिया से जगह कम हो जाएगी या सिकुड़न की भी आवश्यकता होगी?
उपयोगकर्ता 1021182

आपको हमेशा सिकुड़ना होगा, क्लीनअप प्रक्रिया केवल आवंटित पृष्ठों को खाली करती है लेकिन उन्हें डेटाबेस फ़ाइलों से नहीं
हटाती है

1
@ Spörri Since you are dropping the NTEXT column you will have to wait for the ghost cleanup process to drop the data before shrinking.कृपया मेरा उत्तर देखें । आप DBCC CLEANTABLEअंतरिक्ष जारी करने के लिए उपयोग कर सकते हैं ।
परिजन शाह

4

क्या आप डेटाबेस फ़ाइलों को सिकोड़ना चाहते हैं क्योंकि आपको अन्य डेटाबेस / नॉन डीबी फ़ाइलों के लिए उस स्थान की आवश्यकता है या क्योंकि आपको इस डेटाबेस से अंतरिक्ष से बाहर चलने में समस्या हो रही है?

अगर यह दूसरा है तो आपको उतनी बड़ी समस्या नहीं हो सकती जितनी आप सोचते हैं। यदि मैं आपकी समस्या को ठीक कर रहा हूं, जब डेटाबेस को नए डेटा के लिए अतिरिक्त स्थान प्राप्त करने के लिए बढ़ने की आवश्यकता है। एक बार जब आप उस कॉलम द्वारा उठाए गए स्थान के सभी कॉलम को हटा देते हैं, तो डेटाबेस में तालिकाओं में जोड़ी जाने वाली नई पंक्तियों के लिए मुक्त कर दिया जाएगा। इसका मतलब है कि आपके डेटाबेस के बढ़ने से पहले यह लंबा होगा। इस बीच में मुझे आपके डेटा ड्राइव के लिए कुछ अतिरिक्त जगह मिल जाएगी। अधिकांश डेटाबेस समय के साथ बढ़ते हैं और ड्राइव पर मुक्त स्थान का एक स्वस्थ मार्जिन होना अच्छा है।


हमारे पास डिस्क स्थान पर केवल 10 जीबी शेष है और यह कुछ दिनों में बाहर चला जाएगा। हमने सभी को हटा दिया है जो हम सर्वर से निकाल सकते हैं और क्लीनअप का इस्तेमाल कर सकते हैं और विंडोज़ अपडेट को रोक सकते हैं और उन सभी को हटा सकते हैं और विंडएक्स को साफ कर सकते हैं, अब हमें db फ़ाइल का आकार कम करना होगा
user1021182

फिर से, याद रखें कि एक बार जब आपने अतिरिक्त कॉलम को हटा दिया है तो आपकी DB वृद्धि कुछ समय के लिए रुक जाएगी जब आप नई जगह भरेंगे। यदि इस बिंदु के बाद भी आपका DB बढ़ रहा है, तो आपको अपने डेटाबेस के लिए अतिरिक्त डिस्क स्थान की आवश्यकता होगी। संभवतः अपने सर्वर में एक नई ड्राइव जोड़ें।
केनेथ फिशर

0

मैं आपत्तिजनक कॉलम के बिना एक दर्पण तालिका बनाऊंगा, इस तालिका में सभी डेटा की प्रतिलिपि बना सकता हूं, मूल ड्रॉप कर सकता हूं और फिर दर्पण तालिका का नाम बदल सकता हूं।


उस स्थिति में सभी इंडेक्स को भी तैयार करने की आवश्यकता होगी
user1021182

हाँ, तालिका को प्रभावित करने वाले किसी भी अनुक्रमित को गिरा दिया जाना चाहिए और उसे फिर से बनाना भी होगा .... तालिका संदर्भित करने वाली अन्य वस्तुओं पर भी लागू होता है जैसे: ट्रिगर
ardochhigh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.