इस श्रृंखला के पहले भाग में, मैंने लॉगिंग के आसपास बुनियादी शब्दावली पेश की थी, इसलिए मैं आपको इस पोस्ट को जारी रखने से पहले पढ़ने की सलाह देता हूं। श्रृंखला में मैं जो कुछ भी शामिल करूंगा, उसके लिए लेन-देन लॉग के कुछ आर्किटेक्चर को जानना आवश्यक है, इसलिए इस बार मैं इसी पर चर्चा करने जा रहा हूं। यहां तक कि अगर आप श्रृंखला का पालन नहीं करने जा रहे हैं, तो कुछ अवधारणाएं जो मैं नीचे समझाने जा रहा हूं, वे रोजमर्रा के कार्यों के लिए जानने योग्य हैं जो डीबीए उत्पादन में संभालते हैं।
संरचनात्मक पदानुक्रम
लेन-देन लॉग आंतरिक रूप से तीन-स्तरीय पदानुक्रम का उपयोग करके व्यवस्थित किया जाता है जैसा कि नीचे चित्र 1 में दिखाया गया है।
चित्र 1:लेन-देन लॉग का तीन-स्तरीय संरचनात्मक पदानुक्रमउन्हें>
लेन-देन लॉग में वर्चुअल लॉग फ़ाइलें होती हैं, जिसमें लॉग ब्लॉक होते हैं, जो वास्तविक लॉग रिकॉर्ड संग्रहीत करते हैं।
वर्चुअल लॉग फ़ाइलें
लेन-देन लॉग को वर्चुअल लॉग फ़ाइलें . नामक अनुभागों में विभाजित किया गया है , जिसे सामान्यतः केवल VLFs . कहा जाता है . यह SQL सर्वर में लॉग मैनेजर के लिए लेन-देन लॉग में प्रबंधन संचालन को आसान बनाने के लिए किया जाता है। जब डेटाबेस पहली बार बनाया जाता है या लॉग फ़ाइल स्वचालित रूप से बढ़ती है, तो आप यह निर्दिष्ट नहीं कर सकते कि SQL सर्वर द्वारा कितने VLF बनाए जाते हैं, लेकिन आप इसे प्रभावित कर सकते हैं। कितने वीएलएफ बनाए जाते हैं इसके लिए एल्गोरिथम इस प्रकार है:
- लॉग फ़ाइल का आकार 64एमबी से कम:4 वीएलएफ बनाएं, प्रत्येक का आकार लगभग 16 एमबी है
- फ़ाइल का आकार 64MB से 1GB तक लॉग करें :8 VLF बनाएं, प्रत्येक कुल आकार का लगभग 1/8 है
- लॉग फ़ाइल का आकार 1GB से बड़ा:16 VLF बनाएं, प्रत्येक कुल आकार का लगभग 1/16 है
SQL सर्वर 2014 से पहले, जब लॉग फ़ाइल स्वतः बढ़ती है, तो लॉग फ़ाइल के अंत में जोड़े गए नए VLF की संख्या ऑटो-ग्रो आकार के आधार पर उपरोक्त एल्गोरिथम द्वारा निर्धारित की जाती है। हालांकि, इस एल्गोरिथम का उपयोग करते हुए, यदि ऑटो-ग्रो आकार छोटा है, और लॉग फ़ाइल कई ऑटो-ग्रोथ से गुजरती है, तो इससे बहुत बड़ी संख्या में छोटे वीएलएफ हो सकते हैं (जिन्हें वीएलएफ फ़्रेग्मेंटेशन कहा जाता है। ) जो कुछ कार्यों के लिए एक बड़ा प्रदर्शन मुद्दा हो सकता है (यहां देखें)।
इस समस्या के कारण, SQL सर्वर 2014 में लॉग फ़ाइल के ऑटो-ग्रोथ के लिए एल्गोरिथम बदल गया। यदि ऑटो-ग्रो आकार कुल लॉग फ़ाइल आकार के 1/8 से कम है, तो केवल एक नया वीएलएफ बनाया जाता है, अन्यथा पुराने एल्गोरिथम का उपयोग किया जाता है। यह एक लॉग फ़ाइल के लिए वीएलएफ की संख्या को काफी कम कर देता है जिसमें बड़ी मात्रा में ऑटो-विकास हुआ है। मैंने इस ब्लॉग पोस्ट में अंतर का एक उदाहरण समझाया।
प्रत्येक वीएलएफ की एक अनुक्रम संख्या होती है जो विशिष्ट रूप से इसकी पहचान करता है और विभिन्न स्थानों में उपयोग किया जाता है, जिसके बारे में मैं नीचे और भविष्य की पोस्टों में बताऊंगा। आपको लगता है कि एक नए डेटाबेस के लिए अनुक्रम संख्या 1 से शुरू होगी, लेकिन ऐसा नहीं है।
SQL सर्वर 2019 इंस्टेंस पर, मैंने बिना किसी फ़ाइल आकार को निर्दिष्ट किए एक नया डेटाबेस बनाया, और फिर नीचे दिए गए कोड का उपयोग करके वीएलएफ की जाँच की:
CREATE DATABASE NewDB; GO SELECT [file_id], [vlf_begin_offset], [vlf_size_mb], [vlf_sequence_number] FROM sys.dm_db_log_info (DB_ID (N'NewDB'));
sys.dm_db_log_info
पर ध्यान दें SQL सर्वर 2016 SP2 में DMV जोड़ा गया था। इससे पहले (और आज भी, क्योंकि यह अभी भी मौजूद है) आप अनिर्दिष्ट DBCC LOGINFO
का उपयोग कर सकते हैं आदेश, लेकिन आप इसे एक चुनिंदा सूची नहीं दे सकते—बस DBCC LOGINFO(N'NewDB');
करें और वीएलएफ अनुक्रम संख्या FSeqNo
. में हैं परिणाम सेट का कॉलम।
वैसे भी, sys.dm_db_log_info
. को क्वेरी करने के परिणाम थे:
file_id vlf_begin_offset vlf_size_mb vlf_sequence_number ------- ---------------- ----------- ------------------- 2 8192 1.93 37 2 2039808 1.93 0 2 4071424 1.93 0 2 6103040 2.17 0
नोट करें कि पहला वीएलएफ लॉग फाइल में ऑफसेट 8,192 बाइट्स से शुरू होता है। ऐसा इसलिए है क्योंकि लेन-देन लॉग सहित सभी डेटाबेस फ़ाइलों में एक फ़ाइल शीर्षलेख पृष्ठ होता है जो पहले 8KB लेता है और फ़ाइल के बारे में विभिन्न मेटाडेटा संग्रहीत करता है।
तो SQL सर्वर पहले वीएलएफ अनुक्रम संख्या के लिए 37 और 1 क्यों नहीं चुनता है? यह model
. में उच्चतम वीएलएफ अनुक्रम संख्या पाता है डेटाबेस और फिर, किसी भी नए डेटाबेस के लिए, लेन-देन लॉग का पहला वीएलएफ अपने अनुक्रम संख्या के लिए उस नंबर प्लस 1 का उपयोग करता है। मुझे नहीं पता कि इस एल्गोरिदम को समय की धुंध में क्यों चुना गया था, लेकिन कम से कम SQL सर्वर 7.0 के बाद से ऐसा ही रहा है।
इसे साबित करने के लिए, मैंने यह कोड चलाया:
SELECT MAX ([vlf_sequence_number]) AS [Max_VLF_SeqNo] FROM sys.dm_db_log_info (DB_ID (N'model'));
और परिणाम थे:
Max_VLF_SeqNo -------------------- 36
तो आपके पास है।
वीएलएफ और उनका उपयोग कैसे किया जाता है, इस बारे में चर्चा करने के लिए और भी बहुत कुछ है, लेकिन अभी के लिए यह जानना पर्याप्त है कि प्रत्येक वीएलएफ में अनुक्रम संख्या होती है, जो प्रत्येक वीएलएफ के लिए एक से बढ़ जाती है।
लॉग ब्लॉक करें
प्रत्येक वीएलएफ में एक छोटा मेटाडेटा हेडर होता है, और शेष स्थान लॉग ब्लॉक से भरा होता है। प्रत्येक लॉग ब्लॉक 512 बाइट्स से शुरू होता है और 512-बाइट की वृद्धि में 60KB के अधिकतम आकार तक बढ़ेगा, जिस बिंदु पर इसे डिस्क पर लिखा जाना चाहिए। एक लॉग ब्लॉक डिस्क पर उसके अधिकतम आकार तक पहुंचने से पहले लिखा जा सकता है यदि निम्न में से कोई एक होता है:
- एक लेन-देन होता है, और इस लेन-देन के लिए विलंबित स्थायित्व का उपयोग नहीं किया जा रहा है, इसलिए लेन-देन को टिकाऊ बनाने के लिए लॉग ब्लॉक को डिस्क पर लिखा जाना चाहिए
- विलंबित स्थायित्व उपयोग में है, और पृष्ठभूमि "वर्तमान लॉग ब्लॉक को डिस्क पर फ्लश करें" 1ms टाइमर कार्य सक्रिय हो जाता है
- एक डेटा फ़ाइल पृष्ठ एक चेकपॉइंट या आलसी लेखक द्वारा डिस्क पर लिखा जा रहा है, और वर्तमान लॉग ब्लॉक में एक या अधिक लॉग रिकॉर्ड हैं जो उस पृष्ठ को प्रभावित करते हैं जो लिखा जाने वाला है (याद रखें कि आगे लिखने के लिए लॉगिंग होना चाहिए गारंटीकृत)
आप लॉग ब्लॉक को एक चर-आकार के पृष्ठ की तरह मान सकते हैं जो लॉग रिकॉर्ड को उस क्रम में संग्रहीत करता है जो वे डेटाबेस को बदलने वाले लेनदेन द्वारा बनाए जाते हैं। प्रत्येक लेनदेन के लिए कोई लॉग ब्लॉक नहीं है; एक लॉग ब्लॉक में कई समवर्ती लेनदेन के लिए लॉग रिकॉर्ड को आपस में जोड़ा जा सकता है। आप सोच सकते हैं कि यह उन कार्यों के लिए कठिनाइयाँ पेश करेगा जिन्हें एक ही लेन-देन के लिए सभी लॉग रिकॉर्ड खोजने की आवश्यकता होती है, लेकिन ऐसा नहीं है, जैसा कि मैं बाद में पोस्ट में बताता हूँ कि लेन-देन रोलबैक कैसे काम करता है।
इसके अलावा, जब एक लॉग ब्लॉक डिस्क पर लिखा जाता है, तो यह पूरी तरह से संभव है कि इसमें अप्रतिबंधित लेनदेन से लॉग रिकॉर्ड हों। क्रैश रिकवरी के काम करने के तरीके के कारण भी यह कोई समस्या नहीं है—जो कि श्रृंखला के भविष्य में कुछ अच्छी पोस्ट हैं।
लॉग अनुक्रम संख्याएं
वीएलएफ में लॉग ब्लॉक में एक आईडी होती है, जो 1 से शुरू होती है और वीएलएफ में प्रत्येक नए लॉग ब्लॉक के लिए 1 से बढ़ती है। लॉग रिकॉर्ड में लॉग ब्लॉक में एक आईडी भी होती है, जो 1 से शुरू होती है और लॉग ब्लॉक में प्रत्येक नए लॉग रिकॉर्ड के लिए 1 से बढ़ती है। इसलिए, लेन-देन लॉग के संरचनात्मक पदानुक्रम में सभी तीन तत्वों में एक आईडी होती है, और उन्हें एक त्रिपक्षीय पहचानकर्ता में एक साथ खींचा जाता है जिसे लॉग अनुक्रम संख्या कहा जाता है। , जिसे आमतौर पर केवल LSN . के रूप में संदर्भित किया जाता है ।
एक एलएसएन को <VLF sequence number>:<log block ID>:<log record ID>
(4 बाइट्स:4 बाइट्स:2 बाइट्स) और विशिष्ट रूप से एकल लॉग रिकॉर्ड की पहचान करता है। यह एक लगातार बढ़ता हुआ पहचानकर्ता है, क्योंकि वीएलएफ अनुक्रम संख्या हमेशा के लिए बढ़ जाती है।
ग्राउंडवर्क हो गया!
जबकि वीएलएफ के बारे में जानना महत्वपूर्ण है, मेरी राय में एलएसएन लॉगिंग के एसक्यूएल सर्वर के कार्यान्वयन के बारे में समझने के लिए सबसे महत्वपूर्ण अवधारणा है क्योंकि एलएसएन आधारशिला है जिस पर लेनदेन रोलबैक और क्रैश रिकवरी का निर्माण किया जाता है, और एलएसएन बार-बार क्रॉप होगा। मैं श्रृंखला के माध्यम से आगे बढ़ता हूं। अगली पोस्ट में, मैं लॉग ट्रंकेशन और ट्रांजेक्शन लॉग की सर्कुलर प्रकृति को कवर करूंगा, जो कि वीएलएफ से संबंधित है और उनका पुन:उपयोग कैसे किया जाता है।