SQL सर्वर को पुनरारंभ किए बिना tempdb.mdf आकार को कम / सिकोड़ने का कोई तरीका है


15

इसके बाद SQL सर्वर को पुनः आरंभ करने के लिए आवश्यक है DBCC SHRINKFILEपर tempdb.mdfया कोई अन्य के आकार को कम करने के लिए विधि है tempdb.mdfएसक्यूएल सर्वर को पुन: प्रारंभ बिना?

कृपया मदद के रूप में मैं एक उत्पादन सर्वर के लिए यह जरूरत है और मैं किसी भी नीचे समय के बिना सिकुड़ने की उम्मीद कर रहा हूँ।


2
DBCC SHRINKFILE को सेवा पुनरारंभ की आवश्यकता नहीं है।
ग्रेग

आप tempdb को सिकोड़ नहीं सकते क्योंकि यह उपयोग में है। और हाँ इसके लिए कुछ समाधान है लेकिन यह बहुत साफ नहीं है और इसके कुछ दुष्प्रभाव भी हैं।
आयनिक

जवाबों:


15

आप इस तरह से कर सकते हैं:

-- write everything from your buffers to the disc!
CHECKPOINT; 
GO
-- Clean all buffers and caches
DBCC DROPCLEANBUFFERS; 
DBCC FREEPROCCACHE;
DBCC FREESYSTEMCACHE('ALL');
DBCC FREESESSIONCACHE;
GO
-- Now shrink the file to your desired size
DBCC SHRINKFILE (TEMPDEV, 40960);
-- Make sure that there is no running transaction which uses the tempdb while shrinking!
-- This is most trickiest part of it all.
GO

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

खबरदार कि यह "सॉफ्ट रिस्टार्ट" जैसा कुछ है। बफ़र्स से सब कुछ हटा दिया जाएगा और डिस्क पर लिखा जाएगा। इसका मतलब आपके I / O सबसिस्टम (लेखन) पर प्रभाव पड़ता है क्योंकि इसे सभी लिखने के संचालन को संभालना होता है। उसके बाद आप फ़ाइल को सिकोड़ सकते हैं (जिसका पढ़ने और लिखने के प्रदर्शन पर प्रभाव पड़ता है) और अंत में, किसी भी तालिका को क्वेरी करने वाली सभी प्रक्रियाओं को आई / ओ सबसिस्टम से बफ़र्स में डेटा वापस प्राप्त करने की आवश्यकता होगी। यह एक पुनरारंभ से अधिक चोट लग सकती है।

यदि आप एक विकास प्रणाली चला रहे हैं, तो आपको इस तरह से मशीन को फिर से चालू करना चाहिए। लेकिन एक असफल साथी के बिना कुछ उत्पादन प्रणालियों पर, यह उपयोगी हो सकता है।


अच्छी व्याख्या के लिए धन्यवाद Ionic। tempdb.mdf मेरे मामले में 46 जीबी का है। अगर कोई लेनदेन नहीं हो रहा है तो क्या मैं इसे 100% तक छोटा कर सकता हूं। कृपया सुझाव दें।
मणि

हां 40960MB सिर्फ एक उदाहरण है। मेरे सिस्टम पर tempdb ~ 50GB पर सामान्य रूप से चलता है और दुर्लभ मामलों में 200GB तक बढ़ता है। :-)
आयनिक

<pre> मैं क्वेरी को DBCC SHRINKFILE (tempdev, 1024) के रूप में चलाता हूं; </ b> </ b> और इसने सफलतापूर्वक स्थान खाली कर दिया, लेकिन फिर से इसे </ b> </ b> की तरह चलाता हूं, जैसे मैं क्वेरी चलाता हूं DBCC SHRINKFILE (tempdev, 30000); </ b> </ b> और इसने मुझे नीचे के रूप में परिणाम दिया: </ b> </ b> DbId फ़ील्ड वर्तमान आकार न्यूनतम आकार उपयोग किए गए पृष्ठ अनुमानित पृष्ठ </ b> 2 1 5699352 1024 696 696 </ b> </ b> लेकिन जैसा कि चेक किया गया
टेम्पर्ड साइज

यह संदेश तब हो सकता है जब कोई लेनदेन सिकुड़ते समय tempdb का उपयोग करता है। यह भी हो सकता है कि आपका परिभाषित सिकुड़न आकार (~ 30 जीबी) आपके टेंपर्ड की मुफ्त सीमा से ऊपर हो।
आयनिक

1

आप केवल नीचे दिए गए कदम के साथ जा सकते हैं

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;

आपका उत्तर उपरोक्त से अलग कैसे है?
किन्न शाह

1
हैलो किन, टेम्पपब फ़ाइल का आकार DBCC FREEPROCCACHE के साथ कम हो जाएगा; और फिर tempdb फ़ाइल को सिकोड़ें। हम अस्थायी tempdb के लिए नीचे दिए गए कथन की आवश्यकता नहीं है। DBCC DROPCLEANBUFFERS; DBCC FREESYSTEMCACHE ('ALL'); DBCC FREESESSIONCACHE;
जेरी

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