CHECKPOINT या COMMIT डिस्क पर लिखता है?


12

मान लीजिए, SQLServer2008R2 और उच्चतर के लिए, पूर्ण पुनर्प्राप्ति मोड डेटाबेस के साथ।

मैं हमेशा सोचता हूँ :

  1. जब कोई लेन-देन शुरू होता है (COMMIT), तो लेन-देन RAM में लेनदेन लॉग के लिए लिखा जाता है।

  2. जब एक CHECKPOINT होता है (कुछ समय और / या कुछ लेनदेन और अन्य मानदंडों के बाद), पिछले CHECKPOINT और वर्तमान के बीच लेनदेन डिस्क पर लिखे जाते हैं।

  3. जब एक बेक लॉग होता है, तो एमडीएफ फ़ाइल को डेटा लिखा जाता है।

क्या मैं सही हूँ? मेरे कुछ आरोपों में कहा गया है कि मैं गलत हूँ, और BOL के साथ भी इसका सही उत्तर खोजना कठिन है।

धन्यवाद!


जवाबों:


20

दुर्भाग्य से, जवाब में त्रुटियों के एक नंबर रहे हैं कि कैसे COMMIT काम करता है के संबंध में, इसलिए मैं एक और एक जोड़ देंगे। देखें कि यह कैसे काम करता है: विवरण के लिए बॉब डोर का SQL सर्वर I / O प्रस्तुति और SQL Server 2000 I / O मूल बातें । यहाँ दिया गया है कि यह कैसे काम करता है:

  • सभी पूरी तरह से लॉग किए गए डेटा लिखते हैं (परिवर्तन) ठीक इसी क्रम में होते हैं (देखें कि कैसे SQL सर्वर क्वेरी को लिखता है: डेटा को निष्पादित करता है ):

    • डेटा पेज विशेष रूप से लिया गया है
    • परिवर्तन का वर्णन करने वाला लॉग रिकॉर्ड मेमोरी में लॉग करने के लिए जोड़ा जाता है। नया लॉग रिकॉर्ड एक नया एलएसएन उत्पन्न करता है, देखें कि एलएसएन क्या है: लॉग अनुक्रम संख्या
    • डेटा पृष्ठ संशोधित किया गया है (दोनों डेटा रिकॉर्ड और पृष्ठ पर last_update_lsn)। यह अब संशोधित ('गंदा') पृष्ठ है।
    • डेटा पृष्ठ कुंडी जारी की जाती है
    • अपडेट के परिणामस्वरूप सीधे डिस्क पर कुछ भी नहीं लिखा जाता है
  • एक COMMIT निम्नलिखित करता है

    • स्मृति में लॉग को COMMIT का वर्णन करते हुए एक नया लॉग रिकॉर्ड जोड़ता है
    • सभी लॉग रिकॉर्ड डिस्क पर फ्लश नहीं किए जाते हैं, ऊपर और एक उत्पन्न सहित, फ्लश किए गए हैं (डिस्क पर लिखे गए)
    • थ्रेड ब्लॉक्स प्रतीक्षा करता है जब तक कि ओएस ऊपर लिखी रिपोर्ट को टिकाऊ (आईओ पूरा नहीं करता)
    • COMMIT स्टेटमेंट (या अंतर्निहित कमिटमेंट के साथ DML स्टेटमेंट) पूरा होता है
  • एक CHECKPOINT निम्नलिखित (सरलीकृत) करता है, देखें कि कैसे चौकियों काम करती हैं और क्या लॉग होता है :

    • स्मृति में सभी गंदे पृष्ठ डिस्क पर लिखे गए हैं
      • प्रत्येक गंदे पृष्ठ के लिए, डिस्क पर लिखना शुरू करने से पहले, लॉग इन करें और एलएसएन को शामिल करें जो कि उस पृष्ठ पर last_update_lsn है जिसे फ्लश किया गया है (डिस्क पर लिखा गया है)। ध्यान दें कि किसी भी LSN का अर्थ है कि पिछले सभी LSN भी फ्लश हो गए हैं, इसलिए सबसे गंदे पृष्ठों के लिए यह एक नो-ऑप है क्योंकि यह स्वयं last_update है जो पहले से ही फ्लश है।
    • चेकपॉइंट का वर्णन करने वाला लॉग रिकॉर्ड लॉग को लिखा जाता है और फ्लश किया जाता है
    • डेटाबेस बूट पेज ऊपर उत्पन्न रिकॉर्ड के LSN के साथ अद्यतन है

न्यूनतम रूप से लॉग किए गए कार्यों के लिए राइट्स अलग तरह से काम करते हैं, ऑपरेशंस देखें जो मिनिमली लॉग हो सकते हैं । मोटे तौर पर न्यूनतम रूप से लॉग किए गए ऑपरेशन निम्नलिखित (सरलीकृत) कार्य करते हैं:

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

8

जब कोई लेन-देन शुरू होता है (COMMIT), तो लेन-देन RAM में लेनदेन लॉग के लिए लिखा जाता है।

क्वेरी या अनुरोध के अनुसार पृष्ठ या डेटा बदलने से पहले लेन-देन लॉग को एक लेन-देन लिखा जाता है। इसे राइट फॉर लॉगिंग (वाल) कहा जाता है। यदि SQL सर्वर क्रैश हो जाता है जबकि एक पेज मेमोरी वाल में अपडेट किया जा रहा है तो यह सुनिश्चित करता है कि DB इंजन ट्रांजेक्शन लॉग को पढ़ सकता है और ट्रांजेक्शन को रोलबैक कर सकता है। यह एक RDBMS की एक ACID संपत्ति है।

जब एक CHECKPOINT होता है (कुछ समय और / या कुछ लेनदेन और अन्य मानदंडों के बाद), पिछले CHECKPOINT और वर्तमान के बीच लेनदेन डिस्क पर लिखे जाते हैं।

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

जब एक बेक लॉग होता है, तो एमडीएफ फ़ाइल को डेटा लिखा जाता है।

नहीं, जब बैकअप लॉग होता है तो SQL सर्वर ट्रांजेक्शन लॉग जानकारी को डेटाबेस लॉग फ़ाइल से उस डिस्क पर भेजता है जहाँ आप बैकअप लिख रहे हैं। बैकअप ऑपरेशन डिस्क से डेटा पढ़ता है और डिस्क पर डेटा लिखता है।

मैं चाहूंगा कि आप नीचे दिए गए लिंक को पढ़ें

SQL सर्वर में लॉगिंग और रिकवरी को समझना पहले से ही मार्क द्वारा इंगित किया गया है

SQL सर्वर 2008 इंटर्न और समस्या निवारण पुस्तक

लेन-देन लॉग आर्किटेक्चर और प्रबंधन


ठीक है, स्पष्ट लगता है। बस निश्चित होने के लिए: जब एक COMMIT होता है, तो आप कहते हैं कि यह लेन-देन लॉग में लिखा है; क्या आपका मतलब बफर या डिस्क (LDF) है?
पेटेंट

यह हमेशा पहले कैश लॉग करने के लिए लिखा जाएगा और फिर बाद में डिस्क पर लेन-देन लॉग करने के लिए फ्लश किया गया। मैंने लेन-देन लॉग प्रबंधन लिंक जोड़ दिया है कृपया इसके लिए संदर्भ दें कि वाल कैसे काम करता है
Shanky

"यदि SQL सर्वर क्रैश हो जाता है जबकि एक पेज मेमोरी वाल में अपडेट हो रहा है तो यह सुनिश्चित करता है कि DB इंजन ट्रांजेक्शन लॉग को पढ़ सकता है और ट्रांजैक्शन को रोलबैक कर सकता है।" यह केवल तभी सच है जब लेनदेन प्रतिबद्ध नहीं है। यदि यह पहले से ही प्रतिबद्ध है तो कुछ भी वापस नहीं लाया जा सकता है। लेन-देन लॉग की जानकारी का उपयोग डेटा फ़ाइलों को अपडेट करने के लिए किया जाता है। भले ही क्रैश से पहले डेटा फ़ाइल में बफर नहीं लिखा गया था।
चमत्कार 173

@ मिराकल: मुझे लगता है कि यदि पृष्ठ को अपडेट किया जा रहा है जो कि विशेष रूप से लेन-देन से संबंधित है तो लेन-देन प्रतिबद्ध नहीं होगा।
Shanky

4

नीचे आप के लिए चीजों को स्पष्ट करेंगे:

जब कोई लेन-देन शुरू होता है (COMMIT), तो लेन-देन RAM में लेनदेन लॉग के लिए लिखा जाता है।

  • COMMIT (या BEGIN) का रिकवरी मॉडल से कोई लेना-देना नहीं है। यह लेनदेन के स्तर पर है। लेन-देन को पूरी तरह से पूर्ण या विफल होना चाहिए ( ACID गुण याद रखें )। इसलिए अनिवार्य रूप से, एक COMMIT एक सफल लेनदेन के अंत (या तो निहित या स्पष्ट) को चिह्नित करेगा। एक COMMIT स्टेटमेंट यह गारंटी देगा कि लेनदेन के सभी संशोधनों को डेटाबेस का एक स्थायी हिस्सा बनाया गया है।
  • किसी भी परिवर्तन करने के लिए, SQL सर्वर वाल (राइट-फॉरवर्ड लॉगिंग) का उपयोग करेगा जिसमें डेटा को संशोधित करने से पहले यह लॉग में किसी भी बदलाव का वर्णन करेगा।

जब एक CHECKPOINT होता है (कुछ समय और / या कुछ लेनदेन और अन्य मानदंडों के बाद), पिछले CHECKPOINT और वर्तमान के बीच लेनदेन डिस्क पर लिखे जाते हैं।

जब एक बेक लॉग होता है, तो एमडीएफ फ़ाइल को डेटा लिखा जाता है।

को देखें :

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