अधिक विवरण में लेन-देन लॉग फ़ाइल की सामग्री


11

मेरे पास लेन-देन लॉग के बारे में एक सवाल है (चलो इसे संक्षेप में एलडीएफ कहते हैं) सामग्री। मैं पूर्ण पुनर्प्राप्ति मॉडल के साथ एक डेटाबेस मान रहा हूं।

मैंने पढ़ा है कि एलडीएफ फ़ाइल डेटाबेस में प्रत्येक ऑपरेशन में (लॉग) होती है (जो पूर्ण पुनर्प्राप्ति मोड में है)। यह लॉगिंग के दौरान कैसे अलग है BEGIN TRAN; COMMAND(s); COMMIT? मैं पूछ रहा हूं क्योंकि स्पष्ट रूप से आप लेन-देन को वापस कर सकते हैं, लेकिन आप मानक कमांड (पूर्ण पुनर्प्राप्ति मोड में) को रोल नहीं कर सकते।

मुझे लगता है कि लेन-देन के दौरान LDF फ़ाइल में लॉग की जा रही सामग्री नियमित पूर्ण पुनर्प्राप्ति लॉगिंग से भिन्न होती है। क्या वह सही है? यह अलग कैसे है? क्या यह केवल प्रत्येक कार्रवाई के लिए "पूर्ववत" संचालन का समावेश है?

एक संबंधित नोट पर, मैंने सुना है कि पूर्ण पुनर्प्राप्ति LDF फ़ाइल का उपयोग करके "रोलबैक / पूर्ववत" मानक प्रश्नों के वाणिज्यिक उपकरण हैं। वह यह कैसे करते हैं? क्या वे एलडीएफ सामग्री का विश्लेषण करते हैं और उलटा / पूर्ववत संचालन के साथ आने की कोशिश करते हैं?


संबंधित: स्टैक ओवरफ्लो पर SQL सर्वर 2008 में लेनदेन लॉग कैसे देखें
वडज़िम

जवाबों:


11

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

यह भी है कि आप इसे क्यों नहीं रोलबैक कर सकते हैं INSERT: यह पहले से ही प्रतिबद्ध है। तो नियम स्पष्ट लेनदेन के समान है: आप एक बार प्रतिबद्ध होने के बाद उन्हें रोलबैक नहीं कर सकते

आप देख सकते हैं कि मैं सीधे SQL सर्वर के अंदर से क्या मतलब है।

Microsoft शिप SQL सर्वर एक DMF के साथ कहा जाता है sys.fn_dblogजो किसी दिए गए डेटाबेस के लेन-देन लॉग के अंदर देखने के लिए उपयोग किया जा सकता है।

इस सरल प्रयोग के लिए मैं AdventureWorks डेटाबेस का उपयोग करने जा रहा हूं:

USE AdventureWorks2008;
GO

SELECT TOP 10 *
FROM dbo.Person;
GO

INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;

BEGIN TRAN;
INSERT INTO dbo.Person (FirstName, MiddleName, LastName, Gender, Date)
VALUES ('Never', 'Stop', 'Learning', 'M', GETDATE());
COMMIT;
GO

SELECT *
FROM sys.fn_dblog(NULL, NULL);
GO

यहां मैं दो आवेषण कर रहा हूं: एक के साथ और एक स्पष्ट लेनदेन के बिना।

लॉग फ़ाइल में आप देख सकते हैं कि दोनों के बीच बिल्कुल कोई अंतर नहीं है:

स्वतः पूर्णता बनाम स्पष्ट लेनदेन

लाल रंग एक INSERTऑटोकॉमिट लेनदेन के भीतर है और नीला एक INSERTस्पष्ट लेनदेन के साथ है।

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


7

मैं बताता हूं कि ApexSQL लॉग उदाहरण पर वाणिज्यिक उपकरण कैसे काम करते हैं

और संबंधित नोट पर मैंने सुना है कि पूर्ण पुनर्प्राप्ति LDF फ़ाइल का उपयोग करते हुए "रोलबैक / पूर्ववत" मानक प्रश्नों के वाणिज्यिक उपकरण हैं। वह यह कैसे करते हैं? क्या वे एलडीएफ सामग्री का विश्लेषण करते हैं और उलटा / पूर्ववत संचालन के साथ आने की कोशिश करते हैं?

हां, वे LDF फ़ाइल (ऑनलाइन या अलग) और trn फ़ाइलें (लेन-देन लॉग बैकअप) पढ़ते हैं, यह पाते हैं कि लेन-देन क्या हुआ है, और एक स्क्रिप्ट बनाएं जो समान, या विपरीत करेगा।

हालाँकि, ध्यान दें कि पूर्ववत और फिर से लिपि को निष्पादित करने के समान नहीं होना चाहिए, लेकिन प्रभाव बिल्कुल वैसा ही होगा।

उदाहरण के लिए, यदि निष्पादित स्क्रिप्ट थी:

DELETE FROM [Person].[AddressType] WHERE Name  = 'New Loc22'

लेन-देन लॉग रिकॉर्ड करेगा कि स्तंभ मान 9, 'नया स्थान 22', '41BC2FF6-F0FC-475F-8EB9-CEC1805AA0F6' और '2002/06/01 00: 00: 00.000' के साथ तालिका में पंक्ति हटा दी गई है। तालिका संरचना से, उपकरण पढ़ेगा कि प्राथमिक कुंजी एड्रेस टाइप कॉलम है, और निम्नलिखित रीडो स्क्रिप्ट बनाएगा:

DELETE FROM [Person].[AddressType] WHERE [AddressTypeID] = 9

ध्यान दें कि लेन-देन प्राथमिक कुंजी कॉलम से बंधा हुआ है, न कि उस मूल में उपयोग किए जाने वाले कॉलम पर जहां क्लॉज़ है। इसी तरह, पूर्ववत स्क्रिप्ट होगी:

INSERT INTO [Person].[AddressType] ([AddressTypeID], [Name], [rowguid], [ModifiedDate]) VALUES (9, N'New loc22' COLLATE SQL_Latin1_General_CP1_CI_AS, '41bc2ff6-f0fc-475f-8eb9-cec1805aa0f6', '20020601 00:00:00.000')

यहाँ छवि विवरण दर्ज करें

अस्वीकरण: मैं एक सहायक अभियंता के रूप में एपेक्सक्यूएल के लिए काम करता हूं

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