এসকিউএল সার্ভার লেনদেন লগ ব্যাকআপ: লেজ লগ শেষ পরিচিত লগ ব্যাকআপ অনুসরণ করে কিনা তা পরীক্ষা করুন test


11

আমরা সম্পূর্ণ পুনরুদ্ধার মোড সহ এসকিউএল সার্ভার ব্যবহার করছি। একটি পূর্ণ ব্যাকআপ এবং লগ ব্যাকআপগুলির একটি সিরিজ দেওয়া, আমরা লগ চেইনটি সর্বশেষ ব্যাকআপ থেকে বর্তমান লেজ লগ পর্যন্ত লগ চেইন সম্পূর্ণ কিনা তা পরীক্ষা করতে সক্ষম হতে চাই। (আসলে এই ব্যাকআপগুলি পুনরুদ্ধার না করেই এখানে উদ্দেশ্য ব্যাকআপগুলির ধারাবাহিকতা পরীক্ষা করা))

বিদ্যমান ব্যাকআপগুলির জন্য এটি কীভাবে করা যায় তা আমি ইতিমধ্যে জানি: খুব সহজেই পুনরুদ্ধার করে আমি প্রতিটি ফাইলের ফার্স্টএলএসএন এবং লাস্টএলএসএন পাই, যা ধারাবাহিক ফাইলের সাথে তুলনা করা যেতে পারে, সেগুলি নির্ধারণ করার জন্য।

তবে, লেজ লগটি সর্বশেষ লগ ব্যাকআপ অনুসরণ করে কিনা তা আমি জানি না।

আমার যদি লেজ লগের ফার্স্টএলএসএন থাকে তবে আমি এটিকে শেষ লগ ব্যাকআপের লাস্টএলএসএন এর সাথে তুলনা করতে পারি। তবে আমি কীভাবে লেজ লগের ফার্স্টএলএসএন পেতে পারি?

আমার কাছে এমন একটি সমাধান দরকার যা এসকিউএল সার্ভার 2005 থেকে উপরের দিকে (আদর্শভাবে টি-এসকিএল ব্যবহার করে) থেকে কাজ করে। এখনও অবধি, আমি গুগল অনুসন্ধান করেছি কোনও লাভ হয়নি। BTW। আমি প্রথম এটি স্ট্যাকওভারফ্লোতে পোস্ট করেছি; তবে এটি এখানে স্থানান্তরিত হয়েছে যেহেতু এটি বিষয়বস্তুতে পতাকাঙ্কিত করা হয়েছিল।

সম্পাদনা

দুটি সরবরাহিত সমাধানকে আমি একটি ছোট উদাহরণে চেষ্টা করেছি (এসকিউএল সার্ভার 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

সুতরাং এটি প্রথম আকারটি কয়েক মাত্রার আদেশ দ্বারা বন্ধ রয়েছে বলে মনে হয়।

আমি তখন এসকিউএল ২০০৮ এসপি 1 (10.00.2531) তে একই পরীক্ষা করেছি, যেখানে উভয় প্রশ্নেরই সঠিক উত্তর পেয়েছে।


আমি কিছু গবেষণা করছি কারণ এটি একটি আকর্ষণীয় প্রশ্ন, তবে আমি খুব বেশি দূরে পাচ্ছি না। আমি নিশ্চিত নই যে এসকিউএল এটি বক্সের বাইরে সমর্থন করে।
ক্যাথরিন ভিলিয়ার্ড

1
আমি নিশ্চিত যে এটি যাচাই করার একটি উপায় আছে, সম্ভবত এলএসএন ব্যবহার করা এটি করার উপায় নয়। আমি কয়েক ঘন্টা এই প্রশ্নের উপর একটি অনুগ্রহ করা হবে, এই প্রশ্নের আরও মতামত প্রয়োজন ..

উত্তর:


12

আমি আমার এসকিউএল সার্ভার ২০০৮ এর অভ্যন্তরীণ অনুলিপিটি চালু করেছিলাম এবং পরবর্তী লগ ব্যাকআপের প্রথম এলএসএন সন্ধান করার জন্য ডিএমভি sys.datedia_recovery_status চিহ্নিত করা হয়েছিল। কলামটি বিওএল দ্বারা যা last_log_backup_lsnআপনাকে সরবরাহ করে তা:

সর্বাধিক সাম্প্রতিক লগ ব্যাকআপের ক্রম সংখ্যা লগ করুন। এটি পূর্ববর্তী লগ ব্যাকআপের শেষ এলএসএন এবং পরবর্তী লগ ব্যাকআপের প্রারম্ভিক এলএসএন।
নুল = কোনও লগ ব্যাকআপ বিদ্যমান নেই। ডাটাবেস অফলাইনে আছে বা ডাটাবেস শুরু হবে না।

কেবল উল্লেখ করার সাথে সাথে ক্যালেন সেই বিষয়টিও তুলে ধরেছেন যে ডাটাবেস সিম্পল রিকভারি মোডে (স্বতঃআরক্ষেত্র মোড) থাকে বা লগ ব্যাকআপ না থাকলে আপনি একটি নুল মান পাবেন।

তবে আমি কীভাবে লেজ লগের ফার্স্টএলএসএন পেতে পারি?

কোনও ডাটাবেসের টেল লগ ব্যাক আপ না করে (এটি চেষ্টা করার জন্য পরীক্ষার উদাহরণ নেই) আপনি যুক্তিযুক্তভাবে সিদ্ধান্ত নিতে পারেন যে উল্লিখিত কলামে ফিরে আসা মানটি পরবর্তী লগ ব্যাকআপের প্রথম এলএসএন হবে আপনার ক্ষেত্রে লেজ।

সুতরাং নিম্নলিখিতগুলি সম্পাদন করলে যে মানটি আমি বিশ্বাস করি আপনি তা প্রত্যাখ্যান করবেন:


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

এই ডিএমভি এসকিউএল 2005-এ শুরু হয়।

সম্পাদনা করুন
আপনি বিওএল লিঙ্কটি না পড়লে, দয়া করে নোট করুন যে এই ডিএমভি কেবলমাত্র অনলাইনে থাকা ডেটাবেজে মানগুলি ফিরিয়ে দেবে বা বিওএল হিসাবে এটি উল্লেখ করা হিসাবে খোলা থাকবে। যদি কোনও ব্যর্থতা দেখা দেয় যা আপনাকে একটি ডাটাবেসের লেজ লগ ব্যাকআপ নেওয়ার প্রয়োজন হয় তবে ডাটাবেস অ্যাক্সেসযোগ্য না হলে আপনি উপরের কোডের মাধ্যমে এই মানটি যাচাই করতে পারবেন না; যা ব্যর্থতায় সম্ভবত এটি হবে না।


এই কোয়েরির ফলাফলটি সঠিক বলে মনে হচ্ছে।
অ্যান্ড্রিয়াস

অবশ্যই আমার কাছে সঠিক দেখাচ্ছে। সর্বশেষ_লগ_ব্যাকআপ_লসন লগের লেজের প্রথম_লস্নের সমান। সুতরাং, আপনার যদি শানের কোড থেকে সর্বশেষ_স্লোন সমতুল্য_ল_লগ_ব্যাকআপ_লস্নের সাথে পুনঃস্থাপনের জন্য একটি লগ ফাইল থাকে, তবে আপনি জানেন যে লেজ লগের ঠিক উপরে আপনার একটি ব্যাকআপ রয়েছে। (অবশ্যই এটির গ্যারান্টি কেবল ক্যোরির মুহুর্তে, পরের মুহূর্তে একটি নতুন লগ ব্যাকআপ শুরু করা যেতে পারে))
আরএলএফ

@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'স্নিপেটে কোনও নেই )?
আন্ড্রেয়াস

@ আন্ড্রেয়াস - হ্যাঁ এটি নিবন্ধিত। এবং হ্যাঁ এটি বর্তমান ডাটাবেসের লগ থেকে তথ্য ফিরিয়ে দেয়।
মার্টিন স্মিথ

মূল প্রশ্নে আমার সম্পাদনা দেখুন। আপনার স্নিপেটে ফিরে আসা সংখ্যা একই ডিবির সাম্প্রতিক ব্যাকআপের এলএসএনগুলির তুলনায় অনেক বড়।
Andreas

@ আন্ড্রেয়াস - অদ্ভুত আমি এটি কেবল একটি একক পরীক্ষার ডিবিতে চেষ্টা করেছি এবং এটি সঠিকভাবে কাজ করেছে। ত্রুটি কোথায় তা নিশ্চিত নয়। এসকিউএল সার্ভারের কোন সংস্করণ আপনি এটি চালাচ্ছেন? CONVERTশৈলী সঙ্গে প্যারামিটার 2সমস্যা হতে পারে।
মার্টিন স্মিথ

(যদিও শানের উত্তর যাইহোক যাইহোক এটির পক্ষে বৃহত্তর পছন্দসই বলে মনে হচ্ছে)
মার্টিন স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.