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

SQL सर्वर लेनदेन लॉग — भाग 1

प्रत्येक SQL सर्वर डेटाबेस में डेटा फ़ाइलों के अलावा एक या अधिक लेनदेन लॉग फ़ाइलें होती हैं। लॉग फाइलें सभी लेनदेन और उनमें से प्रत्येक द्वारा किए गए डेटाबेस संशोधनों को रिकॉर्ड करती हैं।

यह आलेख लेन-देन लॉग पर केंद्रित है और डेटाबेस क्रैश पुनर्प्राप्ति के लिए डेटा का उपयोग करने के लिए SQL सर्वर डेटा संशोधनों को कैसे लॉग करता है।

SQL सर्वर ट्रांजेक्शन लॉग फ़ाइल का परिचय

जैसा कि हमें याद है, प्रत्येक लेनदेन "सभी या कुछ भी नहीं" है। यदि लेन-देन का एक भाग विफल हो जाता है, तो संपूर्ण लेन-देन विफल हो जाता है, और डेटाबेस स्थिति अपरिवर्तित रहती है।

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

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

सामान्य संचालन के दौरान, SQL सर्वर लेनदेन लॉग का भी उपयोग करता है। फ़ाइल में निहित जानकारी यह पहचानने के लिए आवश्यक है कि किसी त्रुटि या उपयोगकर्ता द्वारा निर्दिष्ट रोलबैक स्टेटमेंट के कारण लेन-देन वापस आने पर SQL सर्वर को क्या करने की आवश्यकता है।

SQL सर्वर लेन-देन लॉग का उपयोग कैसे करता है

लेन-देन लॉग एक भौतिक फ़ाइल है जिसका विस्तार LDF . है . SQL सर्वर प्राथमिक डेटा फ़ाइल (.MDF .) के साथ किसी भी नए डेटाबेस के लिए इसे स्वचालित रूप से बनाता है ) जो डेटाबेस ऑब्जेक्ट्स और डेटा को ही स्टोर करता है।

जब भी T-SQL कोड किसी डेटाबेस ऑब्जेक्ट या उसमें मौजूद डेटा को बदलता है, तो परिवर्तन का विवरण लेन-देन लॉग फ़ाइल में लॉग रिकॉर्ड के रूप में दर्ज किया जाता है।

लॉग रिकॉर्ड में डेटाबेस में किए गए विशिष्ट परिवर्तन की जानकारी होती है (उदाहरण के लिए, एक पंक्ति सम्मिलित करें)। इसलिए, हमारे पास एकल लेन-देन के प्रभावों का पूरी तरह से वर्णन करने के लिए लॉग रिकॉर्ड की एक श्रृंखला होगी।

लेन-देन लॉग आर्किटेक्चर

लॉग अनुक्रम संख्याएं

एक लॉग रिकॉर्ड में एक अद्वितीय, स्वतः वृद्धिशील लॉग अनुक्रम संख्या होती है (LSN ), जो हमें इस रिकॉर्ड को लेनदेन लॉग में खोजने की अनुमति देता है। LSN डेटा परिवर्तन का वर्णन करता है और इसमें निम्नलिखित जानकारी होती है:

  • संचालन और प्रभावित पंक्ति
  • डेटा के पुराने और नए संस्करण
  • वह लेन-देन जिसने संशोधन किया

एलएसएन में तीन नंबर होते हैं:

LSN =:<लॉग ब्लॉक # [4bytes]>:<लॉग रिकॉर्ड #[2 butes]>

प्रत्येक डेटा फ़ाइल पृष्ठ के पृष्ठ शीर्षलेख में एक LSN होता है जो सबसे हाल के लॉग रिकॉर्ड की पहचान करता है जिसका परिवर्तन पृष्ठ पर दिखाई देता है। क्रैश रिकवरी के लिए यह महत्वपूर्ण है।

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

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

लेन-देन लॉग का डिफ़ॉल्ट आकार नया डेटाबेस 0.5MB . से बड़ा है या 25% एक ही CREATE DATABASE स्टेटमेंट में बनाई गई सभी डेटा फ़ाइलों के कुल आकार का।

आपको बहुत सावधान रहना होगा क्योंकि लेन-देन लॉग के नए हिस्से हमेशा शून्य-प्रारंभिक होते हैं . यदि आपके पास लॉग फ़ाइल आकार निर्दिष्ट किए बिना डेटाबेस बनाएँ कथन है, और उदाहरण के लिए, आप 1TB का डेटाबेस बनाते हैं, तो SQL सर्वर 250GB लेनदेन लॉग बनाएगा।

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

जब हम डेटाबेस बनाते हैं तो हम देख सकते हैं कि क्या हो रहा है - ट्रेस फ्लैग 3004 का उपयोग करके हमारे लॉग का शून्य-आरंभीकरण होता है जो जीरो-इनिशियलाइज़ेशन और ट्रेस फ़्लैग 3605 . के बारे में संदेश प्रिंट करता है जो उन लॉग संदेशों को ट्रेस फ्लैग 3004 द्वारा प्रिंट करने की अनुमति देता है।

निम्न डेमो दिखाता है कि आप कैसे लॉग फ़ाइल को शून्य होते हुए देख सकते हैं।

1. यह सुनिश्चित करने के लिए निम्न स्क्रिप्ट निष्पादित करें कि हमारे पास DBTest2014 नामक डेटाबेस नहीं है

USE master;
GO
 
IF DATABASEPROPERTY(N'DBTest2014', N'Version')>0
  BEGIN
    ALTER DATABASE DBTest2014 SET SINGLE_USER
      WITH ROLLBACK IMMEDIATE;
    DROP DATABASE DBTest2014;
  END
GO

2. शून्य-आरंभीकरण देखने के लिए ट्रेस फ़्लैग सक्षम करें

DBCC TRACEON (3605, 3004, -1);
GO
3. Flush the error log
EXEC sp_cycle_errorlog;
GO

3. एक डेटाबेस बनाएं

CREATE DATABASE DBTest2014 ON PRIMARY (
  NAME = N'DBTest2014',
  FILENAME = N'D:\DBTest2014_data.mdf')
LOG ON (
  NAME= N'DBTest2014_log',
  FILENAME= N'D:\DBTest2014_log.ldf',
  SIZE = 10MB,
  FILEGROWTH = 10 MB);
GO

4. त्रुटि लॉग फ़ाइल पढ़ें

EXEC sys.xp_readerrorlog;
GO

वर्चुअल लॉग फ़ाइलें

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

जब भी कोई लेनदेन लॉग बनाया जाता है, तो यह एक निश्चित संख्या में वीएलएफ देता है। नव निर्मित वीएलएफ निष्क्रिय और अप्रयुक्त हैं। एक सक्रिय वीएलएफ का पुन:उपयोग तब तक नहीं किया जा सकता जब तक कि इसे लॉग क्लियरिंग द्वारा निष्क्रिय नहीं कर दिया जाता।

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

प्रत्येक लॉग फ़ाइल में एक फ़ाइल शीर्षलेख पृष्ठ भी होता है जिसमें 8KB लगता है लेन-देन लॉग फ़ाइल की शुरुआत में। फ़ाइल हेडर पेज फ़ाइल के बारे में मेटाडेटा जैसे आकार और ऑटो-ग्रोथ सेटिंग्स को स्टोर करता है।

लेन-देन लॉग के नए हिस्से में वीएलएफ की संख्या और आकार SQL सर्वर द्वारा निर्धारित किया जाता है। इसे कॉन्फ़िगर करना असंभव है.

यदि नया जोड़ा गया आकार है:

  • <1MB चर्चा के लिए अप्रासंगिक है
  • <64MB में 4 नए वीएलएफ होंगे (प्रत्येक 1/4 ग्रोथ साइज के)
  • 64एमबी से 1जीबी तक 8 नए वीएलएफ होंगे (प्रत्येक 1/8 ग्रोथ साइज)
  • > 1GB में 16 नए VLF होंगे (प्रत्येक 1/16 ग्रोथ साइज के)

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

वीएलएफ अनुक्रम संख्या

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

लेन-देन लॉग सक्रिय भाग की शुरुआत सबसे कम अनुक्रम संख्या वाले वीएलएफ से शुरू होती है और अभी भी सक्रिय है। निष्क्रिय वीएलएफ में अनुक्रम संख्या होती है, लेकिन वे लॉग सक्रिय भाग का हिस्सा नहीं होते हैं।

लॉग के सक्रिय हिस्से में लॉग रिकॉर्ड होते हैं जो किसी कारण से SQL सर्वर द्वारा आवश्यक होते हैं।

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

VLF और लॉग ब्लॉक

वीएलएफ के भीतर, भिन्न-भिन्न आकार के लॉग ब्लॉक होते हैं। लॉग ब्लॉक का न्यूनतम आकार 512 . है बाइट्स और लॉग ब्लॉक अधिकतम आकार 60 KB . तक बढ़ते हैं . आकार तब सेट किया जाता है जब निम्न में से कोई एक मामला होता है:

  • एक लेन-देन एक लेन-देन को समाप्त करने के लिए एक लॉग रिकॉर्ड बनाता है
  • लॉग ब्लॉक का आकार लेन-देन किए बिना या निरस्त किए बिना 60KB तक पहुंच जाता है

लॉग ब्लॉक के अंदर लॉग रिकॉर्ड होते हैं (आरेख पर रंगीन)। लॉग रिकॉर्ड भी भिन्न आकार के होते हैं। आरेख से पता चलता है कि एक ही लॉग ब्लॉक में कई समवर्ती लेनदेन से लॉग रिकॉर्ड मौजूद हो सकते हैं। लॉग रिकॉर्ड एक डेटा-पेज फ़ाइल के समान लिखे गए क्रम में संग्रहीत किए जाते हैं।

प्रत्येक वीएलएफ में निम्नलिखित जानकारी वाला वीएलएफ हेडर होता है:

  • वीएलएफ सक्रिय है या नहीं।
  • लॉग अनुक्रम संख्या जब वीएलएफ बनाया गया था।
  • वीएलएफ में सभी 512-बाइट ब्लॉक के लिए वर्तमान समता बिट्स।

पहली बार वीएलएफ के उपयोग के लिए समता बिट्स 64 से शुरू होते हैं। अगर वीएलएफ निष्क्रिय हो जाता है, लेकिन फिर से सक्रिय हो जाता है, तो समता बिट्स 128 हो जाएंगे। इनका उपयोग क्रैश रिकवरी के दौरान किया जाता है।

लेन-देन लॉग विवरण की जांच करना - DBCC LOGINFO

लेन-देन लॉग संरचना को देखने का एकमात्र तरीका अनिर्दिष्ट DBCC LOGINFO का उपयोग करना है आज्ञा। कमांड का सिंटैक्स है:

DBCC LOGINFO [({'dbname | dbid'})]

यदि आप dbname . निर्दिष्ट नहीं करते हैं और डीबिड , यह आपको वर्तमान डेटाबेस के लिए लॉग सामग्री को डंप कर देगा।

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

  • RecoveryUnitId — SQL Server 2012 में जोड़ा गया लेकिन वर्तमान में अप्रयुक्त
  • फ़ाइल आईडी — डेटाबेस के भीतर लेनदेन लॉग फ़ाइल आईडी।
  • फ़ाइल आकार — वीएलएफ आकार बाइट्स में।
  • स्टार्टऑफ़सेट — लेन-देन लॉग फ़ाइल में VLF की ऑफ़सेट शुरू करना, बाइट्स में
  • FSeqNo — वीएलएफ अनुक्रम संख्या
  • स्थिति - वीएलएफ सक्रिय है या नहीं (0 =निष्क्रिय, 2 =सक्रिय, 1 - उपयोग नहीं किया जाता है)
  • समानता — वर्तमान समता बिट्स (64 या 128, या 0 यदि वीएलएफ कभी सक्रिय नहीं रहा हो)
  • LSN बनाएं - एलएसएन जब वीएलएफ बनाया गया था (0 =वीएलएफ तब बनाया गया था जब लेनदेन लॉग फ़ाइल शुरू में बनाई गई थी)। लेन-देन लॉग फ़ाइल के प्रारंभिक निर्माण के बाद जोड़े गए अन्य सभी वीएलएफ में गैर-शून्य CreateLSN होगा।

हम DBTest2014 के लिए निम्न आदेश निष्पादित कर सकते हैं डेटाबेस, जिसे हमने पहले बनाया है:

DBCC LOGINFO (N'DBTest2014');
GO

परिणाम देखें:

DBCC SQLPERF (लॉगस्पेस)

उपयोग किए गए लॉग की मात्रा की जांच करने के लिए Transact-SQL में एकमात्र तरीका DBCC SQLPERF है। कमांड का सिंटैक्स है:

DBCC SQLPERF
(
     [ LOGSPACE ]
     |
          [ "sys.dm_os_latch_stats" , CLEAR ]
     |
     [ "sys.dm_os_wait_stats" , CLEAR ]
)
     [WITH NO_INFOMSGS ]

कमांड प्रति डेटाबेस एक पंक्ति के साथ परिणाम सेट लौटाता है:

  • डेटाबेस का नाम
  • लॉग साइज (एमबी)
  • प्रयुक्त लॉग स्पेस (%)
  • स्थिति:हमेशा शून्य पर सेट करें

मेरे परिवेश में, निम्न आदेश:

DBCC SQLPERF (LOGSPACE);
GO

निम्न परिणाम देता है:

अगले लेख में, हम लॉग रिकॉर्ड की जांच करने जा रहे हैं।


  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 का उपयोग करके लगातार दिनांक सीमाओं का पता लगाएं

  2. प्रत्येक ग्रुप बाय एक्सप्रेशन में कम से कम एक कॉलम होना चाहिए जो बाहरी संदर्भ नहीं है

  3. सी # में डेटाबेस में एकाधिक पैरामीटरयुक्त चर जोड़ना

  4. मैं MS SQL सर्वर प्रबंधन स्टूडियो का उपयोग किए बिना SQL सर्वर में अपना डिफ़ॉल्ट डेटाबेस कैसे बदल सकता हूँ?

  5. SQL सर्वर भूगोल डेटा प्रकार की समझ कैसे बनाएं