Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर लेनदेन लॉग, भाग 3:लॉगिंग मूल बातें

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

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

VLF और लॉग ट्रंकेशन

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

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

  • एक लंबे समय से चलने वाला लेन-देन है जिसका लॉग रिकॉर्ड हिस्सा है, इसलिए उन्हें तब तक जारी नहीं किया जा सकता है जब तक कि लेन-देन पूरा नहीं हो जाता है या वापस रोलिंग समाप्त नहीं हो जाता है
  • एक लॉग बैकअप ने अभी तक उन लॉग रिकॉर्ड का बैकअप नहीं लिया है
  • लॉग के उस हिस्से को अभी तक लॉग रीडर एजेंट द्वारा ट्रांजेक्शनल प्रतिकृति या चेंज डेटा कैप्चर के लिए संसाधित नहीं किया गया है
  • लॉग का वह हिस्सा अभी तक एसिंक्रोनस डेटाबेस मिरर या उपलब्धता समूह प्रतिकृति को नहीं भेजा गया है

यह नोट करना महत्वपूर्ण है कि यदि वीएलएफ के सक्रिय रहने के लिए कोई कारण नहीं हैं, तो यह लॉग ट्रंकेशन नामक प्रक्रिया तक फिर से निष्क्रिय होने पर स्विच नहीं करेगा। होता है - इस पर और नीचे।

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

चित्र 1:5 वीएलएफ के साथ काल्पनिक, एकदम नया लेनदेन लॉग, क्रम संख्या 1 5. . के माध्यम से

जैसे ही अधिक लॉग रिकॉर्ड बनाए जाते हैं, और अधिक लॉग ब्लॉक लेन-देन लॉग में लिखे जाते हैं, वीएलएफ 1 भर जाता है, इसलिए वीएलएफ 2 को और अधिक लॉग ब्लॉक लिखने के लिए सक्रिय होना पड़ता है, जैसा कि नीचे चित्र 2 में दिखाया गया है।

चित्र 2:लेन-देन लॉग के माध्यम से गतिविधि चलती है।

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

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

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

लॉग ट्रंकेशन के बारे में दो आम गलतफहमियां हैं:

  1. लेन-देन लॉग छोटा हो जाता है ("छंटनी" गलत धारणा)। नहीं, ऐसा नहीं है - लॉग ट्रंकेशन से कोई आकार परिवर्तन नहीं हुआ है। लेन-देन लॉग को छोटा करने में सक्षम एकमात्र चीज़ एक स्पष्ट DBCC SHRINKFILE है।
  2. निष्क्रिय वीएलएफ को किसी तरह ("समाशोधन" गलत धारणा) शून्य कर दिया जाता है। नहीं - वीएलएफ के निष्क्रिय होने पर वीएलएफ हेडर में कुछ क्षेत्रों को छोड़कर कुछ भी नहीं लिखा जाता है।

नीचे दिया गया चित्र 3 हमारे लेन-देन लॉग को दिखाता है जहां वीएलएफ 3 और 4 सक्रिय हैं, और लॉग ट्रंकेशन वीएलएफ 1 और 2 को निष्क्रिय चिह्नित करने में सक्षम था।

चित्र 3:पहले के वीएलएफ को निष्क्रिय के रूप में लॉग ट्रंकेशन मार्क करें।

जब लॉग ट्रंकेशन होता है तो यह निर्भर करता है कि डेटाबेस के लिए कौन सा रिकवरी मॉडल उपयोग में है:

  • सरल मॉडल:चेकपॉइंट ऑपरेशन पूरा होने पर लॉग ट्रंकेशन होता है
  • पूर्ण मॉडल या बल्क-लॉग मॉडल:लॉग ट्रंकेशन तब होता है जब लॉग बैकअप पूरा हो जाता है (जब तक कि एक समवर्ती पूर्ण या अंतर बैकअप नहीं चल रहा हो, इस स्थिति में डेटा बैकअप पूर्ण होने तक लॉग ट्रंकेशन को स्थगित कर दिया जाता है)

इसका कोई अपवाद नहीं है।

लॉग की सर्कुलर प्रकृति

लेन-देन लॉग बढ़ने से बचने के लिए, लॉग ट्रंकेशन को वीएलएफ को निष्क्रिय चिह्नित करने में सक्षम होना चाहिए। लॉग में पहला भौतिक वीएलएफ लेन-देन लॉग के लिए निष्क्रिय होना चाहिए ताकि इसकी परिपत्र प्रकृति हो।

नीचे चित्र 4 पर विचार करें, जो दर्शाता है कि वीएलएफ 4 और 5 उपयोग में हैं और लॉग ट्रंकेशन ने वीएलएफ 1 से 3 को निष्क्रिय के रूप में चिह्नित किया है। अधिक लॉग रिकॉर्ड उत्पन्न होते हैं, अधिक लॉग ब्लॉक VLF 5 में लिखे जाते हैं, और अंततः, यह भर जाता है।

चित्र 4:लेन-देन लॉग में गतिविधि उच्चतम भौतिक VLF को भरती है।

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

चित्र 5:लेन-देन लॉग और वीएलएफ पुन:उपयोग की परिपत्र प्रकृति।

जब बात गलत हो जाए

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

SELECT
      [log_reuse_wait_desc]
  FROM [master].[sys].[databases]
  WHERE [name] = N'MyDatabase';

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

परिणाम क्या है के शब्दार्थ को समझना महत्वपूर्ण है:यही कारण है कि लॉग ट्रंकेशन कुछ भी नहीं कर सका पिछली बार इसे चलाने का प्रयास किया गया . उदाहरण के लिए, परिणाम ACTIVE_BACKUP_OR_RESTORE, . हो सकता है लेकिन आप जानते हैं कि लंबे समय से चल रहा वह पूर्ण बैकअप समाप्त हो गया है। इसका सीधा सा मतलब है कि पिछली बार लॉग को काटने का प्रयास किया गया था, बैकअप अभी भी चल रहा था।

मेरे अनुभव में, लॉग काट-छाँट रोकने का सबसे आम कारण है LOG_BACKUP; यानी, लॉग बैकअप करें! लेकिन इसके साथ एक दिलचस्प, अजीब व्यवहार भी है LOG_BACKUP . यदि आप लगातार परिणाम देखते हैं LOG_BACKUP लेकिन आप जानते हैं कि लॉग बैकअप सफलतापूर्वक हो रहा है, ऐसा इसलिए है क्योंकि डेटाबेस में बहुत कम गतिविधि है और वर्तमान वीएलएफ वही है जो पिछली बार लॉग बैकअप किया गया था। तो, LOG_BACKUP इसका अर्थ है "एक लॉग बैकअप निष्पादित करें" या "बैक अप किए गए सभी लॉग रिकॉर्ड वर्तमान वीएलएफ से हैं, इसलिए इसे निष्क्रिय नहीं किया जा सका।" जब बाद वाला होता है, तो यह भ्रमित करने वाला हो सकता है।

वापस चक्कर लगा रहे हैं...

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

श्रृंखला के अगले भाग में, मैं लॉग रिकॉर्ड, वे कैसे काम करते हैं, और कुछ दिलचस्प उदाहरणों को शामिल करूँगा।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में FORMAT () द्वारा समर्थित मानक संख्यात्मक प्रारूप स्ट्रिंग्स

  2. SQL कथन के साथ प्रतिशत की गणना कैसे करें

  3. इनर ज्वाइन पर क्रॉस एप्लाई कब लगाना चाहिए?

  4. SQL सर्वर के साथ LIMIT को कैसे कार्यान्वित करें?

  5. SQL सर्वर में @@ TEXTSIZE क्या है?