एक डेटा पेशेवर के रूप में अपने पूरे करियर के दौरान, Microsoft के अंदर और एक सलाहकार के रूप में, मैंने पाया है कि SQL सर्वर डेटाबेस के सबसे गलत हिस्सों में से एक लेनदेन लॉग है। लेन-देन लॉग कैसे काम करता है और इसे प्रबंधित करने की आवश्यकता है, या केवल साधारण गलत धारणाओं के ज्ञान की कमी, सभी प्रकार की उत्पादन समस्याओं को जन्म दे सकती है, जिनमें शामिल हैं:
- लेन-देन लॉग नियंत्रण से बाहर हो रहा है और संभावित रूप से स्थान से बाहर चल रहा है
- लेन-देन लॉग के बार-बार सिकुड़ने से प्रदर्शन संबंधी समस्याएं
- VLF फ़्रेग्मेंटेशन के नाम से जानी जाने वाली समस्या से प्रदर्शन संबंधी समस्याएं , जिसकी चर्चा मैंने इस पोस्ट में की है
- लेन-देन लॉग बैकअप का उपयोग करके वांछित समय पर पुनर्प्राप्त करने में असमर्थता
- आपदा पुनर्प्राप्ति के दौरान टेल-लॉग बैकअप करने में असमर्थता (टेल-लॉग बैकअप की व्याख्या के लिए यहां देखें)
- विफलताओं और प्रदर्शन को बहाल करने से संबंधित विभिन्न मुद्दे
इस पोस्ट के साथ, मैं लेन-देन लॉग पर एक सामयिक श्रृंखला शुरू कर रहा हूं और यह कैसे काम करता है और इसे प्रबंधित किया जाना चाहिए, और मैं इसके पाठ्यक्रम के ऊपर की सभी समस्याओं को छूऊंगा। इस पोस्ट में, मैं समझाऊंगा कि लॉगिंग क्या है और इसकी आवश्यकता क्यों है।
लॉगिंग से जुड़ी बुनियादी शब्दावली
जब मैं SQL सर्वर में किसी भी तंत्र के बारे में बात कर रहा होता हूं, तो मुझे लगता है कि चिकन और अंडे की समस्या है, जहां मुझे इसे समझाने से पहले किसी शब्द या वाक्यांश का उपयोग करने की आवश्यकता होती है। इस श्रृंखला में उस समस्या से बचने के लिए, मैं कुछ शब्दावली की व्याख्या करके शुरू करने जा रहा हूं, जिसका उपयोग लॉगिंग पर चर्चा करते समय किया जाना चाहिए, और जैसे-जैसे श्रृंखला आगे बढ़ेगी, मैं इनमें से कई शर्तों का विस्तार करूंगा।
लेन-देन, प्रतिबद्धता और रोलबैक
एक लेन-देन में एक डेटाबेस में परिवर्तन या परिवर्तनों का एक सेट शामिल होता है। इसकी एक परिभाषित शुरुआत और एक परिभाषित अंत है। शुरुआत तब होती है जब एक BEGIN TRANSACTION कथन का उपयोग किया जाता है, या SQL सर्वर स्वचालित रूप से आपके लिए एक लेनदेन शुरू करता है। अंत चार चीजों में से एक हो सकता है:
- लेन-देन तब होता है जब एक प्रतिबद्ध लेनदेन विवरण निष्पादित किया जाता है
- लेनदेन तब होता है जब SQL सर्वर स्वचालित रूप से लेनदेन के मामले में स्वचालित रूप से लेनदेन करता है
- रोलबैक ट्रांजेक्शन स्टेटमेंट के निष्पादित होने के बाद लेन-देन समाप्त हो जाता है
- एक समस्या होने के बाद लेन-देन वापस रोल करना समाप्त कर देता है, और SQL सर्वर स्वचालित रूप से लेनदेन को वापस ले लेता है
जब कोई लेन-देन करता है, तो किए गए लेन-देन को डेटाबेस में अंतिम रूप दिया जाता है और डिस्क पर SQL सर्वर लेनदेन लॉग में टिकाऊ होते हैं। ध्यान दें कि मैंने कहा, "लेन-देन लॉग में।" मेमोरी में डेटा फ़ाइल पृष्ठों में वास्तविक परिवर्तन डिस्क पर *नहीं* लिखे जाते हैं जब लेनदेन होता है। उन्हें डेटा फ़ाइलों में टिकाऊ बनाने की आवश्यकता नहीं है क्योंकि लेन-देन लॉग में परिवर्तन पहले से ही टिकाऊ हैं। अंततः, डेटा फ़ाइल पृष्ठ चेकपॉइंट ऑपरेशन द्वारा डिस्क पर लिखे जाएंगे।
इसके विपरीत, जब कोई लेन-देन वापस आ जाता है, तो किए गए लेन-देन में डेटा परिवर्तन डेटाबेस में मौजूद नहीं होते हैं। डेटाबेस में अभी भी कुछ भौतिक परिवर्तन होंगे, क्योंकि लेन-देन को वापस करने का अर्थ है अधिक परिवर्तन करना, लेकिन आप रोल बैक लेनदेन को डेटाबेस में डेटा को प्रभावित नहीं करने के बारे में सोच सकते हैं।
चेकपॉइंट और रोलबैक ऑपरेशन उनके अपने पोस्ट के योग्य विषय हैं, इसलिए मैं उन्हें बाद में श्रृंखला में समझाऊंगा।
मैं ट्यूटोरियल एसक्यूएल सर्वर लेनदेन का परिचय . में इन तीन शब्दों पर अधिक गहराई से चर्चा करता हूं संतरीवन ब्लॉग पर।
लॉगिंग, लॉग रिकॉर्ड और SQL सर्वर ट्रांजेक्शन लॉग
लॉगिंग का सीधा सा मतलब है किसी डेटाबेस में बदलाव का एक टिकाऊ विवरण बनाना, लगभग हमेशा लेनदेन के संदर्भ में। जब कोई परिवर्तन किया जाता है, तो परिवर्तन को लॉग रिकॉर्ड में वर्णित किया जाता है। एक लॉग रिकॉर्ड में आमतौर पर पर्याप्त जानकारी होती है ताकि परिवर्तन को डेटाबेस में फिर से चलाया जा सके या यदि आवश्यक हो तो डेटाबेस में वापस रोल किया जा सके।
यह लॉग रिकॉर्ड प्रारंभ में स्मृति में होगा और लेन-देन करने से पहले डिस्क पर लिखा जा सकता है, लेकिन निश्चित रूप से डिस्क पर पहले लिखा जाना चाहिए लेन-देन पूरा हो सकता है, अन्यथा लेन-देन टिकाऊ नहीं होगा। इस नियम का अपवाद तब होता है जब विलंबित स्थायित्व सुविधा सक्षम है, जिसकी चर्चा आरोन बर्ट्रेंड ने इस पोस्ट में की है।
लॉग रिकॉर्ड लेन-देन लॉग (डिस्क पर एक या अधिक लॉग फ़ाइलें) में संग्रहीत होते हैं, जिसमें कुछ जटिल आंतरिक वास्तुकला होती है, और मैं श्रृंखला में अगली पोस्ट में लॉग रिकॉर्ड पर और बहुत कुछ पर चर्चा करूंगा।
क्रैश रिकवरी
एक क्रैश वह जगह है जहां SQL सर्वर अप्रत्याशित रूप से बंद हो जाता है, और विभिन्न परिवर्तित डेटाबेस सही ढंग से बंद नहीं हो पा रहे थे (सुनिश्चित करें कि सभी परिवर्तित डेटा फ़ाइल पृष्ठ डिस्क पर लिखे गए हैं और डेटाबेस को क्लीनली शट डाउन के रूप में चिह्नित किया गया है)।
जब SQL सर्वर शुरू होता है, तो यह देखने के लिए सभी डेटाबेस की जांच करता है कि क्या किसी को क्लीनली शट डाउन के रूप में चिह्नित नहीं किया गया था। यदि यह एक पाता है, तो उस डेटाबेस को क्रैश रिकवरी से गुजरना होगा। यह निम्नलिखित सुनिश्चित करता है:
- दुर्घटना से पहले किए गए किसी भी लेनदेन के लिए, सुनिश्चित करें कि लेनदेन में सभी परिवर्तन डेटाबेस में दिखाई दे रहे हैं (यानी, लेनदेन को फिर से चलाएं)
- किसी भी लेन-देन के लिए जो दुर्घटना से पहले नहीं किया गया था, सुनिश्चित करें कि लेनदेन में कोई भी परिवर्तन डेटाबेस में परिलक्षित नहीं होता है (यानी, लेनदेन को वापस रोल करें)
दूसरे शब्दों में, क्रैश रिकवरी डेटाबेस को लेन-देन की दृष्टि से सुसंगत बनाती है जिस समय दुर्घटना हुई। क्रैश रिकवरी का उपयोग किया जाता है:
- जब SQL सर्वर प्रारंभ होता है और एक डेटाबेस ढूंढता है जिसे पुनर्प्राप्त करने की आवश्यकता होती है
- डेटाबेस की द्वितीयक प्रतिलिपि में विफलता के दौरान
- बैकअप से जुड़े पुनर्स्थापना अनुक्रम के अंत में (यहां देखें)
क्रैश पुनर्प्राप्ति एक जटिल प्रक्रिया है और इससे पहले कि मैं इसे गहराई से समझा सकूं, श्रृंखला में कुछ और पोस्ट की आवश्यकता है।
लॉगिंग क्यों आवश्यक है?
लॉगिंग का सबसे बुनियादी कारण SQL सर्वर डेटाबेस को लेनदेन को टिकाऊ बनाने की अनुमति देना है, ताकि उन्हें क्रैश रिकवरी के दौरान पुनर्प्राप्त किया जा सके या सामान्य डेटाबेस संचालन के दौरान आवश्यक होने पर वापस रोल किया जा सके। यदि कोई लॉगिंग नहीं होती, तो एक डेटाबेस क्रैश के बाद लेन-देन की दृष्टि से असंगत और संभवतः संरचनात्मक रूप से भ्रष्ट होता।
हालांकि लॉगिंग के बिना, SQL सर्वर में कई अन्य सुविधाएँ संभव नहीं होंगी, जिनमें शामिल हैं:
- डेटा बैकअप जिन्हें लगातार पुनर्प्राप्त किया जा सकता है
- एसक्यूएल सर्वर ट्रांजेक्शन लॉग बैकअप जिनका उपयोग रिस्टोर ऑपरेशन के दौरान और लॉग शिपिंग को लागू करने के लिए किया जा सकता है
- प्रतिकृति, जो लेन-देन लॉग से लेनदेन को काटने में सक्षम होने पर निर्भर करती है
- डेटा कैप्चर बदलें, जो लेन-देन लॉग से परिवर्तन प्राप्त करने के लिए लेन-देन प्रतिकृति लॉग रीडर एजेंट का उपयोग करता है
- डेटाबेस मिररिंग और उपलब्धता समूह, जो फिर से चलाने के लिए डेटाबेस की सेकेंडरी कॉपी में लॉग रिकॉर्ड भेजने पर निर्भर करते हैं
SQL सर्वर (और सभी समान डेटाबेस सर्वर) का उपयोग करता है जिसे राइट-आगे लॉगिंग कहा जाता है . इसका मतलब यह है कि परिवर्तनों का विवरण डिस्क पर लिखा जाना चाहिए ताकि परिवर्तनों को स्वयं ठीक से क्रैश करने की क्षमता की गारंटी देने के लिए डेटाबेस को पुनर्प्राप्त किया जा सके। यदि लॉग रिकॉर्ड का वर्णन करने से पहले डेटा फ़ाइल में कोई परिवर्तन लिखा गया था, और SQL सर्वर क्रैश हो गया था, तो यह जानने का कोई तरीका नहीं होगा कि क्या रोल करना है, और डेटाबेस असंगत होगा। यह आदेश एक अपरिवर्तनीय है, इससे कोई फर्क नहीं पड़ता कि अलगाव स्तर, लेनदेन का प्रकार, या विलंबित स्थायित्व सुविधा का उपयोग किया जाता है या नहीं। पहले लॉग रिकॉर्ड करें, डेटा पेज बाद में।
जस्ट द टिप ऑफ द आइसबर्ग
जैसा कि आप इस परिचयात्मक पोस्ट से देख सकते हैं, एक बड़ी राशि लेन-देन लॉग और SQL सर्वर डेटाबेस में लॉगिंग में जाती है, और अब तक मैंने जो कुछ किया है वह कुछ उच्च-स्तरीय शब्दावली को परिभाषित करता है और बताता है कि लॉगिंग की आवश्यकता क्यों है। मुझे आशा है कि जैसे-जैसे मैं आगे बढ़ूंगा, आप मेरे साथ जुड़ेंगे और जैसे-जैसे श्रृंखला आगे बढ़ेगी, आप और गहराई तक जाते जाएंगे!