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

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

यह SQL सर्वर लेनदेन लॉग और इसकी विशिष्टताओं को समर्पित श्रृंखला का दूसरा लेख है। यहां हम लॉग रिकॉर्ड विवरण की जांच करने जा रहे हैं।

लॉग रिकॉर्ड

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

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

समवर्ती लेनदेन के लिए लॉग रिकॉर्ड लेन-देन लॉग में समय पर होने के अनुसार आपस में जुड़े हुए हैं। लॉग रिकॉर्ड बफ़र पूल में लॉग ब्लॉक में तब तक संग्रहीत किए जाते हैं जब तक कि वे डिस्क पर फ़्लश नहीं हो जाते।

उपयोगकर्ता या सिस्टम डेटाबेस में कोई गैर-लॉग संचालन नहीं है। हालाँकि, एक अपवाद है:tempdb में, संस्करण संग्रह और कार्य फ़ाइल संचालन गैर-लॉग हैं। लॉग रिकॉर्ड कभी भी लेन-देन लॉग में नहीं चलते हैं।

लॉग रिकॉर्ड के अंदर क्या है?

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

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

अंतरिक्ष आरक्षण लॉग करें

लेन-देन के आगे के हिस्से में उत्पन्न होने वाले प्रत्येक लॉग रिकॉर्ड को लेन-देन लॉग में खाली स्थान आरक्षित करना चाहिए ताकि लॉग रिकॉर्ड को वापस रोल करने की अनुमति मिल सके, लेन-देन लॉग बढ़ने के बिना।

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

लॉग रिकॉर्ड प्रकार

लॉग रिकॉर्ड कई प्रकार के होते हैं, जिनमें शामिल हैं:

  • LOP_FORMAT_PAGE लॉग फॉर्मेट पेज ऑपरेशन - वह जगह है जहां एक पेज को फॉर्मेट किया गया है, जिसका अर्थ है कि इसका हेडर बनाया गया है। लॉग रिकॉर्ड कम से कम पेज हेडर और संभावित रूप से पेज की कुछ और सामग्री को लॉग करने जा रहा है यदि पेज बनाया गया है और एक इंडेक्स बिल्ड या पुनर्निर्माण जैसे ऑपरेशन के हिस्से के रूप में भरा गया है)
  • LOP_MODIFY_ROW यह कार्रवाई मौजूदा डेटा के एक छोटे हिस्से को बदल रही है।
  • LOP_SET_BITS यह लॉग रिकॉर्ड आवंटन बिटमैप पर लागू होता है।
  • LOP_INSERT_ROWS और LOP_DELETE_ROWS
  • LOP_SET_FREE_SPACE पीएफएस पर लागू होता है - आवंटन बिटमैप जो पृष्ठों की आवंटन स्थिति का ट्रैक रखता है।

कोई भी लॉग रिकॉर्ड जो किसी तालिका अनुक्रमणिका में डेटा पृष्ठ या अनुक्रमणिका पृष्ठ में परिवर्तन करने जा रहे हैं, उनमें शामिल हैं :

    • आवंटन इकाई आईडी
    • पेज पर रिकॉर्ड की पेज आईडी और स्लॉट आईडी, जो अनिवार्य रूप से पेज पर डेटा या इंडेक्स रिकॉर्ड की शून्य-आधारित रिकॉर्ड आईडी है।
    • आफ्टर-इमेज, या पहले-इमेज और बदले हुए डेटा की आफ्टर-इमेज। एकल लॉग रिकॉर्ड में इनके कई सेट हो सकते हैं। आफ्टर-इमेज फिर से होने की अनुमति देता है। पूर्व-छवियां पूर्ववत होने की अनुमति देती हैं।

लॉक लॉगिंग

कुछ लॉग रिकॉर्ड्स में एक बिटमैप शामिल होता है जिसमें वर्णित परिवर्तन होने पर ताले रखे गए थे। बिटमैप में शामिल हैं:

      • तालों की संख्या की गणना करें।
      • लॉक का प्रकार और मोड - उदाहरण के लिए, X मोड में पेज लॉक।
      • लॉक किस पर है

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

लेन-देन में रिकॉर्ड लॉग करें

सभी लेन-देन कम से कम तीन लॉग रिकॉर्ड उत्पन्न करते हैं, हमेशा निम्नलिखित क्रम में:

        • LOP_BEGIN_XACT - इसमें SPID, लेन-देन का नाम और प्रारंभ समय जैसी जानकारी शामिल है। SQL सर्वर द्वारा शुरू किए गए सभी लेन-देन में ऑपरेशन का वर्णन करने के लिए नाम होते हैं (जैसे AllocFirstPage, DROPOBJ)
        • लेन-देन के अन्य रिकॉर्ड।
        • LOP_COMMIT_XACT - अगर लेन-देन होता है।
        • LOP_ABORT_XACT - अगर लेन-देन वापस आ जाता है।

इन दोनों में लेन-देन के लिए समाप्ति समय शामिल है।
लेनदेन में लॉग रिकॉर्ड एलएसएन द्वारा पीछे की ओर एक साथ जुड़े हुए हैं। इसका मतलब यह है कि लेन-देन के लिए उत्पन्न होने वाले अगले लॉग रिकॉर्ड में पिछले लॉग रिकॉर्ड का एलएसएन होता है जो इस विशेष लेनदेन के लिए तैयार किया गया था। यह लेन-देन को सही ढंग से वापस करने की अनुमति देता है। कुछ लॉग रिकॉर्ड गैर-लेन-देन वाले होते हैं, जिनमें शामिल हैं:

        • पीएफएस मुक्त स्थान परिवर्तन (अन्य लेनदेन के साथ सामंजस्य स्थापित करना असंभव)
        • भिन्न बिटमैप परिवर्तन (केवल एकतरफा परिवर्तन)

लॉग रिकॉर्ड की जांच करना

लॉग रिकॉर्ड की जांच करने के दो तरीके हैं। आप DBCC LOGINFO फ़ंक्शन का उपयोग कर सकते हैं, लेकिन fn_dblog तालिका-मूल्यवान फ़ंक्शन का उपयोग करने की अनुशंसा की जाती है। इसका बहुत ही सरल सिंटैक्स है:

SELECT * FROM fn_dblog (startLSN, endLSN);
GO

यह अत्यंत शक्तिशाली कार्य है क्योंकि यह:

        • एक सारणीबद्ध परिणाम सेट देता है जिसे आसानी से प्रबंधित किया जा सकता है।
        • जटिल विधेय का उपयोग करने की अनुमति देता है।
        • लॉग के सक्रिय हिस्से में सभी लेन-देन लॉग को स्कैन करता है, सबसे पुराने अप्रतिबंधित लेनदेन की शुरुआत से लेकर सबसे हाल के लॉग रिकॉर्ड तक। इसे ट्रेस फ़्लैग 2537 का उपयोग करके ओवरराइड किया जा सकता है

startLSN और endLSN फ़ील्ड को आमतौर पर NULL के रूप में पास किया जाता है
यहां डेमो दिया गया है:

USE DBTest2014
GO
 
SET NOCOUNT ON;
GO
 
--Set the SIMPLE recovery mode with no auto-stats
-- to avoid unwanted log records
ALTER DATABASE DBTest2014 SET RECOVERY SIMPLE;
ALTER DATABASE DBTest2014 SET AUTO_CREATE_STATISTICS OFF;
 
CREATE TABLE [TEST_TABLE] ([C1] INT, [C2] INT, [C3] INT);
 
INSERT INTO [TEST_TABLE] VALUES (1,1,1);
GO
 
--Clear out the log
CHECKPOINT;
GO
 
-- Implicit transaction
INSERT INTO [TEST_TABLE] VALUES (2,2,2);
GO
 
SELECT * FROM fn_dblog(null, null);
GO

यहाँ संक्षिप्त परिणाम सेट है। वास्तव में fn_dblog लॉग रिकॉर्ड लंबाई, फ्लैग बिट्स, लॉग रिजर्व, AllocUnitId, PageID, SlotID, पिछला पृष्ठ LSN और अन्य जैसे विभिन्न रिकॉर्ड देता है।

पंक्ति सामग्री को संशोधित करना

लॉग संशोधन दो तरह से लॉग किए जाते हैं:LOP_MODIFY_ROW . के रूप में या LOP_MODIFY_COLUMNS अभिलेख। कोई फर्क नहीं पड़ता कि किस विधि का उपयोग किया जाता है, यह उन बाइट्स को लॉग करेगा जो वास्तव में बदले जा रहे हैं। उदाहरण के लिए, INT मान को 1 से 24 में बदलना केवल एक बाइट परिवर्तन को लॉग करता है क्योंकि अन्य तीन शून्य-बाइट नहीं बदले। SQL सर्वर एक LOP_MODIFY_ROW . का उपयोग करेगा यदि पंक्ति का एक भाग अद्यतन किया जा रहा है तो लॉग रिकॉर्ड करें। एक भाग को निम्नानुसार परिभाषित किया गया है:पंक्ति में प्रत्येक चर-लंबाई वाला कॉलम एक "भाग" है और पंक्ति का संपूर्ण निश्चित-चौड़ाई क्षेत्र एक "भाग" है, भले ही कई कॉलम अपडेट किए जा रहे हों, लेकिन केवल तभी जब बाइट्स हों अद्यतन पंक्ति में 16 बाइट या उससे कम अलग हैं।

LOP_MODIFY_ROW इसमें शामिल हैं:

  • छवि से पहले
  • छवि के बाद
  • यदि लागू हो तो इंडेक्स कुंजी कॉलम
  • बिटमैप लॉक करें

LOP_MODIFY_COLUMNS इसमें शामिल हैं:

  • ऑफ़सेट सरणी से पहले और बाद में
  • लंबाई सरणी
  • यदि लागू हो तो इंडेक्स कुंजी कॉलम
  • बिटमैप लॉक करें
  • छवि जोड़े से पहले और बाद में

मुआवजा लॉग रिकॉर्ड

यह एक विशेष प्रकार का लॉग रिकॉर्ड है जो लेनदेन रोलबैक में सहायता के लिए उपयोग किया जाता है। जब कोई लेन-देन वापस आता है, तो लेन-देन में प्रत्येक लॉग रिकॉर्ड द्वारा वर्णित परिवर्तन को डेटाबेस में पूर्ववत किया जाना चाहिए। रोलबैक लेन-देन के लिए सबसे हाल के लॉग रिकॉर्ड से शुरू होता है और LOP_BEGIN_XACT लॉग रिकॉर्ड तक पिछले LSN लिंक का अनुसरण करता है। प्रत्येक लॉग रिकॉर्ड के लिए:

  • "एंटी-ऑपरेशन" निष्पादित करें जो लॉग रिकॉर्ड के प्रभावों को नकार देगा
  • एक लॉग रिकॉर्ड जेनरेट करें, इसे कंपेंसेशन लॉग रिकॉर्ड के रूप में चिह्नित करें, क्योंकि यह लेन-देन के आगे के हिस्से में लॉग रिकॉर्ड के लिए क्षतिपूर्ति कर रहा है।
  • मुआवजा लॉग रिकॉर्ड का पिछला एलएसएन उस लॉग रिकॉर्ड की ओर इशारा करता है, जिसके लिए वह क्षतिपूर्ति कर रहा है। यह अनिवार्य रूप से लॉग रिकॉर्ड को लेन-देन के लिए लॉग रिकॉर्ड की श्रृंखला का हिस्सा नहीं होने का कारण बनता है।
  • लॉग रिकॉर्ड के लिए आरक्षित लॉग स्थान जारी किया गया है

मुआवजा लॉग रिकॉर्ड को पूर्ववत नहीं किया जा सकता, केवल फिर से किया जा सकता है।

एक लेन-देन वापस लेना

लेन-देन के वापस आने पर क्या हो रहा है, इसका एक चित्रमय प्रतिनिधित्व यहां दिया गया है:

आइए निम्नलिखित कोड की जांच करें:

USE DBTest2014
GO
 
SET NOCOUNT ON;
GO
 
ALTER DATABASE DBTest2014 SET RECOVERY SIMPLE;
ALTER DATABASE DBTest2014 SET AUTO_CREATE_STATISTICS OFF;
 
CREATE TABLE [TEST_TABLE] ([C1] INT, [C2] INT, [C3] INT);
 
INSERT INTO [TEST_TABLE] VALUES (1,1,1);
INSERT INTO [TEST_TABLE] VALUES (2,2,2);
GO
--Clear out the log
CHECKPOINT;
GO
-- Explicit transaction to insert a new record
BEGIN TRAN;
INSERT INTO [TEST_TABLE] VALUES (3,3,3);
GO
 
SELECT * FROM fn_dblog(null, null);
GO
--Roll it back
ROLLBACK TRAN;
GO
 
SELECT * FROM fn_dblog(null, null);

यहां हम "मुआवजा" विवरण के साथ एक विशेष लॉग रिकॉर्ड देख सकते हैं

अगर हम पिछले LSN को देखें, तो हम देख सकते हैं कि LOP_INSERT_ROWS जो हमने किया, …0f40:0001 . से वापस लिंक करता है और यह BEGIN लेन-देन है क्योंकि लेन-देन का अगला भाग पिछले लॉग रिकॉर्ड से वापस लिंक करता है। LOP_DELETE_ROW क्षतिपूर्ति लॉग रिकॉर्ड उस रिकॉर्ड से वापस लिंक नहीं करता है जिसके लिए वह क्षतिपूर्ति कर रहा है - यह उससे लिंक करता है (BEGIN लेनदेन लॉग रिकॉर्ड से)।

तो DELEDE ने INSERT के लिए मुआवजा दिया है और इसे लॉग रिकॉर्ड की सूची से हटा दिया है। LOP_ABORT_XACT यह संकेत है कि लेन-देन रोलबैक के साथ समाप्त हो गया है। साथ ही, आप देख सकते हैं कि LOP_ABORT_XACT LOP_BEGIN_XACT से वापस लिंक करता है।
जब हम कंपंसेशन लॉग रिकॉर्ड करते हैं, तो लॉग स्पेस रिजर्वेशन नीचे चला जाता है [-74]। तो यह वास्तव में कुछ स्थान वापस दे रहा है जो लेनदेन के आगे के हिस्से के लिए आरक्षित था (LOP_INSERT_ROWS [178])। जैसा कि आप देख सकते हैं कि लॉग स्पेस रिजर्वेशन सिस्टम बहुत ही रूढ़िवादी है - INSERT DELETE की तुलना में अधिक स्थान सुरक्षित रखता है।

रोलबैक और डिफरेंशियल बैकअप

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

सारांश

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

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

यह भी पढ़ें:

SQL सर्वर लेनदेन लॉग में गोता लगाएँ - भाग 1
SQL सर्वर लेनदेन लॉग में गोता लगाएँ - भाग 2


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. जब कोई 'आदेश' निर्दिष्ट नहीं किया जाता है, तो आपके रिकॉर्ड सेट के लिए एक क्वेरी किस क्रम को चुनती है?

  2. SQL सर्वर (T-SQL) में TIME डेटा प्रकार को फ़ॉर्मेट करते समय इसे याद रखें

  3. SQL सर्वर में ALL का उपयोग करने के 3 तरीके

  4. SQL सर्वर 2008:मैं उपयोगकर्ता नाम को विशेषाधिकार कैसे प्रदान करूं?

  5. SQL सर्वर में 'डेटाटाइम' को 'दिनांक' में बदलें (T-SQL उदाहरण)