लेन-देन लॉग बढ़ते क्यों है या अंतरिक्ष से बाहर चलते हैं?


264

यह अधिकांश मंचों और पूरे वेब पर एक सामान्य प्रश्न लगता है, यह यहाँ कई स्वरूपों में पूछा जाता है जो आमतौर पर इस तरह से ध्वनि करते हैं:

SQL सर्वर में -

  • लेन-देन लॉग बढ़ने के कुछ कारण क्या हैं?
  • मेरी लॉग फ़ाइल इतनी बड़ी क्यों है?
  • इस समस्या को होने से रोकने के लिए कुछ तरीके क्या हैं?
  • जब मैं अपने आप को अंतर्निहित कारण के साथ ट्रैक पर लाता हूं और अपनी लेन-देन लॉग फ़ाइल को एक स्वस्थ आकार में रखना चाहता हूं तो मैं क्या करूं?

4
वास्तव में संक्षिप्त उत्तर है: डेटाबेस को सरल मोड ( पूर्ण मोड नहीं ) में रखें। यदि आप अपने संपूर्ण रात्रिकालीन बैकअप के बीच दिन में कई लेन-देन लॉग बैकअप नहीं कर रहे हैं: आपको पूर्ण मोड की आवश्यकता नहीं है।
इयान बॉयड

@IanBoyd - निश्चित रूप से इसका सबसे सरल उत्तर है। कुंजी, हालांकि, इसका मतलब है कि हो रही है। मैं जवाब में उस पर मारा। अफसोस की बात है कि बहुत से लोग या तो इसे कभी भी संबोधित नहीं करते हैं या बस बिना समझे सरलता से आगे बढ़ते हैं। मैं अपने उत्तर को साधारण मोड पर हिट करने के लिए पहले ही संपादित कर दूँगा, हालाँकि ..
माइक वाल्श

अगर डेटाबेस फुल मोड पर सेट है, तो फुल बैक अप लें और फिर एक ट्रांजेक्शन लॉग बैकअप लें। यह एलडीएफ फाइल साइज को नीचे लाना चाहिए। यदि आप एक सिक्योरिटी ऑपेरिटन भी नहीं करते हैं। (हटना अनुशंसित नहीं है)। अभी भी फ़ाइल का आकार बड़ा है, LDF फ़ाइल के लिए प्रारंभिक आकार सेट की जाँच करें। मेरे मामले में प्रारंभिक LDF फ़ाइल का आकार बड़ा था।
user9516827

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

जवाबों:


321

एक छोटा उत्तर:

आपके पास शायद या तो एक लंबे समय तक चलने वाला लेनदेन चल रहा है (इंडेक्स मेंटेनेंस? बिग बैच डिलीट या अपडेट?) या आप "डिफ़ॉल्ट" में हैं (डिफ़ॉल्ट रूप से इसका क्या मतलब है) रिकवरी मोड का रिकवरी मोड (या लॉग इन बैकअपFull नहीं लिया है) वे अक्सर पर्याप्त नहीं ले रहे हैं)।

यदि यह पुनर्प्राप्ति मॉडल समस्या है, तो सरल उत्तर Simpleपुनर्प्राप्ति मोड पर स्विच किया जा सकता है यदि आपको समय पर पुनर्प्राप्ति और नियमित लॉग बैकअप में बिंदु की आवश्यकता नहीं है। कई लोग, हालांकि, वसूली मॉडल को समझने के बिना अपना जवाब देते हैं। यह समझने के लिए पढ़ें कि यह क्यों मायने रखता है और फिर तय करें कि आप क्या करते हैं। आप बस लॉग बैकअप लेना शुरू कर सकते हैं और Fullरिकवरी में रह सकते हैं।

अन्य कारण हो सकते हैं लेकिन ये सबसे आम हैं। यह उत्तर सबसे सामान्य दो कारणों में गोता लगाने लगता है और आपको कुछ कारणों के साथ-साथ क्यों और कैसे पीछे है, इसकी पृष्ठभूमि की जानकारी देता है।


एक लंबा जवाब: क्या परिदृश्य बढ़ते रखने के लिए लॉग का कारण बन सकते हैं? कई कारण हैं, लेकिन आमतौर पर ये कारण निम्न दो पैटर्न के होते हैं: पुनर्प्राप्ति मॉडल के बारे में गलतफहमी है या लंबे समय तक चलने वाले लेनदेन हैं। जानकारी के लिए आगे पढ़ें।

शीर्ष कारण 1/2: रिकवरी मॉडल को समझना नहीं

( पूर्ण पुनर्प्राप्ति मोड में होने के नाते और लॉग बैकअप नहीं लेना - यह सबसे आम कारण है - इस मुद्दे का अनुभव करने वाले अधिकांश लोग हैं। )

हालांकि यह उत्तर SQL सर्वर पुनर्प्राप्ति मॉडल में एक गहरा गोता नहीं है, लेकिन पुनर्प्राप्ति मॉडल का विषय इस समस्या के लिए महत्वपूर्ण है।

SQL सर्वर में, तीन पुनर्प्राप्ति मॉडल हैं :

  • Full,
  • Bulk-Logged तथा
  • Simple

हम Bulk-Loggedअभी के लिए इसे अनदेखा कर देंगे, हम कहेंगे कि यह एक हाइब्रिड मॉडल है और अधिकांश लोग जो इस मॉडल में हैं, एक कारण के लिए हैं और रिकवरी मॉडल को समझते हैं।

जिन दो की हम परवाह करते हैं और उनकी उलझन इस मुद्दे वाले अधिकांश लोगों के कारण हैं Simpleऔर हैं Full

प्रवेश: सामान्य में वसूली

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

  1. क्रैश / रिस्टार्ट रिकवरी
    ट्रांजेक्शन लॉग फ़ाइल का एक उद्देश्य क्रैश / रिस्टार्ट रिकवरी के लिए है । किसी कार्य को आगे बढ़ाने और रोल बैक करने के लिए जो क्रैश या रीस्टार्ट होने से पहले या (आगे / पीछे रोलिंग) किया गया था और जो काम शुरू किया गया था लेकिन क्रैश या रिस्टार्ट (रोलिंग बैक / पूर्ववत) के बाद समाप्त नहीं हुआ था। लेन-देन लॉग का काम यह देखना है कि लेन-देन शुरू हो गया है लेकिन कभी भी समाप्त नहीं हुआ (लुढ़का हुआ वापस लौटा या क्रैश / पुनः आरंभ हुआ लेनदेन से पहले हुआ)। उस स्थिति में रिकवरी के दौरान "अरे .. यह वास्तव में कभी खत्म नहीं हुआ, चलो इसे वापस रोल करें" कहना लॉग का काम है । यह देखना भी लॉग का काम है कि आपने कुछ खत्म किया है और आपके क्लाइंट एप्लिकेशन को बताया गया था कि यह समाप्त हो गया है (भले ही वह आपकी डेटा फ़ाइल के लिए अभी तक कठोर नहीं हुआ था) और कहें"अरे .. यह वास्तव में हुआ है, चलो इसे आगे रोल करें, चलो इसे ऐसे बनाएं जैसे अनुप्रयोगों को लगता है कि यह एक पुनरारंभ के बाद था" । अब और भी है लेकिन यही मुख्य उद्देश्य है।

  2. समय की रिकवरी में बिंदु
    एक लेन-देन लॉग फ़ाइल का दूसरा उद्देश्य हमें डेटाबेस में "उफ़" के कारण समय पर पुनर्प्राप्त करने की क्षमता देने या हार्डवेयर विफलता की स्थिति में पुनर्प्राप्ति बिंदु की गारंटी देने में सक्षम होना है। डेटाबेस के डेटा और / या लॉग फ़ाइलों को शामिल करना। यदि इस लेन-देन लॉग में लेन-देन का रिकॉर्ड होता है जो पुनर्प्राप्ति के लिए शुरू और समाप्त हो गया है, तो SQL सर्वर इस डेटाबेस का उपयोग करने के लिए इस जानकारी का उपयोग कर सकता है जहां यह समस्या होने से पहले था। लेकिन यह हमेशा हमारे लिए एक उपलब्ध विकल्प नहीं है। उस काम के लिए हमें अपने डेटाबेस को सही रिकवरी मॉडल में रखना होगा, और हमें लॉग बैकअप लेना होगा ।

रिकवरी मॉडल

वसूली मॉडल पर:

  • सरल रिकवरी मॉडल
    तो उपरोक्त परिचय के साथ, Simple Recoveryपहले मॉडल के बारे में बात करना सबसे आसान है । इस मॉडल में, आप SQL सर्वर से कह रहे हैं: "मैं आपके साथ दुर्घटना और पुनः प्राप्ति के लिए अपनी ट्रांजेक्शन लॉग फ़ाइल का उपयोग करके ठीक हूं ..." (आपके पास वास्तव में वहां कोई विकल्प नहीं है। ACID गुणों को देखें और यह जल्दी समझ में आना चाहिए।) "... लेकिन एक बार जब आपको उस क्रैश / पुनर्प्राप्ति उद्देश्य के लिए इसकी आवश्यकता नहीं होती है, तो आगे बढ़ें और लॉग फ़ाइल का पुन: उपयोग करें।"

    SQL सर्वर सिंपल रिकवरी में इस रिक्वेस्ट को सुनता है और यह केवल उन जानकारियों को रखता है जिन्हें क्रैश / रिस्टार्ट रिकवरी करने की आवश्यकता होती है। एक बार SQL सर्वर सुनिश्चित हो जाता है कि यह पुनर्प्राप्त हो सकता है क्योंकि डेटा को डेटा फ़ाइल (अधिक या कम) के लिए कठोर किया जाता है, जो डेटा कठोर किया गया है वह लॉग में अब आवश्यक नहीं है और ट्रंकेशन के लिए चिह्नित है - जिसका अर्थ है कि इसका पुनः उपयोग किया जाता है।

  • पूर्ण पुनर्प्राप्ति मॉडल के
    साथ Full Recovery, आप SQL सर्वर को बता रहे हैं कि आप समय में एक विशिष्ट बिंदु तक पुनर्प्राप्त करने में सक्षम होना चाहते हैं, जब तक कि आपकी लॉग फ़ाइल उपलब्ध है या उस समय में किसी विशिष्ट बिंदु पर लॉग बैकअप द्वारा कवर किया गया है। इस स्थिति में जब SQL सर्वर उस बिंदु पर पहुंचता है जहां सरल रिकवरी मॉडल में लॉग फ़ाइल को छोटा करना सुरक्षित होगा, तो वह ऐसा नहीं करेगा। इसके बजाय यह लॉग फ़ाइल को बढ़ने देता है और सामान्य परिस्थितियों में लॉग बैकअप लेने (या आपकी लॉग फ़ाइल ड्राइव पर स्थान से बाहर जाने) तक इसे बढ़ने देता है।

सिंपल से फुल पर स्विच करने पर एक गोटचा होता है।

यहां नियम और अपवाद हैं। हम नीचे गहराई से लंबे समय तक चलने वाले लेनदेन के बारे में बात करेंगे।

लेकिन पूर्ण पुनर्प्राप्ति मोड को ध्यान में रखने के लिए एक चेतावनी यह है: यदि आप केवल Full Recoveryमोड में स्विच करते हैं, लेकिन कभी भी प्रारंभिक पूर्ण बैकअप नहीं लेते हैं, तो SQL सर्वर मॉडल में होने के आपके अनुरोध का सम्मान नहीं करेगा Full RecoverySimpleजब तक आप पूर्ण पुनर्प्राप्ति मॉडल पर नहीं जाते हैं और अपना पहला लेते हैं , तब तक आपका लेन-देन लॉग जारी रहेगा Full Backup

लॉग बैकअप के बिना पूर्ण पुनर्प्राप्ति मॉडल खराब है।

तो, यह अनियंत्रित लॉग वृद्धि का सबसे आम कारण है? उत्तर: बिना लॉग बैकअप के पूर्ण पुनर्प्राप्ति मोड में होना।

यह तब होता है सभी लोगों के लिए समय।

यह इतनी सामान्य गलती क्यों है?

हर समय ऐसा क्यों होता है? क्योंकि प्रत्येक नए डेटाबेस को मॉडल डेटाबेस को देखकर अपनी प्रारंभिक पुनर्प्राप्ति मॉडल सेटिंग मिलती है।

मॉडल की प्रारंभिक पुनर्प्राप्ति मॉडल सेटिंग हमेशा होती है Full Recovery Model- जब तक और जब तक कि कोई इसे बदल न दे। तो आप कह सकते हैं "डिफ़ॉल्ट रिकवरी मॉडल" है Full। बहुत से लोग इसके बारे में नहीं जानते हैं और उनके डेटाबेस में Full Recovery Modelबिना लॉग बैकअप के चल रहे हैं, और इसलिए लेन-देन लॉग फ़ाइल ज़रूरत से ज़्यादा बड़ी है। यही कारण है कि चूक को बदलना महत्वपूर्ण है जब वे आपके संगठन और इसकी जरूरतों के लिए काम नहीं करते हैं)

बहुत कम लॉग बैकअप के साथ पूर्ण पुनर्प्राप्ति मॉडल खराब है।

आप लॉग इन बैकअप अक्सर पर्याप्त नहीं लेने से भी अपने आप को परेशानी में डाल सकते हैं।
लॉग बैकअप लेने से एक दिन ठीक लग सकता है, यह एक पुनर्स्थापना के लिए कम पुनर्स्थापना आदेशों की आवश्यकता है, लेकिन ऊपर चर्चा को ध्यान में रखते हुए, लॉग फ़ाइल लेने तक लॉग फ़ाइल बढ़ती और बढ़ती रहेगी।

मुझे कैसे पता चलेगा कि मुझे किस लॉग बैकअप आवृति की आवश्यकता है?

आपको दो चीजों को ध्यान में रखते हुए अपनी लॉग बैकअप आवृत्ति पर विचार करने की आवश्यकता है:

  1. रिकवरी की आवश्यकताएं - यह पहले होना चाहिए। इस घटना में कि आपके लेन-देन लॉग हाउस में ड्राइव खराब हो जाती है या आपको गंभीर भ्रष्टाचार मिलता है जो आपके लॉग बैकअप को प्रभावित करता है, कितना डेटा खो सकता है? यदि वह संख्या 10-15 मिनट से अधिक नहीं है, तो आपको चर्चा के अंत में हर 10-15 मिनट में लॉग बैकअप लेना होगा।
  2. लॉग ग्रोथ - यदि आपका संगठन अधिक डेटा खोने के लिए ठीक है, तो उस दिन आसानी से फिर से बनाने की क्षमता के कारण आप 15 मिनट से कम बार लॉग बैकअप लेना ठीक हो सकता है। हो सकता है कि आपका संगठन हर 4 घंटे में ठीक हो। लेकिन आपको यह देखना होगा कि आप 4 घंटे में कितने लेन-देन करते हैं। क्या लॉग को उन चार घंटों में बढ़ते रहने की अनुमति देगा जो लॉग फ़ाइल को बहुत बड़ा बनाते हैं? क्या इसका मतलब है कि आपके लॉग बैकअप में बहुत लंबा समय लगेगा?

शीर्ष कारण 2/2: लंबे समय तक चलने वाले लेन-देन

( "मेरा वसूली मॉडल ठीक है! लॉग अभी भी बढ़ रहा है! )

यह अनियंत्रित और अनियंत्रित लॉग वृद्धि का कारण भी हो सकता है। कोई बात नहीं रिकवरी मॉडल, लेकिन यह अक्सर "लेकिन मैं सिंपल रिकवरी मॉडल में हूं - मेरा लॉग अभी भी क्यों बढ़ रहा है?"

यहां कारण सरल है: यदि एसक्यूएल इस लेनदेन लॉग का उपयोग पुनर्प्राप्ति उद्देश्यों के लिए कर रहा है जैसा कि मैंने ऊपर वर्णित किया है, तो इसे एक लेनदेन की शुरुआत में वापस देखना होगा।

यदि आपके पास एक ऐसा लेनदेन है जिसमें बहुत समय लगता है या बहुत सारे बदलाव होते हैं, तो लॉग किसी भी बदलाव के लिए चेकपॉइंट पर नहीं काट सकता है जो अभी भी खुले लेनदेन में हैं या जो उस लेनदेन के शुरू होने के बाद से शुरू हुए हैं।

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

मैं इन लंबे समय तक चलने वाले लेनदेन के बारे में क्या कर सकता हूं?

आप अपने आप को यहाँ द्वारा बचा सकते हैं:

  • सबसे खराब स्थिति के लिए अपने लॉग फ़ाइल को उचित रूप से आकार देना - जैसे आपके रखरखाव या ज्ञात बड़े ऑपरेशन। और जब आप अपनी लॉग फाइल बढ़ाते हैं तो आपको किम्बर्ली ट्रिप द्वारा इस मार्गदर्शन (और आपके द्वारा भेजे गए दो लिंक) को देखना चाहिए । यहां राइट साइजिंग सुपर क्रिटिकल है।
  • लेन-देन के अपने उपयोग को देखना। अपने एप्लिकेशन सर्वर में लेन-देन शुरू न करें और SQL सर्वर के साथ लंबी बातचीत करना शुरू करें और एक बहुत लंबे समय तक खुला छोड़ दें।
  • आपके डीएमएल बयानों में निहित लेनदेन को देखना । उदाहरण के लिए: UPDATE TableName Set Col1 = 'New Value'एक लेनदेन है। मैंने BEGIN TRANवहां नहीं डाला और मुझे नहीं करना है, यह अभी भी एक लेनदेन है जो बस स्वचालित रूप से किया जाता है जब किया जाता है। इसलिए यदि बड़ी संख्या में पंक्तियों पर परिचालन किया जाता है, तो उन कार्यों को अधिक प्रबंधनीय चोंच में बैचने पर विचार करें और लॉग को पुनर्प्राप्त करने के लिए समय दें। या इससे निपटने के लिए सही आकार पर विचार करें। या शायद एक थोक लोड विंडो के दौरान पुनर्प्राप्ति मॉडल बदलते हैं।

क्या ये दो कारण लॉग शिपिंग के लिए भी लागू होते हैं?

संक्षिप्त उत्तर: हाँ। नीचे लंबा जवाब।

प्रश्न: "मैं लॉग शिपिंग का उपयोग कर रहा हूं, इसलिए मेरे लॉग बैकअप स्वचालित हैं ... मैं अभी भी लेनदेन लॉग वृद्धि क्यों देख रहा हूं?"

उत्तर: पर पढ़ें।

लॉग शिपिंग क्या है?

लॉग शिपिंग केवल ऐसा लगता है जैसे - आप DR लेनदेन के लिए अपने लेनदेन लॉग बैकअप को किसी अन्य सर्वर पर भेज रहे हैं। कुछ आरंभीकरण है लेकिन उसके बाद प्रक्रिया काफी सरल है:

  • एक सर्वर पर लॉग इन करने के लिए एक नौकरी,
  • एक काम है कि लॉग बैकअप की प्रतिलिपि बनाएँ और
  • एक नौकरी वसूली के बिना इसे बहाल करने के लिए (या तो NORECOVERYया STANDBYगंतव्य सर्वर पर)।

यदि आपकी योजना के अनुसार चीजें नहीं हैं, तो निगरानी और सतर्क करने के लिए कुछ नौकरियां भी हैं।

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


स्थिति कोड के माध्यम से सामान्य समस्या निवारण

इन दोनों के अलावा और भी कारण हैं, लेकिन ये सबसे आम हैं। कारण चाहे जो भी हो: एक तरीका है जिससे आप इस अस्पष्टीकृत लॉग वृद्धि / छंटनी की कमी के अपने कारण का विश्लेषण कर सकते हैं और देख सकते हैं कि वे क्या हैं।

sys.databasesकैटलॉग दृश्य को क्वेरी करके आप उस जानकारी का वर्णन देख सकते हैं जिस कारण से आपकी लॉग फ़ाइल ट्रंकट / पुनः उपयोग पर प्रतीक्षा कर रही है।

log_reuse_waitकारण कोड की लुकिंग आईडी के साथ कॉल कॉलम है और log_reuse_wait_descप्रतीक्षा कारण के विवरण के साथ एक कॉलम है। संदर्भित पुस्तकों से ऑनलाइन लेख अधिकांश कारण हैं (जिन्हें आप देखने की संभावना रखते हैं और जिन्हें हम कारणों के बारे में बता सकते हैं। लापता लोग या तो उपयोग से बाहर हैं या आंतरिक उपयोग के लिए) प्रतीक्षा के बारे में कुछ नोट्स के साथ। इटैलिक :

  • 0 = कुछ भी नहीं
    यह कैसा लगता है .. इंतजार नहीं किया जाना चाहिए

  • 1 = चेकपॉइंट होने की
    प्रतीक्षा कर रहा है। ऐसा होना चाहिए और आपको ठीक होना चाहिए - लेकिन बाद में जवाब या संपादन के लिए यहां देखने के लिए कुछ मामले हैं।

  • 2 = लॉग बैकअप
    आप लॉग बैकअप के आने की प्रतीक्षा कर रहे हैं। या तो आपने उन्हें निर्धारित किया है और यह जल्द ही होगा, या आपको यहां वर्णित पहली समस्या है और अब आप इसे ठीक करना जानते हैं

  • 3 = सक्रिय बैकअप या पुनर्स्थापना
    A बैकअप या पुनर्स्थापना कार्रवाई डेटाबेस पर चल रही है

  • 4 = सक्रिय लेनदेन
    एक सक्रिय लेनदेन है जिसे लॉग बैकअप लेने से पहले (या तो - ROLLBACKया COMMIT) पूरा करना होगा। इस उत्तर में वर्णित यह दूसरा कारण है।

  • 5 = डेटाबेस मिररिंग
    या तो एक दर्पण पीछे हो रहा है या किसी उच्च प्रदर्शन में विलंबता की स्थिति में या किसी कारण से मिररिंग किसी कारण से रोका गया है

  • 6 = प्रतिकृति प्रतिकृति के
    साथ मुद्दे हो सकते हैं जो इस कारण से होगा - जैसे लॉग रीडर एजेंट नहीं चल रहा है, यह सोचकर एक डेटाबेस प्रतिकृति के लिए चिह्नित है जो अब नहीं है और विभिन्न अन्य कारण हैं। आप इस कारण को भी देख सकते हैं और यह पूरी तरह से सामान्य है क्योंकि आप सिर्फ सही समय देख रहे हैं, जैसे कि लॉग रीडर द्वारा लेनदेन किया जा रहा है

  • 7 = डेटाबेस स्नैपशॉट निर्माण
    आप एक डेटाबेस स्नैपशॉट बना रहे हैं, अगर आप स्नैपशॉट बना रहे हैं तो आप इसे सही समय पर देखेंगे।

  • 8 = लॉग स्कैन
    मेरे पास अभी तक इस मुद्दे को हमेशा के लिए चलाने के साथ सामना करने के लिए है। यदि आप लंबे समय तक और बार-बार पर्याप्त देखते हैं तो आप ऐसा हो सकते हैं, लेकिन यह अत्यधिक लेन-देन लॉग वृद्धि का कारण नहीं होना चाहिए, जो मैंने देखा है।

  • 9 = एक ऑल्टरऑन उपलब्धता समूह द्वितीयक प्रतिकृति इस डेटाबेस के लेन-देन लॉग रिकॉर्ड को संबंधित माध्यमिक डेटाबेस पर लागू कर रही है। अभी तक स्पष्ट विवरण के बारे में ..


1
पेज विभाजन लॉगिंग को बढ़ाएगा। एक महत्वपूर्ण कारण (मेरे अनुभव में) जिसका उल्लेख बड़ी वृद्धि के लिए नहीं किया गया है जिसके लिए बार-बार सिकुड़ने की आवश्यकता हो सकती है जिसे मेरे बहुत से मामलों में हल किया गया है उचित FillFactor mgmt सहित उचित सूचकांक विकल्पों का उपयोग करना होगा। मैं नज़दीकी अवलोकन के साथ, निम्नलिखित सेटिंग्स का उपयोग करता हूं। एफएफ सेटिंग्स: (0/100) उच्च-रीड्स / लो राइट्स के साथ टेबल, (90) थोड़ा संशोधित के लिए, (80) मध्यम-रीड्स / कम-मेड लिखते हैं, (70) हाई-राइट्स, (60) मैं शायद ही इस तक पहुंच पाता हूं स्तर या कुछ और गलत हो सकता है। डेटा वॉल्यूम के मिलान के बाद ठीक से इंडेक्स मैनेजमेंट शेड्यूल का उपयोग करें।
स्नैपजैग

113

चूंकि मैं स्टैक ओवरफ्लो पर किसी भी जवाब से वास्तव में संतुष्ट नहीं हूं , जिसमें सबसे भारी-भरकम सुझाव भी शामिल है, और क्योंकि कुछ चीजें हैं जिन्हें मैं संबोधित करना चाहूंगा कि माइक का जवाब नहीं है, मैंने सोचा कि मैं प्रदान करता हूं मेरा इनपुट यहाँ भी। मैंने इस जवाब की एक प्रति वहां भी रखी।

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

सबसे पहले, एक पूर्ण बैकअप लें

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

अगर आप पॉइंट-इन-टाइम रिकवरी की परवाह करते हैं

(और पॉइंट-इन-टाइम रिकवरी से मेरा मतलब है कि आप एक पूर्ण या अंतर बैकअप के अलावा किसी भी चीज़ को पुनर्स्थापित करने में सक्षम होने के बारे में परवाह करते हैं।)

संभवतः आपका डेटाबेस FULLरिकवरी मोड में है। यदि नहीं, तो सुनिश्चित करें कि यह है:

ALTER DATABASE yourdb SET RECOVERY FULL;

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

DECLARE @path NVARCHAR(255) = N'\\backup_share\log\yourdb_' 
  + CONVERT(CHAR(8), GETDATE(), 112) + '_'
  + REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','')
  + '.trn';

BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;

ध्यान दें कि \\backup_share\एक अलग मशीन पर होना चाहिए जो एक अलग अंतर्निहित भंडारण उपकरण का प्रतिनिधित्व करता है। एक ही मशीन (या एक अलग मशीन में जो एक ही अंतर्निहित डिस्क का उपयोग करता है, या एक ही भौतिक होस्ट पर एक अलग VM का उपयोग करता है) के लिए इनका समर्थन करना वास्तव में आपकी मदद नहीं करता है, क्योंकि यदि मशीन चल रही है, तो आपने अपना डेटाबेस खो दिया है और इसके बैकअप। आपके नेटवर्क इन्फ्रास्ट्रक्चर के आधार पर यह स्थानीय रूप से बैकअप के लिए अधिक समझ में आता है और फिर उन्हें पर्दे के पीछे एक अलग स्थान पर स्थानांतरित कर सकता है; या तो मामले में, आप उन्हें प्राथमिक डेटाबेस मशीन से जितनी जल्दी हो सके निकालना चाहते हैं।

अब, जब आपके पास नियमित रूप से लॉग बैकअप चल रहा है, तो लॉग फ़ाइल को कुछ और जो वह अब तक उड़ाया गया है, की तुलना में अधिक उचित है, को सिकोड़ना उचित होना चाहिए। इसका मतलब यह नहीं है SHRINKFILEकि लॉग फ़ाइल 1 एमबी तक बार-बार चल रही है - भले ही आप लॉग को बार-बार बैकअप कर रहे हों, फिर भी इसे होने वाले किसी भी समवर्ती लेनदेन के योग को समायोजित करने की आवश्यकता है। लॉग फ़ाइल ऑटोज्रो इवेंट्स महंगे होते हैं, क्योंकि SQL सर्वर को फ़ाइलों को शून्य करना पड़ता है (डेटा फ़ाइलों के विपरीत जब त्वरित फ़ाइल आरंभीकरण सक्षम होता है), और ऐसा होने पर उपयोगकर्ता लेनदेन का इंतजार करना पड़ता है। आप इस ग्रोथ-सिकुड़न-बढ़ते-सिकुड़ते रूटीन को जितना हो सके कम करना चाहते हैं, और आप निश्चित रूप से अपने उपयोगकर्ताओं को इसके लिए भुगतान नहीं करना चाहते हैं।

ध्यान दें कि सिकुड़ने से पहले लॉग को दो बार बैकअप लेना पड़ सकता है (धन्यवाद रॉबर्ट)।

तो, आपको अपनी लॉग फ़ाइल के लिए एक व्यावहारिक आकार के साथ आने की आवश्यकता है। यहां कोई भी आपको यह नहीं बता सकता है कि आपके सिस्टम के बारे में बहुत कुछ जानने के बिना क्या है, लेकिन अगर आप लॉग फ़ाइल को बार-बार सिकोड़ रहे हैं और यह फिर से बढ़ रहा है, तो एक अच्छा वॉटरमार्क शायद 10-50% सबसे बड़ा है। । मान लीजिए कि 200 एमबी आता है, और आप चाहते हैं कि कोई भी ऑटोग्रॉथ इवेंट 50 एमबी का हो, तो आप लॉग फाइल का आकार इस तरह से समायोजित कर सकते हैं:

USE [master];
GO
ALTER DATABASE Test1 
  MODIFY FILE
  (NAME = yourdb_log, SIZE = 200MB, FILEGROWTH = 50MB);
GO

ध्यान दें कि यदि लॉग फ़ाइल वर्तमान में> 200 एमबी है, तो आपको इसे पहले चलाने की आवश्यकता हो सकती है:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);
GO

यदि आप समय-समय पर पुनर्प्राप्ति के बारे में परवाह नहीं करते हैं

यदि यह एक परीक्षण डेटाबेस है, और आप पॉइंट-इन-टाइम रिकवरी के बारे में परवाह नहीं करते हैं, तो आपको यह सुनिश्चित करना चाहिए कि आपका डेटाबेस SIMPLEरिकवरी मोड में है।

ALTER DATABASE yourdb SET RECOVERY SIMPLE;

डेटाबेस को SIMPLEरिकवरी मोड में रखने से यह सुनिश्चित हो जाएगा कि SQL सर्वर सभी लेनदेन का रिकॉर्ड रखने के लिए बढ़ते हुए लॉग फ़ाइल (अनिवार्य रूप से निष्क्रिय लेनदेन को चरणबद्ध तरीके से) का पुन: उपयोग करता है (जैसे FULLरिकवरी तब तक होती है जब तक आप लॉग को वापस नहीं करते)। CHECKPOINTईवेंट लॉग को नियंत्रित करने में मदद करेंगे और यह सुनिश्चित करेंगे कि जब तक आप CHECKPOINTएस के बीच बहुत अधिक टी-लॉग गतिविधि नहीं उत्पन्न करते हैं, तब तक इसे बढ़ने की आवश्यकता नहीं है ।

अगला, आपको यह सुनिश्चित करना चाहिए कि यह लॉग वृद्धि वास्तव में एक असामान्य घटना (जैसे, एक वार्षिक वसंत सफाई या आपकी सबसे बड़ी अनुक्रमित पुनर्निर्माण) के कारण हुई है, और सामान्य, रोजमर्रा के उपयोग के कारण नहीं। यदि आप लॉग फ़ाइल को एक हास्यास्पद छोटे आकार में सिकोड़ते हैं, और SQL सर्वर को अपनी सामान्य गतिविधि को समायोजित करने के लिए इसे फिर से बढ़ाना पड़ता है, तो आपको क्या लाभ होगा? क्या आप उस डिस्क स्थान का उपयोग करने में सक्षम थे जिसे आपने केवल अस्थायी रूप से मुक्त किया था? यदि आपको तत्काल सुधार की आवश्यकता है, तो आप निम्नलिखित को चला सकते हैं:

USE yourdb;
GO
CHECKPOINT;
GO
CHECKPOINT; -- run twice to ensure file wrap-around
GO
-- 200 MB
DBCC SHRINKFILE(yourdb_log, 200);
GO

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

कुछ चीजें जो आप नहीं करना चाहते हैं

  • TRUNCATE_ONLYविकल्प के साथ लॉग का बैकअप लें और फिरSHRINKFILE । एक के लिए, यह TRUNCATE_ONLYविकल्प हटा दिया गया है और अब SQL सर्वर के वर्तमान संस्करणों में उपलब्ध नहीं है। दूसरा, यदि आप FULLपुनर्प्राप्ति मॉडल में हैं, तो यह आपकी लॉग श्रृंखला को नष्ट कर देगा और एक नए, पूर्ण बैकअप की आवश्यकता होगी।

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

  • "सिकुड़ डेटाबेस" विकल्प का उपयोग करेंDBCC SHRINKDATABASEऔर ऐसा करने के लिए रखरखाव योजना विकल्प बुरे विचार हैं, खासकर यदि आपको वास्तव में केवल लॉग समस्या का समाधान करने की आवश्यकता है। उस फ़ाइल को लक्षित करें जिसे आप स्वतंत्र रूप से समायोजित और समायोजित करना चाहते हैं, ( DBCC SHRINKFILEया ALTER DATABASE ... MODIFY FILEऊपर दिए गए उदाहरण)।

  • लॉग फ़ाइल को 1 MB तक सिकोड़ें । यह आकर्षक लग रहा है क्योंकि, हे, SQL सर्वर मुझे कुछ परिदृश्यों में ऐसा करने देगा, और इसे मुक्त करने वाले सभी स्थान को देखेगा! जब तक आपके डेटाबेस को केवल पढ़ा जाता है (और यह है, तो आपको इसे इस तरह के उपयोग के रूप में चिह्नित करना चाहिए ALTER DATABASE), यह बिल्कुल कई अनावश्यक विकास घटनाओं को जन्म देगा, क्योंकि लॉग को पुनर्प्राप्ति मॉडल की परवाह किए बिना वर्तमान लेनदेन को समायोजित करना होगा। उस स्थान को अस्थायी रूप से मुक्त करने का क्या मतलब है, बस एसक्यूएल सर्वर इसे धीरे-धीरे और दर्द से वापस ले सकता है?

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

सक्रिय होना

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

यहां सबसे खराब संभव सेटिंग्स 1 एमबी विकास या 10% वृद्धि हैं। मजाकिया तौर पर, ये SQL सर्वर के लिए डिफॉल्ट हैं (जिनके बारे में मैंने शिकायत की है और बिना किसी लाभ के बदलाव के लिए पूछा है ) - डेटा फ़ाइलों के लिए 1 एमबी, और लॉग फ़ाइलों के लिए 10%। पूर्व इस दिन और उम्र में बहुत छोटा है, और बाद में हर बार लंबी और लंबी घटनाएं होती हैं (कहते हैं, आपकी लॉग फ़ाइल 500 एमबी है, पहली वृद्धि 50 एमबी है, अगली वृद्धि 55 एमबी है, अगली वृद्धि 60.5 एमबी है , इत्यादि - और धीमी आई / ओ पर, मेरा विश्वास करो, आप वास्तव में इस वक्र को नोटिस करेंगे)।

आगे की पढाई

कृपया यहाँ मत रुकिए; लॉग फ़ाइल के सिकुड़ने के बारे में आप जो सलाह देते हैं, उसमें से बहुत कुछ गलत है और संभावित रूप से विनाशकारी भी है, लेकिन कुछ लोग ऐसे भी हैं जो डिस्क स्पेस को खाली करने की तुलना में डेटा अखंडता की अधिक परवाह करते हैं।


27

आप अपनी लॉग फ़ाइल की सामग्री भी देख सकते हैं। ऐसा करने के लिए, आप अपंजीकृत का उपयोग कर सकते हैं fn_dblog, या एक लेनदेन लॉग रीडर, जैसे कि एपेक्सक्यूएल लॉग

यह सूचकांक पुनर्गठन प्रदर्शित नहीं करता है, लेकिन यह पता चलता सभी DML और विभिन्न DDL घटनाओं: ALTER, CREATE, DROP, ट्रिगर अक्षम सक्षम / अनुदान / निरस्त कर अनुमतियाँ, वस्तु का नाम बदलें।

ApexSQLLogProject.temp - ApexSQL.log

अस्वीकरण: मैं एक सहायक अभियंता के रूप में एपेक्सक्यूएल के लिए काम करता हूं


5

यह लगभग सभी डीबीए के लिए सबसे अधिक बार सामना किया जाने वाला मुद्दा है जहां लॉग बढ़ता है और डिस्क को भरता है।

• लेन-देन लॉग बढ़ने के कुछ कारण क्या हैं?

  1. लॉन्ग एक्टिव ट्रांजैक्शन
  2. हाई लॉगिंग ट्रांजेक्शन जैसे इंडेक्स रीइंवेस्ट, री-ऑर्गन, बल्क इंसर्ट, डेलीटेस आदि।
  3. किसी भी हा जैसे प्रतिकृति, मिररिंग कॉन्फ़िगर किया गया है जो लॉग रखता है और इसे लॉग स्पेस को रिलीज़ करने की अनुमति नहीं देता है

• मेरी लॉग फ़ाइल इतनी बड़ी क्यों है?

ट्रंकिंग से लॉग को पकड़े रखने के लिए टेबल log_reuse_wait_desमें सी कॉलम की जाँच करें sys.databases:

select name, log_reuse_wait_desc 
from sys.databases

• इस समस्या को होने से रोकने के लिए कुछ तरीके क्या हैं?

लॉग बैकअप आपको लॉग ग्रोथ को नियंत्रित करने में मदद करेगा जब तक कि कुछ ऐसा न हो जो लॉग को पुन: उपयोग करने से रोक रहा हो।

• जब मैं अपने आप को अंतर्निहित कारण के साथ ट्रैक पर लाता हूं और अपने लेनदेन की लॉग फाइल को स्वस्थ आकार में रखना चाहता हूं तो मैं क्या करूं?

यदि आपने पहचान लिया है कि वास्तव में क्या कारण है तो नीचे दिए गए पृष्ठ के अनुसार इसे ठीक करने का प्रयास करें।

https://www.brentozar.com/archive/2016/03/my-favorite-system-column-log_reuse_wait_desc/

जब तक कोई असामान्य स्थिति न हो, तब तक लॉग लॉग शेड्यूल्ड होना उचित तरीका है।

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