इसके प्रारंभिक आकार के नीचे एक डेटाबेस सिकोड़ें


10

मुझे एक SQL सर्वर 2005 dev डेटाबेस मिला है जो लाइव की 30GB प्रति है। हमने कुछ डेटा को नष्ट कर दिया है जिसकी आवश्यकता dev में नहीं है, जो डेटा फ़ाइल स्थान को 20GB तक उपयोग में लाता है। इसलिए हमारे पास लगभग 33% अप्रयुक्त हैं।

मुझे अंतरिक्ष को पुनः प्राप्त करने की आवश्यकता है, जो हमें सर्वर पर दूसरी देव डीबी (कट डाउन संस्करण के आधार पर) की अनुमति देगा; हालाँकि, मैं स्थान को पुनः प्राप्त नहीं कर सकता, मैंने निम्नलिखित कार्य किए हैं:

  • फ़ाइल SMS2_Dataका प्रारंभिक आकार 30GB है।

    DBCC SHRINKFILE (N'SMS2_Data' , 0, TRUNCATEONLY)

    के बाद

    DBCC SHRINKFILE (N'SMS2_Data' , 19500)

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

ALTER DATABASE SMS2HazSub MODIFY FILE (NAME = 'SMS2_Data', SIZE = 20000) 

यह गलत है, कह रही है:

आधुनिक फ़ाइल विफल। निर्दिष्ट आकार वर्तमान आकार से कम है।

मैंने 20800 की कोशिश की और फिर 29000 (29GB) तक टिल जाता रहा और यह अब भी मुझे इसे बदलने नहीं देगा।

हटना किया है तो फिर से और वापस FULLकरने के लिए वसूली मोड बदल दिया है SIMPLE। कोई आनंद नहीं है।

मुझे लगा कि यह कुछ TEXTक्षेत्रों के साथ करना है । हमारे पास सिस्टम में लगभग 6 हैं। इसलिए एक परीक्षण के रूप में मैंने उन सभी को गिरा दिया और फिर फ़ाइल को सिकोड़ दिया और फिर भी कोई बदलाव नहीं हुआ।

एकमात्र विकल्प बचा है कि डेटा को दूसरे DB में फिर से जोड़ दिया जाए। यह व्यावहारिक नहीं है, क्योंकि इसे लाइव डीबी पर करना होगा, जिसमें बहुत अधिक जोखिम होता है। हम नियमित रूप से लाइव डीबी की एक प्रति हड़प लेते हैं और देव / परीक्षण को अधिलेखित कर देते हैं। हमारे पास 500 तालिकाओं जैसा कुछ है। मैं ऐसा करने का एक तरीका चाहूंगा जिसमें डेटा को नए DB में निर्यात करने का जोखिम न हो।

मैंने डेटा को किसी अन्य फ़ाइल में ले जाने का प्रयास किया, और उसने सभी 5% डेटा की प्रतिलिपि बनाई। यह वही है जो मुझे सभी पाठ कॉलमों को आज़माने और छोड़ने के लिए प्रेरित करता है।

सर्वर संगतता मोड 90 पर है, लेकिन SP2 है। मैंने अब निम्न 3 बार किया है: सभी तालिकाओं, बैकअप डेटाबेस, फ़ाइल हटना, डेटाबेस सिकोड़ें। फिर भी कोई खुशी नहीं।

EXECUTE sp_spaceused रिटर्न:

database_name   database_size   unallocated space
SMS2Tests       31453.94 MB     13903.16 MB

reserved     data         index_size   unused
16545568 KB  10602264 KB  4254360 KB   1688944 KB

जवाबों:


3

जैसा कि कुछ लोगों ने पहले ही उल्लेख किया है कि आप पुराने डेटाबेस से नया डेटाबेस और "कॉपी" सामान बना सकते हैं। यह आपके लिए सबसे अच्छा विकल्प होगा। हालाँकि मैंने देखा है कि आप इसे नियमित रूप से करना चाहते हैं। तो आपका सबसे अच्छा विकल्प Redgate Data तुलना और Redgate तुलना है । दोनों Redgate SqlToolbelt पैकेज का हिस्सा हैं ।

तो तुम क्या करते हो:

  1. छोटे प्रारंभिक आकार के साथ एक खाली DB बनाएं।
  2. Redgate का उपयोग करें पुराने db से db संरचना, कार्यों आदि की प्रतिलिपि बनाने के लिए
  3. रेडगेट डेटा का उपयोग करें पुराने डेटाबेस के डेटा को नए से कॉपी करने के लिए तुलना करें
  4. आप देव डेटाबेस पर काम करते हैं और फिर किसी भी समय आप या तो सिर्फ डेटा तुलना करते हैं और देव डीबी को नियमित रूप से अपडेट करते हैं, या यदि आप डीबी में कोई बदलाव करते हैं तो आप रेडगेट तुलना और फिर रेडगेट डेटा तुलना का उपयोग करके उन परिवर्तनों को तैनात कर सकते हैं।

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


2

यहां कुछ संभावनाएं।

सबसे पहले, आप SQL 2005 SP3 या बाद में हैं? कुछ ने पहले संस्करणों पर SHRINKFILE मुद्दों की सूचना दी है (देखें http://www.sqlservercentral.com/Forums/Topic981292-146-6.aspx#bm985164 )

दूसरे, क्या आप यह सत्यापित कर सकते हैं कि डेटाबेस को 90 संगतता के लिए सेट किया गया है, और मोड 80 को नहीं? यह जाहिरा तौर पर SQL 2000 के साथ एक समस्या थी, लेकिन SQL 2005 में प्रतिबंध हटा दिया गया था। यदि आपका डेटाबेस अभी भी 80 संगतता को सेट करने के लिए सेट है, तो यह अभी भी एक समस्या हो सकती है।

तीसरा, यह एलओबी डेटा (टेक्स्ट, नेक्स्ट, वर्चर (अधिकतम)) के साथ एक मुद्दा हो सकता है। पॉल रान्डेल का उत्कृष्ट लेख यहाँ देखें

मैं मान रहा हूँ कि आप समझते हैं कि वास्तव में क्या करता है, और यह आपके प्रदर्शन को नकारात्मक रूप से प्रभावित कर सकता है:

  • SHRINK फ़ाइल के अंत से शुरुआत तक पृष्ठों को नेत्रहीन रूप से स्थानांतरित करके काम करता है
  • जैसे, यह भयावह रूप से अनुक्रमित टुकड़े कर सकता है, जो महत्वपूर्ण प्रदर्शन मुद्दों का कारण बन सकता है
  • क्योंकि इस तरह के एक डेटा गहन संचालन, सिकुड़न महत्वपूर्ण समय लग सकता है

मैं सामान्य रूप से एक पूर्ण reindex के साथ सिकुड़न का पालन करने की सलाह दूंगा (जो कि अभी मुक्त किए गए कुछ स्थान को पुनः प्राप्त करेगा), लेकिन ऐसा नहीं लगता कि आप उस बिंदु पर पहुंचने में सक्षम हैं।

यदि आप गतिविधि मॉनीटर में अपने सिकुड़ते एसपीआईडी ​​को देखते हैं, तो क्या यह कुछ भी करता दिखाई देता है? (IO और CPU काउंटर्स बदलते हुए) या यह अवरुद्ध है? केवल एक और चीज जो मैं सोच सकता हूं वह यह है कि अगर डेटाबेस पर कोई अन्य गतिविधि है, तो सिकुड़न को अवरुद्ध करता है। सुनिश्चित करें कि कोई अन्य सक्रिय स्पिड उस समय डेटाबेस का उपयोग नहीं कर रहा है।

इस प्रक्रिया के दौरान सरल रिकवरी मोड पर स्विच करना भी एक अच्छा विचार है, लॉग को बहुत अधिक बढ़ने से रोकने के लिए।


1

यदि आप वास्तव में ऐसा करना चाहते हैं:

  • सरल करने के लिए मोड को पुनर्प्राप्त करने के लिए सेट
  • जागरूक रहें: DBCC SHRINKDATABASE (MyDatabase, TRUNCATEONLY);

1

SHRINKDATABASE केवल डेटाबेस को (सर्वोत्तम रूप से) अपने MinSize में सिकोड़ देगा, जिससे आपको मदद नहीं मिलेगी।

जब आप डिफॉल्ट का उपयोग करके SSMS UI के माध्यम से फ़ाइल को सिकोड़ने का प्रयास करते हैं, तो यह 'DBCC SHRINKFILE (N'MyDB', 0, TRUNCATEONLY) का उपयोग करता है। वह कमांड केवल फ़ाइल को (सबसे अच्छे से) अंतिम आबंटित सीमा तक सिकोड़ देगा।

यदि आप MinSize के नीचे की फ़ाइल को सिकोड़ना चाहते हैं, तो बस उस पैरामीटर को DBCC SHRINKFILE0 से उस आकार में बदलें, जिसे आप MBs में फ़ाइल को सिकोड़ने का प्रयास करना चाहते हैं। यदि संभव हो तो एक गैर-शून्य संख्या फ़ाइल को उस आकार में सिकोड़ने के लिए SHRINKFILE को बताएगी। तो DBCC SHRINKFILE('MyDB', 300, TRUNCATEONLY)डेटाबेस की जगह है अगर 300MB करने के लिए फ़ाइल हटना होगा।

आप इसे चलाकर मिनीसाइज़ देख सकते हैं:

DBCC TRACEON(3604)
go
DBCC PAGE('MyDB', 1, 0, 3) with tableresults
go

MBs में न्यूनतम गणना इस तरह की जाती है: (MinSize * 8) / 1024


0

यदि आपके पास डेटाबेस में वास्तविक डेटैट का 20003 (mb) कहना है, तो "SIZE = 20000" बहुत छोटा होगा। 21000 या 25000 के साथ प्रयास करें, देखें कि क्या काम करता है। (और याद रखें, 1 जीबी = 1024 एमबी।)


0

प्रयत्न

DBCC SHRINKDATABASE (N'SMS2_Data' , 0)

मैंने इसे SQL 2005 डेटाबेस पर यहाँ उपयोग किया है और डेटा फ़ाइल के लिए आवंटित स्थान 10.2 जीबी से 3 जीबी हो गया है।

फी, यह एक लंबी प्रक्रिया है, और मेरे डेटाबेस के लिए 19 मिनट से अधिक समय लगा।


ps बस जाँच की और मेरे डेटाबेस के लिए रिकवरी मॉडल सरल पर सेट है।

इससे कोई फर्क नहीं पड़ा, मुझे पूरा यकीन है कि वही होगा जो फ्रंट एंड के माध्यम से होता है।

0

मैं मान रहा हूं कि आपके पास तार्किक नाम SMS2_Data के साथ एक एकल डेटाबेस फ़ाइल है। आपके पास डेटाबेस में एक या एक से अधिक लेन-देन लॉग फ़ाइलें हैं।

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

जैसा कि आप पहले ही अनुभव कर चुके हैं, SHRINKDB और SHRINKFILE आपको वह नहीं दे रहा है जो आप चाहते हैं। ये आदेश मूल आकार नियम की तुलना में छोटे को छोटा नहीं कर सकते हैं। इसलिए, आप केवल एक डेटाबेस को मूल आकार में सिकोड़ सकते हैं और कोई छोटा नहीं कर सकते।

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

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

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

आप SSIS को एक डेटाबेस से दूसरे में डेटा ट्रांसफर करने के तरीके के रूप में मान सकते हैं। आपको एक प्रतिलिपि डेटाबेस कार्य मिलेगा जो आपकी सहायता करेगा। आप निम्न चरणों का उपयोग कर सकते हैं:

  1. स्रोत डेटाबेस की तुलना में छोटे आकार के साथ नया डेटाबेस बनाएँ
  2. हस्तांतरण डेटाबेस कार्य के साथ SSIS पैकेज सेटअप करें। ऑनलाइन स्थानांतरण का उपयोग करने के लिए कार्य निर्धारित करें।
  3. SSIS पैकेज चलाएँ।
  4. स्रोत डेटाबेस आकार से मेल करने के लिए SSIS पैकेज डेटाबेस आकार में परिवर्तन कर सकता है। इस डेटाबेस को सिकोड़ें, क्योंकि इसका आकार छोटा है।

SSIS स्थानांतरण डेटाबेस कार्य पर अतिरिक्त जानकारी देखें ।


0

डेटाबेस में कुछ अप्रयुक्त स्थान सामान्य है।
यदि आपके पास कई बड़े रिकॉर्ड हैं (कहते हैं, लंबे तार), तो डेटा पृष्ठों में बहुत अधिक अप्रयुक्त स्थान हो सकता है (क्योंकि एक रिकॉर्ड आमतौर पर पृष्ठों के बीच विभाजित नहीं होता है)।
एक और बात एक भरण कारक है - शुरू में, बाद के सम्मिलन पर पृष्ठ विभाजन (एक महंगा ऑपरेशन) से बचने के लिए क्लस्टर इंडेक्स 100% पूर्ण नहीं बनाए जाते हैं।
यदि डेटाबेस से बहुत सारे डेटा हटा दिए गए थे, तो पहले से इन डेटा के कब्जे वाले स्थान को स्वचालित रूप से पुनः प्राप्त नहीं किया जाएगा - यह तालिका में आवंटित किया जाएगा।

DBCC DBREINDEX (table_name, '', 100)अपने डेटाबेस में हर टेबल पर कॉल करने की कोशिश करें - यह 100% भरण कारक के साथ सभी अनुक्रमितों को फिर से बनाएगा, इसलिए डेटा को यथासंभव कॉम्पैक्ट रूप से रखा गया है। फिर डेटाबेस को फिर से सिकोड़ने का प्रयास करें।


0

मैंने पाया है कि SQL सर्वर डेटाबेस को सिकोड़ना परेशानी भरा हो सकता है। ऐसा महसूस होता है कि आपको एक गीत और नृत्य दिनचर्या करने के लिए मिला है।

यह वह प्रक्रिया है जिससे मैं आमतौर पर गुजरता हूं:

बैकअप सिकोड़ें डेटाबेस बैकअप सिकोड़ें लॉग और डेटाबेस फ़ाइलों को अलग से। बैकअप दोहराएँ जब तक यह अंततः सिकुड़ती है।

अंत में काम करने के लिए मुझे इस प्रक्रिया को तीन बार तक करना होगा। हमारे पास आकार में 68 GB से अधिक का डेटाबेस है, जिसमें 98% अप्रयुक्त स्थान है। इस गीत और नृत्य की दिनचर्या के माध्यम से कई बार गए, लेकिन अंत में यह 1GB से कम हो गया।


0

मैंने पहले mdf फ़ाइल के शुरुआती आकार को 29 000 एमबी तक कम करने की कोशिश की होगी, फिर 28 तक, 000 को नज़दीकी हिट का पता लगाया।

30% डेटा हटाकर डेटाबेस फ़ाइल आकार में 30% कम करने की उम्मीद करना अनुचित है।

आप अनुमान लगा सकते हैं कि आपके डेटाबेस में कितनी अप्रयुक्त जगह है

execute sp_spaceused

अपने डेटाबेस के संदर्भ में (yourdatabaename का उपयोग करें?)
क्या आप इसके निष्पादन का परिणाम पोस्ट कर सकते हैं?


अद्यतन:
मैंने उस पर अपना संबंधित प्रश्न पोस्ट किया है:


यह बहुत अच्छा काम नहीं किया। 13903.16mb अनलॉक्ड स्पेस। अप्रयुक्त सूचकांक 1688944 KB
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.