परिचय
आप बैकअप और डेटाबेस को पुनर्स्थापित करने के तरीके के बारे में बहुत सी मार्गदर्शिकाएँ पा सकते हैं। इसमें, हम दिखाएंगे कि यह डिफ़ॉल्ट MS SQL सर्वर का उपयोग करके कैसे किया जा सकता है।
इस उदाहरण में कई दृष्टिकोण शामिल होंगे - डेटाबेस का बैकअप लेने से पहले उसकी अखंडता की जाँच करने से लेकर पहले से बनाई गई बैकअप प्रतिलिपि से डेटाबेस को पुनर्स्थापित करने तक।
समाधान
सबसे पहले, आइए एक डेटाबेस का बैकअप लेने के लिए उपयोग किए जाने वाले समग्र एल्गोरिथम को देखें:
1) परिभाषित करना कि किन डेटाबेस का बैकअप लेना है
2) चुने हुए डेटाबेस की अखंडता की जाँच करना
3) प्रत्येक चुने हुए डेटाबेस के लिए एक बैकअप (पूर्ण, अंतर या लेनदेन लॉग कॉपी) बनाना
4) बनाई गई बैकअप प्रतियों की जाँच करना
5) लेन-देन लॉग को संपीड़ित करना (यदि आवश्यक हो)
नीचे, आप इस एल्गोरिथम का कार्यान्वयन उदाहरण पा सकते हैं।
यह परिभाषित करने के लिए कि किन डेटाबेसों का बैकअप लेने की आवश्यकता है, हम निम्न तालिका बनाएंगे:
उपयोग [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE तालिका [srv]। [बैकअप सेटिंग्स] ([DBID] [int] न्यूल नहीं, [FullPathBackup] [nvarchar] (255) न्यूल नहीं, [DiffPathBackup] [nvarchar](255) ) NULL, [LogPathBackup] [nvarchar] (255) NULL, [InsertUTCDate] [डेटाटाइम] नॉट न्यूल, CONSTRAINT [PK_BackupSettings] प्राथमिक कुंजी क्लस्टर ([DBID] ASC) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE_DUP_ OFF, IGNORE ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY];GOALTER TABLE [srv]।[बैकअपसेटिंग्स] ADD CONSTRAINT [DF_BackupSettings_Insertइनसेट करें);डेटाबेस पहचानकर्ता पहले कॉलम में स्थित है, 'FullPathBackup' में पूर्ण बैकअप प्रतिलिपि निर्माण के लिए पथ शामिल है (उदाहरण के लिए, 'डिस्क:\…\'), और DiffPathBackup और LogPathBackup में अंतर और लेनदेन लॉग प्रतियों के निर्माण के लिए पूर्ण पथ हैं। क्रमश। अगर DiffPathBackup या LogPathBackup कॉलम खाली हैं, तो इस डेटाबेस के लिए डिफरेंशियल और/या ट्रांजेक्शन लॉग कॉपी नहीं बनाई जाएगी।
हम इस तालिका के आधार पर एक प्रतिनिधित्व भी बना सकते हैं:
[DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE दृश्य [srv] का उपयोग करें। ] [srv] से।[बैकअप सेटिंग्स];जाओ
यह प्रतिनिधित्व आपको प्रभावी ढंग से जाँचने की अनुमति देता है कि कौन से डेटाबेस बैकअप प्रक्रिया में भाग ले रहे हैं।
अब, एक प्रतिनिधित्व बनाते हैं जो sys.master_files सिस्टम प्रतिनिधित्व से डेटाबेस फ़ाइल जानकारी प्रदर्शित करता है:
उपयोग [DB_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE दृश्य [inf]।[ServerDBFileInfo] asSELECT @@Servername AS Server , File_id ,--DB फ़ाइल पहचानकर्ता। file_id के लिए आधार मान 1 Type_desc है, - फ़ाइल विवरण नाम [फ़ाइल नाम] के रूप में टाइप करें,--DB तार्किक फ़ाइल नाम LEFT(Physical_Name, 1) AS ड्राइव,--DB फ़ाइल स्थान का ड्राइव ध्वज Physical_Name,--पूर्ण फ़ाइल OS RIGHT में नाम (भौतिक_नाम, 3) AS Ext,--फ़ाइल एक्सटेंशन आकार काउंटपेज के रूप में, --वर्तमान फ़ाइल आकार 8Kb पृष्ठों में गोल ((कास्ट(आकार*8 फ्लोट के रूप में))/1024,3) SizeMb के रूप में, - -एमबी राउंड में फ़ाइल का आकार ((कास्ट (आकार * 8 फ्लोट के रूप में)) / 1024 / 1024,3) साइज जीबी के रूप में, - जीबी मामले में फ़ाइल का आकार जब is_percent_growth =0 तब ग्रोथ * 8 और 0 ग्रोथ के रूप में समाप्त होता है, - 8 केबी पृष्ठों के मामले में फ़ाइल वृद्धि जब is_percent_growth =0 फिर गोल ((कास्ट (ग्रोथ * 8 फ्लोट के रूप में)) / 1024,3) ग्रोथएमबी के रूप में समाप्त होता है, - एमबी मामले में फ़ाइल वृद्धि जब is_percent_growth =0 फिर गोल ((कास्ट (विकास) *8 फ्लोट के रूप में))/1024/1024,3) ग्रोथजीबी के रूप में समाप्त होता है, --जीबी मामले में फाइल ग्रोथ जब is_percent_growth=1 फिर ग्रोथ 0 ग्रोथ परसेंट के रूप में समाप्त होती है, --फाइल ग्रोथ प्रतिशत में is_percent_growth, --Percent ग्रोथ एट्रीब्यूट डेटाबेस_आईडी , डीबी_ Name(database_id) as [DB_Name], State,--फाइल State State_desc as StateDesc,--फाइल स्टेट डिस्क्रिप्शन is_media_read_only as IsMediaReadOnly,--फाइल ड्राइव पर रीड-ओनली (0 - और लिखने के लिए) is_read_only के रूप में IsReadOnly है ,--फ़ाइल को केवल पढ़ने के लिए (0 - और लिखने के लिए) is_sparse के रूप में IsSpace के रूप में फ़्लैग किया गया है,--Sparse फ़ाइल is_name_reserved IsNameReserved के रूप में,--1 - दूरस्थ फ़ाइल नाम, उपयोग के लिए सुलभ। - नई फ़ाइल के लिए फिर से उसी नाम (नाम या भौतिक_नाम तर्क) का उपयोग करने से पहले लॉग बैकअप प्राप्त करना आवश्यक है - 0 - फ़ाइल नाम, Create_lsn को CreateLsn के रूप में उपयोग करने के लिए दुर्गम, - लॉग में लेनदेन पंजीकरण संख्या (LSN) जिसका उपयोग Drop_lsn को DropLsn के रूप में बनाने के लिए किया गया था, ---LSN जिसका उपयोग read_only_lsn को ReadOnlyLsn के रूप में फ़ाइल को हटाने के लिए किया गया था, ---LSN जिसका उपयोग फ़ाइल समूह द्वारा "रीड एंड राइट" प्रकार को "रीड" में बदलने के लिए किया गया था। -only" (नवीनतम परिवर्तन) read_write_lsn के रूप में ReadWriteLsn,--LSN जिसका उपयोग फ़ाइल समूह द्वारा "रीड-ओनली" प्रकार को "रीड एंड राइट" (नवीनतम परिवर्तन) डिफरेंशियल बेसल के रूप में "रीड-ओनली" टाइप को बदलने के लिए किया गया था, - - अंतर बैकअप प्रतियों के लिए आधार। डेटा विस्तार जिन्हें एलएसएन के बाद डिफरेंशियल बैकअप में शामिल करने के बाद बदल दिया गया था। डिफरेंशियल बेसगुइड के रूप में डिफरेंशियल_बेस_गाइड,--बेस बैकअप कॉपी का यूनिक आइडेंटिफायर जिसका इस्तेमाल डिफरेंशियल कॉपी बनाने के लिए किया जाएगा। डिफरेंशियल_बेस_टाइम डिफरेंशियल बेसटाइम के रूप में,--RedoStartLsn के रूप में डिफरेंशियल_बेस_एलएसएन redo_start_lsn से संबंधित समय,--LSN अगले रीडो की शुरुआत निर्धारित करने के लिए उपयोग किया जाता है - NULL है, उन मामलों को छोड़कर जिनमें स्टेट =रिस्टोरिंग या स्टेट =RECOVERY_PENDING redo_start_fork_Guid RedoStart के रूप में,- -पुनर्स्थापन कांटा बिंदु के लिए अद्वितीय पहचानकर्ता --first_fork_guid अगली पुनर्स्थापित बैकअप प्रतिलिपि का तर्क मान इस मान के बराबर होना चाहिए redo_target_lsn जैसे RedoTargetLsn,--LSN जो इस फ़ाइल में "ऑनलाइन" मोड को फिर से करने के लिए एक स्टॉप पॉइंट के रूप में कार्य करता है - NULL है, उन मामलों को छोड़कर जिनमें राज्य =RESTORING या State =RECOVERY_PENDING redo_target_fork_guid RedoTargetForkGuid के रूप में,--रिस्टोरेशन कांटा जिस पर कंटेनर को पुनर्स्थापित किया जा सकता है। redo_target_lsn backup_lsn के साथ बैकअप के रूप में उपयोग किया जाता है--सबसे हाल के डेटा का एलएसएन या फ़ाइल की डिफरेंशियल बैकअप कॉपीFROM sys.master_files--database_files;GO
पूर्ण बैकअप प्रतियाँ बनाने के लिए, निम्नलिखित संग्रहीत कार्यविधि को लागू करें:
[शीर्षक विस्तृत करें =”कोड "]
उपयोग [DB_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE [srv]। पहले से */ खाता चालू करें; @dt datetime=getdate() घोषित करें; @year int=YEAR(@dt) घोषित करें; @माह int =MONTH (@dt) घोषित करें; घोषित @day int=DAY(@dt); घोषित @hour int=DatePart(hour, @dt); @ मिनट इंट =डेटपार्ट (मिनट, @ डीटी) घोषित करें; घोषित @ दूसरा इंट =डेटपार्ट (दूसरा, @ डीटी); @pathBackup nvarchar (255) घोषित करें; @pathstr nvarchar (255) घोषित करें; @DBName nvarchar (255) घोषित करें; @backupName घोषित करें nvarchar(255); @sql nvarchar (अधिकतम) घोषित करें; @backupSetId को इंट के रूप में घोषित करें; @FileNameLog nvarchar (255) घोषित करें; @tbllog तालिका घोषित करें ([DBName] [nvarchar] (255) न्यूल नहीं, [FileNameLog] [nvarchar] (255) न्यूल नहीं); @tbl तालिका घोषित करें ( [DBName] [nvarchar] (255) न्यूल नहीं, [FullPathBackup] [nvarchar](255) NOT NULL); -- @tbl ( [DBName] ,[FullPathBackup] ) में पूर्ण बैकअप प्रतिलिपि निर्माण के लिए DB नाम और पूर्ण पथ प्राप्त करना [srv] से DB_NAME([DBID]), [FullPathBackup] का चयन करें। [बैकअप सेटिंग्स]; -- डीबी नाम और उसके अनुसार लेन-देन लॉग के नाम प्राप्त करना (क्योंकि एक डीबी में कई लॉग हो सकते हैं) @tbllog([DBName], [FileNameLog]) में डालें t.[DBName], tt.[FileName] as [FileNameLog] चुनें ] @tbl से t इनर जॉइन [inf]। [ServerDBFileInfo] tt पर t के रूप में। - क्रमिक रूप से प्रत्येक डीबी को संसाधित करते हुए जो हमें पहले मिला था (मौजूद है (ऊपर का चयन करें (1) @tbl से 1)) @backupSetId=NULL सेट करना शुरू करें; शीर्ष (1) @DBName=[DBName], @pathBackup=[FullPathBackup] @tbl से चुनें; सेट @example@sqldat.com+N'_Full_backup_'+cast(@year as nvarchar(255))+N'_'+cast(@month as nvarchar(255))+N'_'+cast(@day as as nvarchar(255))-+N'_' --+cast(@hour as nvarchar(255))+N'_'+cast(@minute as nvarchar(255))+N'_'+cast(@ दूसरा के रूप में nvarchar(255)); @example@sqldat.comexample@sqldat.com+N'.bak' सेट करें; -- अखंडता के लिए DB की जाँच करना @sql=N'DBCC CHECKDB(N'+N''''example@sqldat.com+N''''+N') NO_INFOMSGS' के साथ सेट करें; निष्पादन (@ एसक्यूएल); -- बैकअप प्रतिलिपि निर्माण प्रक्रिया का निष्पादन @sql=N'BACKUP DATABASE ['example@sqldat.com+N'] DISK =N'+N'''example@sqldat.com+N''''+ पर सेट करें N' NOFORMAT के साथ, NOINIT, NAME =N'+N''''example@sqldat.com+N'''+N', CHECKSUM, STOP_ON_ERROR, SKIP, REWIND, COMPRESSION, STATS =10;'; निष्पादन (@ एसक्यूएल); -- हमारे द्वारा बनाई गई बैकअप प्रतिलिपि की जाँच करते हुए चयन करें @backupSetId =msdb..backupset से स्थिति जहाँ example@sqldat.com और backup_set_id=(msdb..backupset जहाँ example@sqldat.com) से max(backup_set_id) का चयन करें); @ sql =N' सत्यापन त्रुटि सेट करें। "'example@sqldat.com+'" डेटाबेस के लिए बैकअप प्रतिलिपि जानकारी नहीं मिली।'; अगर @backupSetId शून्य है तो raiserror(@sql, 16, 1) अंत में सेट करें @sql=N'RESTORE VERIFYONLY VERIFYONLY डिस्क से =N'+'''example@sqldat.com+N''''+N' FILE ='+cast(@backupSetId as nvarchar(255)); निष्पादन (@ एसक्यूएल); अंत - डीबी लेनदेन लॉग को संपीड़ित करना अगर (@ ClearLog =1) शुरू होता है (मौजूद है (शीर्ष (1) 1 @tbllog से चुनें जहां [DBName] example@sqldat.com)) शीर्ष चुनें (1) @ FileNameLog =FileNameLog @tbllog से जहाँ example@sqldat.com; सेट @ sql=N'USE ['example@sqldat.com+N'];'+N' DBCC श्रिंकफाइल (N'+N''''example@sqldat.com+N''''+N' , 0 , ट्रंकटनली)'; निष्पादन (@ एसक्यूएल); @tbllog से हटाएं जहां example@sqldat.com और example@sqldat.com; @tbl से एंड एंड डिलीट जहां [DBName]example@sqldat.com; endENDGO
[/विस्तार]
कोड के अनुसार, हम देख सकते हैं कि यह प्रक्रिया बैकअप प्रतिलिपि निर्माण एल्गोरिथम के शेष चरणों के लिए एक समाधान प्रदान करती है।
डिफरेंशियल और ट्रांजेक्शन लॉग कॉपी बनाने वाली प्रक्रियाएं एक समान तरीके से लागू की जाती हैं:
[शीर्षक विस्तृत करें =”कोड "]
उपयोग [DB_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE [srv]। [RunDiffBackupDB] @ClearLog bit=1 --निर्दिष्ट करता है कि क्या लेन-देन लॉग आकार को कम किया जाना चाहिएASBEGIN /* डिफरेंशियल DB बैकअप कॉपी बनाना */ NOCOUNT ON; @dt datetime=getdate() घोषित करें; घोषित @year int=YEAR(@dt); @माह int =MONTH (@dt) घोषित करें; घोषित @day int=DAY(@dt); घोषित @hour int=DatePart(hour, @dt); @ मिनट इंट =डेटपार्ट (मिनट, @ डीटी) घोषित करें; घोषित @ दूसरा इंट =डेटपार्ट (दूसरा, @ डीटी); @pathBackup nvarchar (255) घोषित करें; @pathstr nvarchar (255) घोषित करें; @DBName nvarchar (255) घोषित करें; @backupName घोषित करें nvarchar(255); @sql nvarchar (अधिकतम) घोषित करें; @backupSetId को इंट के रूप में घोषित करें; @FileNameLog nvarchar (255) घोषित करें; @tbl तालिका घोषित करें ( [DBName] [nvarchar] (255) न्यूल नहीं, [DiffPathBackup] [nvarchar] (255) NOT NULL); @tbllog तालिका घोषित करें ([DBName] [nvarchar] (255) न्यूल नहीं, [FileNameLog] [nvarchar] (255) न्यूल नहीं); -- अंतर बैकअप प्रतियाँ बनाने के लिए डीबी नाम और पूर्ण पथ प्राप्त करना @tbl ( [DBName] ,[DiffPathBackup] ) में डालें [srv] से DB_NAME([DBID]), [DiffPathBackup] का चयन करें। [बैकअप सेटिंग्स] जहां [DiffPathBackup] निरर्थक नहीं है; --डीबी नाम और उसके अनुसार लेन-देन लॉग फ़ाइलों के पूर्ण नाम प्राप्त करना (जैसा कि एक डीबी में कई लॉग हो सकते हैं) @tbllog([DBName], [FileNameLog]) में डालें t.[DBName], tt.[FileName] as का चयन करें। [FileNameLog] @tbl से t इनर जॉइन के रूप में [inf]। [ServerDBFileInfo] tt on t के रूप में। - क्रमिक रूप से प्रत्येक डीबी को संसाधित करते हुए जो हमें पहले मिला था (मौजूद है (ऊपर का चयन करें (1) @tbl से 1)) @backupSetId=NULL सेट करना शुरू करें; शीर्ष का चयन करें(1) @DBName=[DBName], @pathBackup=[DiffPathBackup] @tbl से; सेट @example@sqldat.com+N'_Diff_backup_'+cast(@year as nvarchar(255))+N'_'+cast(@month as nvarchar(255))+N'_'+cast(@day as as nvarchar(255))+N'_' +cast(@hour as nvarchar(255))+N'_'+cast(@minute as nvarchar(255))+N'_'+cast(@second as nvarchar( 255)); @example@sqldat.comexample@sqldat.com+N'.bak' सेट करें; -- अखंडता के लिए DB की जाँच करना @sql=N'DBCC CHECKDB(N'+N''''example@sqldat.com+N''''+N') NO_INFOMSGS' के साथ सेट करें; निष्पादन (@ एसक्यूएल); -- बैकअप प्रक्रिया का निष्पादन @sql=N'BACKUP DATABASE ['example@sqldat.com+N'] से DISK =N'+N''''example@sqldat.com+N''''+ N' सेट करना अंतर के साथ, NOFORMAT, NOINIT, NAME =N'+N''''example@sqldat.com+N''''+ N', CHECKSUM, STOP_ON_ERROR, SKIP, REWIND, COMPRESSION, STATS =10;'; निष्पादन (@ एसक्यूएल); --बैकअप कॉपी की जाँच करते हुए हमने अभी बनाया है msdb..backupset से @backupSetId =स्थिति का चयन करें जहाँ example@sqldat.com और backup_set_id=(msdb..backupset जहाँ example@sqldat.com से अधिकतम (बैकअप_सेट_आईडी) चुनें); @ sql =N' सत्यापन त्रुटि सेट करें। "'example@sqldat.com+'" डेटाबेस के लिए बैकअप प्रतिलिपि जानकारी नहीं मिली।'; अगर @backupSetId शून्य है तो raiserror(@sql, 16, 1) अंत में सेट करें @sql=N'RESTORE VERIFYONLY VERIFYONLY डिस्क से =N'+'''example@sqldat.com+N''''+N' FILE ='+cast(@backupSetId as nvarchar(255)); निष्पादन (@ एसक्यूएल); अंत - डीबी लेनदेन लॉग को संपीड़ित करना अगर (@ ClearLog =1) शुरू होता है (मौजूद है (शीर्ष (1) 1 @tbllog से चुनें जहां [DBName] example@sqldat.com)) शीर्ष चुनें (1) @ FileNameLog =FileNameLog @tbllog से जहाँ example@sqldat.com; सेट @ sql=N'USE ['example@sqldat.com+N'];'+N' DBCC श्रिंकफाइल (N'+N''''example@sqldat.com+N''''+N' , 0 , ट्रंकटनली)'; निष्पादन (@ एसक्यूएल); @tbllog से हटाएं जहां example@sqldat.com और example@sqldat.com; @tbl से एंड एंड डिलीट जहां [DBName]example@sqldat.com; endENDGO
[/विस्तार]
चूंकि अखंडता के लिए डेटाबेस की जांच करने के लिए बहुत सारे संसाधन लगते हैं, इसलिए हम डिफरेंशियल बैकअप कॉपी बनाते समय इसे छोड़ सकते हैं।
[शीर्षक विस्तृत करें =”कोड "]
उपयोग [DB_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE [srv]। [RunLogBackupDB] @ClearLog bit=1 --निर्दिष्ट करता है कि क्या लेन-देन लॉग का आकार कम किया जाना चाहिएASBEGIN /* DB लेन-देन लॉग का बैकअप लेना */ सेट NOCOUNT ON; @dt datetime=getdate() घोषित करें; @year int=YEAR(@dt) घोषित करें; @माह int =MONTH (@dt) घोषित करें; घोषित @day int=DAY(@dt); घोषित @hour int=DatePart(hour, @dt); @ मिनट इंट =डेटपार्ट (मिनट, @ डीटी) घोषित करें; घोषित @ दूसरा इंट =डेटपार्ट (दूसरा, @ डीटी); @pathBackup nvarchar (255) घोषित करें; @pathstr nvarchar (255) घोषित करें; @DBName nvarchar (255) घोषित करें; @backupName घोषित करें nvarchar(255); @sql nvarchar (अधिकतम) घोषित करें; @backupSetId को इंट के रूप में घोषित करें; @FileNameLog nvarchar (255) घोषित करें; @tbl तालिका घोषित करें ( [DBName] [nvarchar] (255) न्यूल नहीं, [LogPathBackup] [nvarchar](255) NOT NULL); @tbllog तालिका घोषित करें ([DBName] [nvarchar] (255) न्यूल नहीं, [FileNameLog] [nvarchar] (255) न्यूल नहीं); - गैर-सरल पुनर्प्राप्ति मॉडल (पूर्ण या थोक-लॉग) के साथ लेन-देन लॉग की बैकअप प्रतियां बनाने के लिए डीबी नाम और पूर्ण पथ प्राप्त करना। सिस्टम डीबी को @tbl ( [DBName] ,[LogPathBackup] ) में डालने से भी बाहर रखा गया है। [srv] से DB_NAME(b.[DBID]), b.[LogPathBackup] का चयन करें। b.[DBID]=d.[database_id] पर जहां d.recovery_model<3 और DB_NAME([DBID]) अंदर नहीं है (N'master', N'tempdb', N'model', N'msdb', N' ReportServer', N'ReportServerTempDB' ) और [LogPathBackup] रिक्त नहीं है; --डीबी नाम और उसके अनुसार लेन-देन लॉग फ़ाइलों के पूर्ण नाम प्राप्त करना (जैसा कि एक डीबी में कई लॉग हो सकते हैं) @tbllog([DBName], [FileNameLog]) में डालें t.[DBName], tt.[FileName] as का चयन करें। [FileNameLog] @tbl से t इनर जॉइन के रूप में [inf]। [ServerDBFileInfo] tt on t के रूप में। - क्रमिक रूप से प्रत्येक डीबी को संसाधित करते हुए जो हमें पहले मिला था (मौजूद है (ऊपर का चयन करें (1) @tbl से 1)) @backupSetId=NULL सेट करना शुरू करें; शीर्ष (1) @DBName=[DBName], @pathBackup=[LogPathBackup] @tbl से चुनें; सेट @example@sqldat.com+N'_Log_backup_'+cast(@year as nvarchar(255))+N'_'+cast(@month as nvarchar(255))+N'_'+cast(@day as as nvarchar(255))+N'_' +cast(@hour as nvarchar(255))+N'_'+cast(@minute as nvarchar(255))+N'_'+cast(@second as nvarchar( 255)); @example@sqldat.comexample@sqldat.com+N'.trn' सेट करें; -- बैकअप प्रक्रिया का निष्पादन @sql=N'BACKUP LOG ['example@sqldat.com+N'] से DISK =N'+N''''example@sqldat.com+N''''+ N' सेट करना NOFORMAT के साथ, NOINIT, NAME =N'+N''''example@sqldat.com+N''''+ N', CHECKSUM, STOP_ON_ERROR, SKIP, REWIND, COMPRESSION, STATS =10;'; निष्पादन (@ एसक्यूएल); -- लेन-देन लॉग बैकअप कॉपी की जाँच करना हमने अभी बनाया है msdb..backupset से @backupSetId =स्थिति चुनें जहाँ example@sqldat.com और backup_set_id=(msdb..backupset जहाँ example@sqldat.com) से अधिकतम (बैकअप_सेट_आईडी) चुनें); @ sql =N' सत्यापन त्रुटि सेट करें। "'example@sqldat.com+'" डेटाबेस के लिए बैकअप प्रतिलिपि जानकारी नहीं मिली।'; अगर @backupSetId शून्य है तो raiserror(@sql, 16, 1) अंत में सेट करें @sql=N'RESTORE VERIFYONLY VERIFYONLY डिस्क से =N'+'''example@sqldat.com+N''''+N' FILE ='+cast(@backupSetId as nvarchar(255)); निष्पादन (@ एसक्यूएल); अंत - डीबी लेनदेन लॉग को संपीड़ित करना अगर (@ ClearLog =1) शुरू होता है (मौजूद है (शीर्ष (1) 1 @tbllog से चुनें जहां [DBName] example@sqldat.com)) शीर्ष चुनें (1) @ FileNameLog =FileNameLog @tbllog से जहाँ example@sqldat.com; सेट @ sql=N'USE ['example@sqldat.com+N'];'+N' DBCC श्रिंकफाइल (N'+N''''example@sqldat.com+N''''+N' , 0 , ट्रंकटनली)'; निष्पादन (@ एसक्यूएल); @tbllog से हटाएं जहां example@sqldat.com और example@sqldat.com; @tbl से एंड एंड डिलीट जहां [DBName]example@sqldat.com; endENDGO
[/विस्तार]
जैसा कि ऊपर कहा गया है, अखंडता के लिए डेटाबेस की जाँच करना एक संसाधन-भारी कार्य है। इस तथ्य के साथ कि लेन-देन लॉग बैकअप प्रतियों को आमतौर पर अक्सर बनाने की आवश्यकता होती है, यह हमें लेनदेन लॉग प्रतिलिपि बनाते समय अखंडता जांच को छोड़ने का एक कारण देता है।
कृपया यह भी ध्यान रखें कि 'मास्टर', 'एमएसडीबी' और 'मॉडल' डेटाबेस की पूर्ण बैकअप प्रतियां समय-समय पर करने की आवश्यकता है।
बैकअप प्रतिलिपि बनाने की प्रक्रिया को स्वचालित करने के लिए, आपको बस पहले लागू की गई प्रक्रियाओं को Windows कार्य शेड्यूलर, एजेंट नौकरियों या किसी भी समान उपलब्ध सेवा में कॉल करने की आवश्यकता होगी।
आपको उन प्रक्रियाओं में से प्रत्येक के लिए लोड पीक, गतिविधि पठार आदि के आधार पर व्यक्तिगत रूप से कॉल फ़्रीक्वेंसी सेट करने की आवश्यकता होगी।
मूल दृष्टिकोण इस प्रकार है:
1) दिन में एक बार एक पूर्ण बैकअप प्रतिलिपि बनाना
2) हर 2-4 घंटे में अंतर बैकअप प्रतियाँ बनाना
3) हर 5-60 मिनट में लेन-देन लॉग बैकअप प्रतियाँ बनाना
कृपया ध्यान रखें कि आमतौर पर डेटाबेस विफल-सुरक्षित और त्वरित पहुँच प्रणाली में भाग लेते हैं। और, यदि बाद में लेन-देन लॉग बैकअप प्रतियों का उपयोग करता है, तो यह महत्वपूर्ण है कि प्रक्रिया में हस्तक्षेप न करें। अधिक विशेष रूप से, इसका मतलब है कि लेन-देन लॉग प्रतियां कई अलग-अलग प्रक्रियाओं द्वारा नहीं बनाई जानी चाहिए - यदि ऐसा होता है, तो इन प्रतियों से बैकअप अनुक्रम खो जाएगा।
यहां, हमने देखा है कि प्रत्येक डेटाबेस को क्रमिक रूप से संसाधित किया जा रहा है, एक समय में एक। हालांकि, हम उत्पादन वातावरण में समानांतर प्रसंस्करण प्राप्त कर सकते हैं - कई बैकअप प्रतियों को एक साथ बनाने की इजाजत देता है। यह कुछ अलग तरीकों से संपर्क किया जा सकता है। उदाहरण के लिए, निम्न संग्रहीत कार्यविधि को कॉल करके:
उपयोग [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [inf]। [RunAsyncExecute] (@sql nvarchar(max), @jobname nvarchar(57) =null, @database nvarchar(128)=null, @owner nvar(128) 128) =नल) AS BEGIN/* एजेंट की नौकरियों के माध्यम से अतुल्यकालिक पैकेज निष्पादन RunAsyncExecute - टी-एसक्यूएल कमांड का एसिंक्रोनस निष्पादन या संग्रहीत प्रोडेक्योर 2012 एंटोनिन फोलर, मोटोबिट सॉफ्टवेयर, www.motobit.com https://www.motobit.com/ टिप्स/detpg_async-execute-sql/ */ NOCOUNT ON सेट करें; @id अद्वितीय पहचानकर्ता घोषित करें; -- यदि नाम निर्दिष्ट नहीं है तो अद्वितीय कार्य नाम बनाएं यदि (@jobname शून्य है) @jobname='' सेट करें; सेट @jobname =@jobname + '_async_' + कन्वर्ट (varchar (64), NEWID ()); अगर (@स्वामी शून्य है) @owner ='sa' सेट करें; --नई नौकरी बनाएं, जॉब आईडी प्राप्त करें msdb..sp_add_job @jobname, @example@sqldat.com, @example@sqldat.com OUTPUT निष्पादित करें; --कार्य निष्पादन के लिए जॉब सर्वर निर्दिष्ट करें msdb..sp_add_jobserver @example@sqldat.com; --कार्य का पहला चरण निर्दिष्ट करें - SQL कमांड --(@on_success_action =3 ... अगले चरण पर जाएं) msdb..sp_add_jobstep @example@sqldat.com, @step_name='Step1', @command =निष्पादित करें @sql, @database_name =@database, @on_success_action =3; - नौकरी के अगले चरण को निर्दिष्ट करें - नौकरी को हटाएं @deletecommand varchar(200); सेट @deletecommand ='निष्पादित msdb..sp_delete_job @job_name='''example@sqldat.com+''''; msdb..sp_add_jobstep @example@sqldat.com, @step_name='Step2', @command =@deletecommand निष्पादित करें; -- कार्य प्रारंभ करें msdb..sp_start_job @example@sqldat.com निष्पादित करें; END GO
यहां, एजेंट नौकरियों को गतिशील रूप से बनाकर, बाद में उन्हें क्रियान्वित और हटाकर अतुल्यकालिकता हासिल की जाती है।
अब, आइए एक अलग/परीक्षण वातावरण में पहले बनाई गई बैकअप प्रतियों से डेटाबेस को पुनर्स्थापित करने के लिए सामान्य एल्गोरिथम देखें:
1) परिभाषित करना कि कौन से डेटाबेस को पुनर्स्थापित किया जाना चाहिए और उनकी बैकअप प्रतियों का स्थान
2) डेटाबेस को पुनर्स्थापित करना
3) अखंडता के लिए पुनर्स्थापित डेटाबेस की जांच करना
अब, हम एक एल्गोरिदम के कार्यान्वयन को देखेंगे जो एक पूर्ण बैकअप प्रतिलिपि से डेटाबेस को पुनर्स्थापित करता है। एक डिफरेंशियल कॉपी के लिए, प्रक्रिया समान होती है - एकमात्र अंतर यह है कि एक पूर्ण बैकअप कॉपी को पहले से बहाल करने की आवश्यकता होती है, उसके बाद डिफरेंशियल कॉपी।
यह परिभाषित करने के लिए कि कौन से डेटाबेस को पुनर्स्थापित किया जाना चाहिए, साथ ही साथ उनकी बैकअप प्रतियों का स्थान, आइए नीचे दिखाए गए अनुसार दो टेबल बनाएं:
उपयोग [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE तालिका [srv]। [RestoreSettings] ( [DBName] [nvarchar] (255) न्यूल नहीं, [FullPathRestore] [nvarchar] (255) न्यूल नहीं, [DiffcharRestore] [nvarchar] ] (255) न्यूल नहीं, [लॉगपाथ रिस्टोर] [नवरचर] (255) न्यूल नहीं, [इन्सर्टयूटीसीडेट] [डेटटाइम] नॉट न्यूल, कॉन्स्ट्रेंट [पीके_रिस्टोरसेटिंग्स] प्राथमिक कुंजी क्लस्टर ([डीबीनाम] एएससी) के साथ (PAD_INDEX =OFF, STATISTICS_OFFCOMPUTE =STATISTICS_OFFCOMPUTE , IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ऑन [प्राथमिक]) ऑन [प्राथमिक];गोल्टर टेबल [srv]। /पूर्व>यहां, कॉलम का उद्देश्य [srv].[BackupSettings] टेबल से मिलते-जुलते हैं। अंतर केवल इतना है कि पूर्ण पथ का उपयोग पुनर्स्थापन के लिए बैकअप प्रतियों का पता लगाने के लिए किया जाएगा, न कि नए बनाने के लिए।
उपयोग [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE तालिका [srv]। [RestoreSettingsDetail] ( [Row_GUID] [अद्वितीय पहचानकर्ता] शून्य नहीं, [DBName] [nvarchar] (255) शून्य नहीं, [SourcePathRestore] [nvarchar] ) न्यूल नहीं, टारगेटपाथ रिस्टोर [एनवर्चर] (255) न्यूल नहीं, [एक्सट] [नवरचर] (255) न्यूल नहीं, [इन्सर्टयूटीसीडेट] [डेटाटाइम] नॉट न्यूल, कॉन्स्ट्रेंट [पीके_रिस्टोरसेटिंग्सडिटेल] प्राथमिक कुंजी क्लस्टर ( [रो_गाइड] एएससी) के साथ ( PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ऑन [PRIMARY]) ऑन [PRIMARY]; GOALTER_सेटिंग (कॉन्ड्रॉइड सेट करना) [Row_GUID] के लिए;गोलटर टेबल [srv]।पुनर्स्थापित किए जा रहे डेटाबेस के पूर्ण फ़ाइल नामों को परिभाषित करने के लिए इस तालिका की आवश्यकता होती है, जो तब आगे स्थानांतरण के लिए उपयोग किए जाते हैं (उदाहरण के लिए, [SourcePathRestore]='लॉजिकल फ़ाइल नाम' और [TargetPathRestore]='डिस्क:\…\भौतिक फ़ाइल नाम ', जबकि [Ext]='फ़ाइल एक्सटेंशन')
वास्तव में, हम निम्न क्वेरी का उपयोग करके डेटाबेस फ़ाइलों के तार्किक नामों को परिभाषित कर सकते हैं:
डिस्क से FILEISTONLY को पुनर्स्थापित करें ='डिस्क:\...\बैकअप कॉपी.BAK';किसी फ़ाइल में स्थित बैकअप प्रतियों के बारे में जानकारी प्राप्त करना इस तरह से किया जा सकता है:
डिस्क से हेडरोनली को पुनर्स्थापित करें='डिस्क:\...\बैकअप कॉपी.बेक';इसके बाद, हमारे पास एक पूर्ण बैकअप प्रतिलिपि से डेटाबेस को पुनर्स्थापित करने और डेटा अखंडता के लिए इसे जांचने के लिए उपयोग की जाने वाली संग्रहीत प्रक्रिया का कार्यान्वयन है:
[शीर्षक विस्तृत करें =”कोड "]
उपयोग [DB_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE [srv]।[RunFullRestoreDB]ASBEGIN /* एक पूर्ण बैकअप प्रतिलिपि से DB पुनर्प्राप्त करना और अखंडता के लिए DB की जाँच करना */ NOCOUNT ON; घोषित @dt datetime=DateAdd(दिन, -2, getdate ()); @year int=YEAR(@dt) घोषित करें; @माह int =MONTH (@dt) घोषित करें; घोषित @day int=DAY(@dt); घोषित @hour int=DatePart(hour, @dt); @ मिनट इंट =डेटपार्ट (मिनट, @ डीटी) घोषित करें; घोषित @ दूसरा इंट =डेटपार्ट (दूसरा, @ डीटी); @pathBackup nvarchar (255) घोषित करें; @pathstr nvarchar (255) घोषित करें; @DBName nvarchar (255) घोषित करें; @backupName घोषित करें nvarchar(255); @sql nvarchar (अधिकतम) घोषित करें; @backupSetId को इंट के रूप में घोषित करें; @FileNameLog nvarchar (255) घोषित करें; @SourcePathRestore nvarchar (255) घोषित करें; @TargetPathRestore nvarchar (255) घोषित करें; @Ext nvarchar (255) घोषित करें; @tbl तालिका घोषित करें ( [DBName] [nvarchar] (255) न्यूल नहीं, [FullPathRestore] [nvarchar](255) NOT NULL); @tbl_files तालिका घोषित करें ( [DBName] [nvarchar] (255) न्यूल नहीं, [SourcePathRestore] [nvarchar] (255) न्यूल नहीं, [TargetPathRestore] [nvarchar] (255) न्यूल नहीं, [Ext] [nvarchar] (255) शून्य नहीं ); -- डीबी नामों की एक सूची और पूर्ण बैकअप प्रतियों के पथ को पुनः प्राप्त करना @tbl ( [DBName] ,[FullPathRestore] ) में डालें [srv] से [DBName] ,[FullPathRestore] चुनें। [RestoreSettings]; --@tbl_files ( [DBName] ,[SourcePathRestore] ,[TargetPathRestore] ,[Ext] ) में डालने वाली नई DB फ़ाइलों के स्थान के बारे में विस्तृत जानकारी प्राप्त करना [DBName] ,[SourcePathRestore] ,[TargetPathRestore] ,[Ext] का चयन करें। srv]। [RestoreSettingsDetail]; - प्रत्येक डीबी को संसाधित करना जो हमें पहले मिला था (मौजूद है (@tbl से शीर्ष (1) 1 चुनें) @backupSetId=NULL सेट करना शुरू करें; शीर्ष (1) @DBName=[DBName], @pathBackup=[FullPathRestore] @tbl से चुनें; सेट @example@sqldat.com+N'_Full_backup_'+cast(@year as nvarchar(255))+N'_'+cast(@month as nvarchar(255))+N'_'+cast(@day as as nvarchar(255))-+N'_' --+cast(@hour as nvarchar(255))+N'_'+cast(@minute as nvarchar(255))+N'_'+cast(@ दूसरा के रूप में nvarchar(255)); @example@sqldat.comexample@sqldat.com+N'.bak' सेट करें; -- एक बैकअप क्वेरी बनाना और इसे निष्पादित करना @sql=N'RESTORE DATABASE ['example@sqldat.com+N'_Restore] डिस्क से =N'+N'''example@sqldat.com+N''' सेट करें फ़ाइल के साथ '+ एन' =1'; जबकि (मौजूद है (@tbl_files से शीर्ष (1) 1 का चयन करें जहां [DBName] example@sqldat.com)) शीर्ष का चयन करें (1) @ SourcePathRestore =[SourcePathRestore], @TargetPathRestore =[TargetPathRestore], @Ext =[Ext] @tbl_files से जहां [DBName]example@sqldat.com; @example@sqldat.com+N' MOVE N'+N''''example@sqldat.com+N''''+N' to N'+N''''example@sqldat.com+N' सेट करें _Restore.'example@sqldat.com+N''''+N','; @tbl_files से हटाएं जहां [DBName]example@sqldat.com और [SourcePathRestore]example@sqldat.com और [Ext]example@sqldat.com; एंड सेट @example@sqldat.com+N' NOUNLOAD, REPLACE, STATS =5'; निष्पादन (@ एसक्यूएल); -- अखंडता के लिए DB की जाँच करना @sql=N'DBCC CHECKDB(N'+N'''example@sqldat.comName+'_Restore'+N''''+N') NO_INFOMSGS' के साथ सेट करें; निष्पादन (@ एसक्यूएल); @tbl से हटाएं जहां [DBName]example@sqldat.com; अंतEND[/विस्तार]
यह निर्दिष्ट करने के लिए कि बहाली के लिए कौन सी पूर्ण बैकअप प्रतिलिपि का उपयोग किया जाना चाहिए, एक विशेष रूप से संरचित फ़ाइल नाम का उपयोग किया जाता है:
<डेटाबेस नाम>_पूर्ण_बैकअप_<वर्ष>_<महीने_संख्या>_<दिन_संख्या>.बक
इस डेटाबेस बहाली प्रक्रिया को स्वचालित करने के लिए, हमारे द्वारा लागू की गई संग्रहीत प्रक्रिया की कॉल को विंडोज टास्क शेड्यूलर, एजेंट जॉब्स या किसी भी समान उपलब्ध सेवा में रखा जाना चाहिए।
आप निम्न प्रतिनिधित्व का उपयोग करके नवीनतम डेटाबेस बैकअप प्रतियां देख सकते हैं:
उपयोग [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE देखें [inf]। ' फिर 'लॉग' जब 'मैं' फिर 'अंतर' और 'अन्य' अंत, बीएस। [फर्स्ट_एलएसएन], बीएस। [last_lsn], बीएस। [बैकअप_स्टार्ट_डेट], बीएस। [बैकअप_फिनिश_डेट], कास्ट (बीएस। दशमलव के रूप में(18,3))/1024/1024 बैकअपसाइजएमबी के रूप में, Rownum =row_number() over ( bs.[database_name] द्वारा विभाजन, bs.[backup_finish_date] desc ), LogicalDeviceName =bmf. =बीएमएफ। [भौतिक_device_name], बीएस। [सर्वर_नाम], बीएस। [उपयोगकर्ता_नाम] msdb.dbo.backupset से बीएस इनर जॉइन msdb.dbo.backupmediafamily bmf पर [बीएस]। [मीडिया_सेट_आईडी] =[बीएमएफ]। [मीडिया_सेट_आईडी]) [सर्वर_नाम] के रूप में चुनें [सर्वरनाम], [डेटाबेस_नाम] [DBName] के रूप में, [user_name] [USerName] के रूप में, [बैकअप_टाइप] [बैकअप टाइप] के रूप में, [बैकअप_स्टार्ट_डेट] [बैकअपस्टार्टडेट] के रूप में, [बैकअप_फिनिश_डेट] [बैकअपफिनिशडेट] के रूप में, [बैकअपसाइजएमबी], -- असम्पीडित आकार [LogicalDeviceName], [PhysicalDeviceName], [first_lsn] [FirstLSN] के रूप में, [last_lsn] [LastLSN] के रूप में backup_ctewhere rownum =1 से;परिणाम
इस गाइड में, हमने एक सर्वर पर स्वचालित बैकअप प्रक्रिया के कार्यान्वयन और दूसरे सर्वर पर परिणामी पुनर्स्थापना (उदाहरण के लिए एक परीक्षण सर्वर) पर ध्यान दिया है।
यह विधि हमें बैकअप प्रतिलिपि बनाने की प्रक्रिया को स्वचालित करने, बैकअप प्रतियों को पुनर्स्थापित करने और ऊपर दिखाई गई प्रक्रियाओं को फ़ाइन-ट्यून करने की अनुमति देती है।
स्रोत:
बैकअप
पुनर्स्थापित करें
बैकअपसेट
CHECKDB
SHRINKFILE
sys.master_files