SQL सर्वर लेनदेन लॉग बैकअप: परीक्षण करें कि क्या पूंछ लॉग अंतिम ज्ञात लॉग बैकअप का अनुसरण करता है


11

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

मुझे पहले से ही पता है कि मौजूदा बैकअप के लिए यह कैसे करना है: RESTORE HEADERONLY का उपयोग करके मुझे हर फ़ाइल का FirstLSN और LastLSN मिलता है, जिसकी तुलना लगातार फ़ाइलों के लिए की जा सकती है, ताकि यह निर्धारित किया जा सके कि क्या वे संगत हैं।

हालाँकि, मुझे नहीं पता कि कैसे जाँचें कि क्या पूंछ लॉग अंतिम लॉग बैकअप के बाद है।

यदि मेरे पास टेल लॉग का FirstLSN था, तो मैं इसकी तुलना लास्ट लॉग बैकअप के LastLSN से कर सकता था। लेकिन मैं पूंछ लॉग के FirstLSN कैसे प्राप्त कर सकता हूं?

मुझे एक समाधान की आवश्यकता है जो SQL Server 2005 से ऊपर की ओर काम करता है (आदर्श रूप से t-sql का उपयोग करके)। अब तक, मैंने Google को बिना किसी लाभ के खोजा है। Btw। मैंने पहली बार स्टैकओवरफ़्लो पर इसे पोस्ट किया; लेकिन इसे यहां से माइग्रेट किया गया क्योंकि इसे वहां से ऑफ-टॉप किया गया था।

संपादित करें

मैंने एक छोटे से उदाहरण (SQL Server 2005, 9.0.5057) पर दो प्रदान किए गए समाधानों की कोशिश की:

BACKUP DATABASE TestDb TO DISK = 'C:\temp\backup test\Full.bak' 

-- fire some update queries

BACKUP LOG TestDb TO DISK =  'C:\temp\backup test\Log1.bak' 

-- fire both queries from the provided answers: 
-- Martin Smith's answer yields: 838886656088920652852608
-- Shawn Melton's answer yields: 46000000267600001

RESTORE HEADERONLY FROM DISK = 'C:\temp\backup test\Log1.bak'  
-- yields: 46000000267600001

तो यह प्रतीत होता है कि परिमाण के कई आदेशों से पहला बंद है।

फिर मैंने SQL 2008 SP1 (10.00.2531) पर एक ही परीक्षण किया, जहां दोनों प्रश्नों ने सही उत्तर दिया।


मैं कुछ शोध कर रहा हूं क्योंकि यह एक दिलचस्प सवाल है, लेकिन मैं बहुत दूर नहीं जा रहा हूं। मुझे यकीन नहीं है कि SQL इस बॉक्स से बाहर का समर्थन करता है।
कैथरीन विलिअर्ड

1
मुझे यकीन है कि यह सत्यापित करने का एक तरीका है, शायद एलएसएन का उपयोग करना ऐसा करने का तरीका नहीं है। मैं इस सवाल पर कुछ घंटों में एक बड़ा सवाल रखूंगा, इस सवाल पर और अधिक विचार की जरूरत है ..

जवाबों:


12

मैंने SQL Server 2008 इंटर्नल्स की अपनी कॉपी की ओर रुख किया और अगले लॉग बैकअप के पहले LSN को खोजने के लिए DMV sys.database_recovery_status को बताया गया। BOL द्वारा जाने वाला कॉलम last_log_backup_lsnआपको प्रदान करता है:

सबसे हाल के लॉग बैकअप का लॉग क्रम संख्या। यह पिछले लॉग बैकअप का अंतिम LSN और अगले लॉग बैकअप का प्रारंभिक LSN है।
NULL = कोई लॉग बैकअप मौजूद नहीं है। डेटाबेस ऑफ़लाइन है या डेटाबेस प्रारंभ नहीं होगा।

बस यह भी उल्लेख करना कि कालेन इस बिंदु को भी लाता है कि यदि डेटाबेस SIMPLE रिकवरी मोड (ऑटोट्रानकैट मोड) में है या कोई लॉग बैकअप मौजूद नहीं है, तो आपको NULL मान मिलेगा।

लेकिन मैं पूंछ लॉग के FirstLSN कैसे प्राप्त कर सकता हूं?

वास्तव में डेटाबेस के पूंछ लॉग का बैकअप लेने के बिना (इस पर प्रयास करने के लिए एक परीक्षण उदाहरण नहीं है) आप तार्किक रूप से निष्कर्ष निकाल सकते हैं कि उल्लेखित कॉलम में लौटाया गया मान आपके लॉग में अगले लॉग बैकअप का पहला LSN होगा। पूंछ।

इसलिए निम्नलिखित को क्रियान्वित करने से मुझे वह मूल्य वापस मिल जाएगा, जिस पर आपको विश्वास है:


SELECT 
   last_log_backup_lsn
FROM 
   sys.database_recovery_status
WHERE 
   databse_id = DB_ID('MyDb')

यह DMV SQL 2005 में शुरू होने वाली उपलब्ध है।

संपादित करें
जब तक आप BOL लिंक को नहीं पढ़ते हैं, कृपया ध्यान दें कि यह DMV केवल उन डेटाबेस पर मान लौटाएगा जो ऑनलाइन हैं, या BOL संदर्भ के रूप में खोला गया है। यदि कोई विफलता होती है जिसके लिए आपको डेटाबेस का टेल लॉग बैकअप लेने की आवश्यकता होती है, तो आप उपरोक्त कोड के माध्यम से इस मूल्य को सत्यापित नहीं कर पाएंगे, जब तक कि डेटाबेस सुलभ न हो; जिसमें एक विफलता यह शायद नहीं होगा।


इस क्वेरी का परिणाम सही प्रतीत होता है।
एंड्रियास

निश्चित रूप से मुझे सही लगता है। Last_log_backup_lsn लॉग की पूंछ के first_lsn के बराबर है। इसलिए, यदि आपके पास Shawn के कोड से last_log_backup_lsn के बराबर last_lsn के साथ एक लॉग फ़ाइल को पुनर्स्थापित किया जाना है, तो आप जानते हैं कि आपके पास टेल लॉग पर बैकअप बैकअप है। (बेशक, जो केवल क्वेरी के क्षण में ही सही है, अगले ही पल एक नया लॉग बैकअप शुरू किया जा सकता है।)
RLF

@RLF ने एक अतिरिक्त नोट जोड़ा क्योंकि यह भी सही होगा यदि डेटाबेस सुलभ नहीं है। अपनी आपदा वसूली योजना को लागू करने की आवश्यकता होने पर उपयोग करने के लिए यह वास्तव में एक व्यवहार्य समाधान नहीं है। विशुद्ध रूप से टेबलटॉप अभ्यास या अपनी योजना का परीक्षण करने के लिए।

6

निम्नलिखित कुछ ऐसा करना चाहिए।

WITH LSN_CTE
AS
(
SELECT TOP 1
       LEFT( LogRecords.[Current LSN], 8 )          AS Part1,
       SUBSTRING( LogRecords.[Current LSN], 10, 8 ) AS Part2,
       RIGHT( LogRecords.[Current LSN], 4 )         AS Part3
FROM   sys.fn_dblog(NULL,NULL) AS LogRecords
ORDER BY [Current LSN]
)
SELECT CAST( CAST( CONVERT( varbinary, Part1, 2 ) AS int ) AS varchar ) +
       RIGHT( '0000000000' + CAST( CAST( CONVERT( varbinary, Part2, 2 ) AS int ) AS varchar ), 10 ) +
       RIGHT( '00000'      + CAST( CAST( CONVERT( varbinary, Part3, 2 ) AS int ) AS varchar ), 5 ) AS [Converted LSN]
FROM   LSN_CTE

इस लेख से दशमलव में रूपांतरण कोड का उपयोग करना ।

ORDER BY [Current LSN]अच्छी तरह से पूरी तरह से अनावश्यक भूमि के ऊपर हो सकता है। मुझे यकीन नहीं है। इस फ़ंक्शन का परिणाम हमेशा एलएसएन क्रम में लगता है और मुझे लगता है कि यह लॉग को क्रमिक रूप से पढ़ता है लेकिन सिर्फ मामले में ...


@ मर्टिनस्मिथ: fn_dblogबहुत अच्छी तरह से प्रलेखित नहीं लगता है। मुझे लगता है कि इसके परिणाम हमेशा वर्तमान डेटाबेस के लिए होते हैं (क्योंकि WHERE DbName = 'XXX'स्निपेट में नहीं है)?
एंड्रियास

@ और - हाँ यह अनिर्दिष्ट है। और हाँ यह वर्तमान डेटाबेस के लॉग से सूचना लौटाता है।
मार्टिन स्मिथ

मूल प्रश्न के लिए मेरा संपादन देखें। आपके स्निपेट द्वारा दी गई संख्या उसी DB के हालिया बैकअप के LSN से बहुत बड़ी है।
एंड्रियास

@ संकेत - अजीब। मैंने केवल इसे एक ही परीक्षण DB पर आज़माया और यह सही ढंग से काम किया। सुनिश्चित नहीं है कि त्रुटि कहां है। SQL सर्वर के किस संस्करण पर आप इसे चला रहे हैं? CONVERTशैली के साथ पैरामीटर 2समस्या हो सकती है।
मार्टिन स्मिथ

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