SQL सर्वर एक कॉलम को इंट में अपडेट करते समय भरने वाले ट्रांजेक्शन लॉग को कैसे प्राप्त करें


18

मेरे पास SQL ​​Server 2005 टेबल है BRITTNEY_SPEARS_MARRIAGESऔर इसमें निम्नलिखित कॉलम हैं:

MarrigeId tinyint, 
HusbandName varchar(500),
MarrigeLength int

अब मेरे पास एक और टेबल है BRITTNEY_SPEARS_MARRIAGE_STORIES

StoryId int, 
MarriageId tinyint, 
StoryText nvarchar(max)

समस्या हम अद्यतन करना चाहते है MarrigeIdएक करने के लिए स्तंभ intएक से tinyint। हम सिर्फ यह महसूस करते हैं कि सब कुछ कहने और किए जाने से पहले ब्रिटनी की बहुत सारी शादियां होने वाली हैं।

अब BRITTNEY_SPEARS_MARRIAGE_STORIESतालिका में 18 मिलियन पंक्तियाँ हैं (हे लड़की के पास कुछ समस्याएँ हैं) इसलिए जब हम अपडेट करने के लिए जाते हैं तो लेनदेन लॉग भर जाता है और हमारा SQL सर्वर बॉक्स मर जाता है।

हम इसके आसपास कैसे पहुंच सकते हैं?

क्या ऐसा कहने के लिए कुछ भी है "अरे SQL सर्वर मैं इस कॉलम को अपडेट करने जा रहा हूं और इसे बड़ा बनाऊंगा। मुझे इस SQL ​​सर्वर पर भरोसा करें। कृपया सब कुछ मान्य करने का प्रयास करते समय लेन-देन लॉग न भरें।"

जवाबों:


7

SQL सर्वर को लेन-देन लॉग का उपयोग न करने का कोई तरीका नहीं है।

आप क्या कर सकते हैं डेटाबेस के पुनर्प्राप्ति मॉडल को SIMPLE पर सेट किया गया है, जो कि अंतरिक्ष की आवश्यकता के रूप में पुरानी लॉग प्रविष्टियों को अधिलेखित कर देगा। हालांकि, आपको अपने उत्पादन सर्वर पर ऐसा नहीं करना चाहिए, क्योंकि आप कुछ प्रकार के पुनर्स्थापना करने में सक्षम नहीं होंगे, जैसे बिंदु-समय पर पुनर्स्थापना।

वैकल्पिक रूप से, आप अपनी लेन-देन लॉग फ़ाइल को बड़ा करने के लिए सेट कर सकते हैं - अंगूठे के अवैज्ञानिक नियम के रूप में मैं यह सुनिश्चित करूँगा कि या तो ए) आपके लेन-देन लॉग में आपकी तालिका या बी के आकार की तुलना में कम से कम 1.5x अधिक खाली स्थान है। आपका लेनदेन लॉग एक ऐसे ड्राइव पर ऑटो-ग्रो कर सकता है , जिसमें कम से कम डिस्क स्थान खाली है।

आप लॉग का बैकअप लेकर लेन-देन लॉग स्पेस को मुक्त कर सकते हैं। यदि आप लॉग सामग्री की परवाह नहीं करते हैं, तो फ़ाइल को फेंक दें। इसके लिए एक शॉर्टकट है BACKUP LOG <Your Database Name> TO DISK = 'NUL:'। फिर से, एक उत्पादन सर्वर पर ऐसा न करें जब तक कि आप पूरी तरह से सुनिश्चित न हों कि आप निहितार्थ समझ रहे हैं।

इससे सावधान रहने वाली एक और बात (हालाँकि यह आपके प्रश्न के लिए पूरी तरह से जर्मन नहीं है) यह सुनिश्चित करना है कि जिस तालिका का आप विस्तार कर रहे हैं, उस पर परिभाषित क्लस्टर इंडेक्स है। यदि ऐसा नहीं होता है, तो तालिका बहुत बड़ी मात्रा में ढेर विखंडन पैदा कर सकती है, और संभावित रूप से इस तरह के बदलाव पर अनावश्यक रूप से बड़ी हो सकती है।


5
  • किसी भी विदेशी कुंजी को छोड़ दें
  • के intबजाय के साथ नई तालिकाएँ बनाएँtinyint
  • 1000 के बैच के अनुसार पंक्तियों को स्थानांतरित करें (उन्हें नई तालिका में डालें, उन्हें पुराने से हटा दें)
  • पुरानी टेबलों को गिरा दो
  • उपयोग करने वाले पुराने नामों में नई तालिकाओं का नाम बदलें sp_rename
  • विदेशी कुंजियों को फिर से बनाना

pS यदि आपका लेन-देन लॉग बड़ा है ... अपने पुनर्प्राप्ति मॉडल की जाँच करें। यदि आपका पुनर्प्राप्ति मॉडल नहीं है simple, तो लॉग लॉग करने के बाद आपको कितनी देर लगी थी?


आपका मतलब है जब से आपने लॉग का बैकअप लिया है, डेटाबेस का बैकअप लेने से लॉग छोटा नहीं होगा।
HLGEM

@ एचएलजीईएम: आप सही कह रहे हैं, मैंने अभी उस विषय पर पॉल रैंडल का एक लेख पढ़ा है। हालांकि अप्रत्याशित, अगर आप केवल पूर्ण बैकअप करेंगे तो आपका लॉग बढ़ता रहेगा।
एंडोमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.