परिचय
ट्रांजेक्शन लॉग शिपिंग एक बहुत ही प्रसिद्ध तकनीक है जिसका उपयोग SQL सर्वर में डिजास्टर रिकवरी साइट में लाइव डेटाबेस की एक प्रति बनाए रखने के लिए किया जाता है। तकनीक तीन प्रमुख कार्यों पर निर्भर करती है:बैकअप जॉब, कॉपी जॉब और रिस्टोर जॉब। जबकि बैकअप कार्य प्राथमिक सर्वर पर चलता है, प्रतिलिपि और पुनर्स्थापना कार्य द्वितीयक सर्वर पर चलते हैं। अनिवार्य रूप से इस प्रक्रिया में एक शेयर के लिए आवधिक लेनदेन लॉग बैकअप शामिल होता है जिससे कॉपी जॉब सेकेंडरी सर्वर पर समान रूप से स्थानांतरित हो जाता है; बाद में, पुनर्स्थापना कार्य द्वितीयक सर्वर पर लॉग बैकअप लागू करता है। यह सब शुरू होने से पहले, द्वितीयक डेटाबेस को NORECOVERY विकल्प के साथ पुनर्स्थापित प्राथमिक सर्वर से पूर्ण बैकअप के साथ प्रारंभ किया जाना चाहिए।
Microsoft संग्रहीत कार्यविधि का एक सेट प्रदान करता है जिसका उपयोग लॉग शिपिंग को अंत से अंत तक कॉन्फ़िगर करने के साथ-साथ GUI समकक्षों को प्रत्येक डेटाबेस के गुण आइटम से शुरू करने के लिए किया जा सकता है जिसके लिए आप लॉग शिपिंग को कॉन्फ़िगर करना चाहते हैं। यह ध्यान देने योग्य है कि द्वितीयक डेटाबेस को NORECOVERY मोड या स्टैंडबाय मोड में कॉन्फ़िगर किया जा सकता है। NORECOVERY मोड में डेटाबेस कभी भी प्रश्नों के लिए उपलब्ध नहीं होता है, लेकिन स्टैंडबाय मोड में, जब कोई ट्रांजेक्शन लॉग रिस्टोर ऑपरेशन जारी नहीं होता है, तो सेकेंडरी डेटाबेस से पूछताछ की जा सकती है।
पर्यावरण की स्थापना
गेंद को लुढ़कने के लिए, हम AWS पर एक समान Amazon EC2 छवि के साथ दो SQL सर्वर इंस्टेंस बनाते हैं। यह अमेज़ॅन ईसी 2 इंस्टेंस विंडोज सर्वर 2016 पर SQL सर्वर 2017 आरटीएम-सीयू 5 चला रहा है। फिर हम वाइडवर्ल्ड इम्पोर्टर्स डेटाबेस की एक प्रति को गिटहब से प्राप्त बैकअप सेट का उपयोग करके पहली बार हमारे प्राथमिक इंस्टेंस में पुनर्स्थापित करते हैं। हम ब्रांचडीबी और कॉरपोरेटडीबी नामक दो समान डेटाबेस बनाने के लिए एक ही बैकअप सेट का उपयोग करते हैं।
अंजीर। 1 SQL सर्वर संस्करण
अंजीर। प्राथमिक उदाहरण पर 2 शाखाडीबी और कॉर्पोरेटडीबी (द्वितीयक उदाहरण रिक्त)
लिस्टिंग 1:वाइडवर्ल्ड इम्पोर्टर्स सैंपल डेटाबेस को पुनर्स्थापित करना
restore filelistonly from disk='WideWorldImporters-Full.bak' restore database CorporateDB from disk='WideWorldImporters-Full.bak' with stats=10,recovery, move 'WWI_Primary' to 'M:\MSSQL\Data\WWI_Primary.mdf' , move 'WWI_UserData' to 'M:\MSSQL\Data\WWI_UserData.ndf' , move 'WWI_Log' to 'N:\MSSQL\Log\WWI_Log.ldf', move 'WWI_InMemory_Data_1' to 'M:\MSSQL\Data\WWI_InMemory_Data_1.ndf' restore database BranchDB from disk='WideWorldImporters-Full.bak' with stats=10,recovery, move 'WWI_Primary' to 'M:\MSSQL\Data\WWI_Primary1.mdf' , move 'WWI_UserData' to 'M:\MSSQL\Data\WWI_UserData1.ndf' , move 'WWI_Log' to 'N:\MSSQL\Log\WWI_Log1.ldf', move 'WWI_InMemory_Data_1' to 'M:\MSSQL\Data\WWI_InMemory_Data_11.ndfपर ले जाएं।
अब हमारे पास दो उदाहरण हैं, प्राथमिक इंस्टेंस दो प्राथमिक डेटाबेस (ब्रांचडीबी और कॉरपोरेटडीबी और बिना उपयोगकर्ता डेटाबेस के द्वितीयक उदाहरण की मेजबानी करता है। हम दोनों डेटाबेस पर लेनदेन लॉग शिपिंग को कॉन्फ़िगर करने के साथ आगे बढ़ते हैं, लेकिन कॉन्फ़िगरेशन को पुनर्स्थापित करने में देरी लागू करके उन्हें अलग करते हैं। पहला डेटाबेस। याद रखें कि डेटाबेस वास्तव में उनके पास मौजूद डेटा के संदर्भ में समान हैं। निम्नलिखित ग्राफिक्स लॉग शिपिंग कॉन्फ़िगरेशन में चयनित प्रमुख विकल्प दिखाते हैं।
अंजीर। ब्रांचडीबी के लिए 3 बैकअप सेटिंग्स
अंजीर। 4 ब्रांचडीबी के लिए सेटिंग कॉपी करें
अंजीर। 5 BranchDB के लिए सेटिंग पुनर्स्थापित करें
प्रत्येक लॉग शिपिंग कार्य को हर पांच मिनट में चलाने के लिए कॉन्फ़िगर किया गया है। "डेले रिस्टोरिंग बैकअप" को प्रोसेस करने के लिए, हमें लॉग शिपिंग कॉन्फ़िगरेशन में स्टैंडबाय रिकवरी मोड का उपयोग करना चाहिए। यह तार्किक है क्योंकि इसमें सेकेंडरी डेटाबेस स्टैंडबाय मोड में है और यह इंगित करता है कि जब भी ट्रांजेक्शन लॉग रिस्टोर चालू नहीं होता है तो हम सेकेंडरी डेटाबेस को क्वेरी कर सकते हैं। इस विकल्प में हम जो मान निर्दिष्ट करते हैं (इस मामले में 30 मिनट) हमें एक अच्छी विंडो देता है जिसके दौरान हम इस आलेख की मूल आवश्यकता के अलावा सेकेंडरी डेटाबेस से रिपोर्ट चला सकते हैं जो उपयोगकर्ता त्रुटि से पुनर्प्राप्त करने में सक्षम है।
साथ ही, हमें यह उल्लेख करना चाहिए कि लेन-देन लॉग बैकअप की पुनर्स्थापना वास्तव में विलंबित हो रही है। इसका टाइमस्टैम्प विलंब मान से बाद में है। इसका मतलब है कि सभी लेन-देन लॉग बैकअप को सेकेंडरी सर्वर पर कॉपी किया जाएगा, जो शेड्यूल पर आधारित है और कॉपी जॉब में निर्दिष्ट है। वास्तव में, पुनर्स्थापना कार्य अभी भी समय पर चलेगा लेकिन लेन-देन लॉग बैकअप (जो 30 मिनट तक पुराना नहीं है) को पुनर्स्थापित नहीं किया जाएगा। संक्षेप में, ब्रांचडीबी स्टैंडबाय डेटाबेस, ब्रांचडीबी प्राथमिक डेटाबेस से 30 मिनट पीछे है। इस अंतराल को प्रदर्शित करने के लिए, अगले भाग में, हम दोनों डेटाबेस में एक टेबल बनाएंगे और एक जॉब बनाएंगे जिसमें हर मिनट एक रिकॉर्ड डाला जाएगा। हम द्वितीयक डेटाबेस में इस तालिका की जांच करेंगे।
कॉर्पोरेटडीबी डेटाबेस के लिए सेटिंग्स अंजीर की तरह ही हैं। 3 से 5, रिस्टोर जॉब को छोड़कर जो ट्रांजेक्शन लॉग बैकअप में देरी के लिए सेट नहीं है।
अंजीर। कॉर्पोरेट डीबी के लिए 6 सेटिंग्स पुनर्स्थापित करें
कॉन्फ़िगरेशन सत्यापित करना
एक बार कॉन्फ़िगरेशन हो जाने के बाद, हम यह सत्यापित कर सकते हैं कि कॉन्फ़िगरेशन ठीक है और इसके कार्य को देखने के साथ शुरू करें। लेन-देन लॉग शिपिंग रिपोर्ट हमें दिखाती है कि शाखा डीबी वास्तव में पुनर्स्थापना के मामले में कॉर्पोरेट डीबी से पीछे है:
अंजीर। 7a प्राथमिक सर्वर पर लेनदेन लॉग शिपिंग रिपोर्ट
अंजीर। सेकेंडरी सर्वर पर 7b ट्रांजेक्शन लॉग शिपिंग रिपोर्ट
इसके अलावा, आप नीचे दिए गए संदेश को ब्रांचडीबी के लिए रिस्टोर जॉब हिस्ट्री में देखेंगे:
अंजीर। 8 छोड़े गए लेन-देन लॉग द्वितीयक सर्वर पर पुनर्स्थापित होते हैं
हम हर मिनट पंक्तियों के साथ इस तालिका को भरने के लिए एक तालिका बनाकर और नौकरी का उपयोग करके इस सत्यापन के साथ आगे बढ़ सकते हैं। यह कार्य यह अनुकरण करने का एक आसान तरीका है कि कोई एप्लिकेशन उपयोगकर्ता तालिका में क्या कर सकता है। यह हमें दिखा सकता है कि यह अंतराल निश्चित रूप से उपयोगकर्ता डेटा में दिखाया गया है।
लिस्टिंग 2 - लॉग ट्रैकर टेबल बनाएं
use BranchDB go create table log_ship_tracker ( ID int identity (100,1) ,Database_Name sysname default db_name() ,RecordTime datetime default getdate() ,ServerName sysname default @@servername) use CorporateDB go create table log_ship_tracker ( ID int identity (100,1) ,Database_Name sysname default db_name() ,RecordTime datetime default getdate() ,ServerName sysname default @@servername)
लिस्टिंग 3 - लॉग ट्रैकर टेबल को पॉप्युलेट करने के लिए जॉब बनाएं
/* ==Scripting Parameters== Source Server Version : SQL Server 2017 (14.0.3023) Source Database Engine Edition : Microsoft SQL Server Standard Edition Source Database Engine Type : Standalone SQL Server Target Server Version : SQL Server 2017 Target Database Engine Edition : Microsoft SQL Server Standard Edition Target Database Engine Type : Standalone SQL Server */ USE [msdb] GO /****** Object: Job [InsertRecords] Script Date: 7/2/2018 3:32:00 PM ******/ BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 /****** Object: JobCategory [[Uncategorized (Local)]] Script Date: 7/2/2018 3:32:00 PM ******/ IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1) BEGIN EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'InsertRecords', @enabled=1, @notify_level_eventlog=0, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=N'No description available.', @category_name=N'[Uncategorized (Local)]', @owner_login_name=N'kairos\kigiri', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /****** Object: Step [InsertRecords] Script Date: 7/2/2018 3:32:00 PM ******/ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'InsertRecords', @step_id=1, @cmdexec_success_code=0, @on_success_action=1, @on_success_step_id=0, @on_fail_action=2, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'use BranchDB go insert into log_ship_tracker values (db_name(),getdate(),@@servername) use CorporateDB go insert into log_ship_tracker values (db_name(),getdate(),@@servername) GO', @database_name=N'master', @flags=0 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @[email protected], @name=N'Schedule', @enabled=1, @freq_type=4, @freq_interval=1, @freq_subday_type=4, @freq_subday_interval=1, @freq_relative_interval=0, @freq_recurrence_factor=0, @active_start_date=20180702, @active_end_date=99991231, @active_start_time=0, @active_end_time=235959, @schedule_uid=N'03e5f1b2-2e0b-4b30-8d60-3643c84aa08d' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback COMMIT TRANSACTION GOTO EndSave QuitWithRollback: IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION EndSave: GO
जब हम क्रमशः प्राथमिक डेटाबेस पर तालिका को क्वेरी करते हैं, तो हम पुष्टि कर सकते हैं (रिकॉर्डटाइम कॉलम का उपयोग करके) कि पंक्तियाँ ब्रांचडीबी और कॉर्पोरेटडीबी में मेल खाती हैं। जब हम सेकेंडरी डेटाबेस में टेबल की जांच करते हैं, उसी तरह, हम स्पष्ट रूप से देखते हैं कि हमारे पास ब्रांचडीबी और कॉरपोरेटडीबी के बीच 30 मिनट का अंतर है।
लिस्टिंग 4 - लॉग ट्रैकर टेबल को क्वेरी करना
select top 10 @@servername [Current_Server],* from BranchDB.dbo.log_ship_tracker order by RecordTime desc select top 10 @@servername [Current_Server], * from CorporateDB.dbo.log_ship_tracker order by RecordTime desc
अंजीर। 9 लॉग ट्रैकर टेबल प्राथमिक डेटाबेस में मेल खाते हैं
अंजीर। 10 लॉग ट्रैकर टेबल्स में सेकेंडरी डेटाबेस में ~30-मिनट का गैप होता है
उपयोगकर्ता त्रुटि से पुनर्प्राप्त करना
अब बात करते हैं इस देरी के प्रमुख फायदों के बारे में। परिदृश्य में, जहां कोई उपयोगकर्ता अनजाने में एक तालिका छोड़ देता है, हम माध्यमिक डेटाबेस से डेटा को जल्दी से पुनर्प्राप्त कर सकते हैं जब तक कि विलंब अवधि समाप्त नहीं हुई है। इस उदाहरण में, हम दोनों डेटाबेस पर तालिका Sales.Orderlines को छोड़ देते हैं और सत्यापित करते हैं कि तालिका अब दोनों डेटाबेस में मौजूद नहीं है।
लिस्टिंग 5 - ड्रॉपिंग ऑर्डरलाइन टेबल
drop table BranchDB.Sales.Orderlines drop table CorporateDB.Sales.Orderlines GO use BranchDB go select @@servername [Current_Server] , db_name() [Database_Name] , name , schema_name(schema_id) [schema] , type_desc , create_date , modify_date from sys.tables where name='Orderlines' GO use CorporateDB go select @@servername [Current_Server] , db_name() [Database_Name] , name , schema_name(schema_id) [schema] , type_desc , create_date , modify_date from sys.tables where name='Orderlines' GO
अंजीर। 11 ड्रॉपिंग टेबल सेल्स। ऑर्डरलाइन्स
जब हम सेकेंडरी सर्वर पर टेबल की तलाश करते हैं, तो हम पाते हैं कि टेबल अभी भी दोनों डेटाबेस में उपलब्ध है। इस प्रकार, कॉर्पोरेट डीबी के लिए डेटा को पुनर्प्राप्त करने के लिए हमारे पास पांच मिनट से भी कम समय है। (चित्र 12)। लेकिन एक बार जब अगली पुनर्स्थापना साइकिल निष्पादित हो जाती है, तो हम कॉर्पोरेट डीबी डेटाबेस में तालिका खो देते हैं। इस तालिका को पुनर्प्राप्त करने के लिए, हमें एक अलग वातावरण में पूर्ण बैकअप का उपयोग करके समय-समय पर पुनर्प्राप्ति करने की आवश्यकता है और फिर इस विशिष्ट तालिका को निकालें। आप सहमत होंगे कि इसमें कुछ समय लगेगा। ब्रांचडीबी ऑर्डरलाइन टेबल के लिए, हमारे पास थोड़ा और समय है और हम लिंक्ड सर्वर पर सिंगल एसक्यूएल स्टेटमेंट के साथ टेबल को रिकवर कर सकते हैं (लिस्टिंग 6 देखें)।
चित्र। 12 फाइव मिनट काउंटडाउन:टेबल दोनों सेकेंडरी डेटाबेस में मौजूद है
अंजीर। ब्रांचडीबी टेबल को पुनर्प्राप्त करने के लिए 13 अतिरिक्त 25 मिनट
सूची 6 - ऑर्डरलाइन तालिका पुनर्प्राप्त करें
USE [master] GO /****** Object: LinkedServer [10.2.1.84] Script Date: 7/2/2018 4:14:59 PM ******/ EXEC master.dbo.sp_addlinkedserver @server = N'10.2.1.84', @srvproduct=N'SQL Server' /* For security reasons the linked server remote logins password is changed with ######## */ EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'10.2.1.84',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpasswo rd=NULL GO select * into BranchDB.Sales.Orderlines from [10.2.1.84].BranchDB.Sales.Orderlines
अंजीर। 14 ब्रांचडीबी बिक्री पुनर्प्राप्त करें। ऑर्डरलाइन तालिका
फिर हम प्राथमिक सर्वर (ब्रांचडीबी डेटाबेस) को सत्यापित करते हैं कि तालिका बहाल हो गई है।
अंजीर। 15 ब्रांचडीबी बिक्री पुनर्प्राप्त करें। ऑर्डरलाइन तालिका
निष्कर्ष
SQL सर्वर विभिन्न मूल कारणों से डेटा हानि से उबरने के कई तरीके प्रदान करता है - डिस्क विफलता, भ्रष्टाचार, उपयोगकर्ता त्रुटि आदि। बैकअप से पॉइंट-इन-टाइम रिकवरी शायद इन तरीकों में सबसे प्रसिद्ध है। उपयोगकर्ता त्रुटि या इसी तरह के मामले के कुछ साधारण मामलों के लिए, जहां एक या दो वस्तुएं खो जाती हैं, विलंबित पुनर्प्राप्ति के साथ लेनदेन लॉग शिपिंग का उपयोग विचार करने का एक अच्छा तरीका है। हालांकि, यह ध्यान दिया जाना चाहिए कि एक माध्यमिक डेटाबेस, जिसे कड़ाई से डीआर जरूरतों के लिए कॉन्फ़िगर किया गया है, को निचले आरपीओ के लिए चुना जाना है।