विभेदक बैकअप मुद्दा - क्यों? क्या यह संभव है?


13

मैं SQL सर्वर 2014 का उपयोग कर रहा हूं और यह स्थिति है:

  • मेरे पास सर्वर ए और सर्वर बी है।
  • रात भर ETL को सर्वर A पर संसाधित किया जाता है।
  • लोड हो रहा है की प्रक्रिया पूर्ण होने के बाद, डेटाबेस एक्स बैक-अप हो जाता है (के साथ CHECKSUMऔर RESTORE VERIFYONLYसुनिश्चित करने के लिए विश्वसनीयता) और फिर सर्वर बी को भेजा
  • सर्वर बी bakफ़ाइल प्राप्त करता है और फिर वहां डेटाबेस को पुनर्स्थापित करता है।

मैं अंतर बैकअप रणनीति का उपयोग करना चाहता हूं ताकि:

  1. पूर्ण बैकअप केवल शनिवार को ही किया जाता है
    अर्थात शनिवार को सर्वर A पर पूर्ण बैकअप -> सर्वर B पर जहाज -> सर्वर B पर पूर्ण बैकअप पुनर्स्थापित करें

  2. बाकी दिनों में अंतर बैकअप होगा
    अर्थात सर्वर A पर अंतर विभेदक बैकअप - सर्वर B पर जहाज -> सर्वर B पर अंतर बैकअप पुनर्स्थापित करें

मैंने कोशिश की है, लेकिन मुझे एक त्रुटि मिली है:

लॉग या डिफरेंशियल बैकअप को बहाल नहीं किया जा सकता है क्योंकि कोई भी फाइल रोलफॉर्वर्ड करने के लिए तैयार नहीं है।

यकीन नहीं है कि क्यों। मैं जाँच की sys.database_filesसर्वर एक और सर्वर बी पर, और मुझे लगता है कि कर सकते हैं differential_Base_LSNऔर differential_base_GUIDएक ही हैं। कहीं भी / कुछ और जाँच करने के लिए?

वैसे, ऊपर चरण 2 पर, जब मैं सर्वर बी पर पर्याप्त बैकअप बहाल कर रहा हूं, तो क्या मुझे हर बार पूर्ण बैकअप + अंतर बैकअप दोनों को पुनर्स्थापित करने की आवश्यकता है?

मैंने केवल डिफरेंशियल बैकअप को रिस्टोर किया WITH RECOVERY(और उस एरर मेसेज को मिला) क्योंकि फुल बैकअप को पहले ही दिन बहाल कर दिया गया था।

स्पष्ट करने के लिए: हां, मैं चाहता हूं कि सर्वर बी पर डीबी अंतर के बीच पठनीय हो। मैं उसके आसपास कैसे पहुंच सकता हूं? क्या मेरा एकमात्र विकल्प RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)कॉम्बो अनुक्रम प्रत्येक रात है?

किसी भी मार्गदर्शन की बहुत सराहना की जाएगी।

जवाबों:


15

आप के साथ गड़बड़ करने की जरूरत नहीं है RECOVERYऔर NORECOVERYयहाँ, आप सभी की जरूरत है STANDBYविकल्प है। यहां इसका उपयोग करने के बारे में एक त्वरित डेमो दिया गया है।

एक डेटाबेस बनाएं, इसे साधारण रिकवरी पर सेट करें, और एक टेबल बनाएं।

डेटा डालें, कुछ अंतर लें।

मज़ा, सही?

USE master;

/*Create a dummy database*/
CREATE DATABASE DiffRestoreTest

/*We simple now*/
ALTER DATABASE DiffRestoreTest SET RECOVERY SIMPLE

/*Context is everything*/
USE DiffRestoreTest

/*If nothing changes, do we even need a diff backup?*/
CREATE TABLE dbo.t1 (Id INT)

/*Take a full backup, dummy*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_FULL.bak' 
WITH INIT, FORMAT, COMPRESSION

/*Make a change*/
INSERT dbo.t1 (Id )
VALUES ( 1 )

/*Take a differential backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 2 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest  
TO DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

/*Make another change*/
INSERT dbo.t1 (Id )
VALUES ( 3 )

/*Take another diff backup*/
BACKUP DATABASE DiffRestoreTest 
TO DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH INIT, FORMAT, COMPRESSION, DIFFERENTIAL

हाँ, मैंने झूठ बोला। वह उबाऊ हिस्सा है।

आप इसमें अपना पूर्ण बैकअप बहाल कर सकते हैं STANDBY:

/*Exit stage left*/
USE master

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

आप के क्रम में मुश्किलों को बहाल कर सकते हैं STANDBY:

/*Square one*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_1.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 2*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_2.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*Square 3*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

और उन pesky लॉग फ़ाइलों के विपरीत, आप मुश्किल को बहाल करते हुए आगे छोड़ सकते हैं:

/*Restore the full backup*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_FULL.bak' 
WITH REPLACE, STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

/*What happens if I try to jump the restores?*/
RESTORE DATABASE DiffRestoreTest
FROM DISK = 'F:\Backup\DRT_DIFF_3.bak' 
WITH STANDBY = 'F:\Backup\DRT_STANDBY.tuf'

यदि आप पठनीयता का परीक्षण करना चाहते हैं, तो इसे रीस्टोर कमांड के बीच में चलाएं। आपको प्रत्येक के साथ आईडी वेतन वृद्धि देखनी चाहिए। यदि आप नहीं करते हैं, तो आपने कुछ गलत किया है।

ध्यान रखें कि जब आप फ़ाइलों को पुनर्स्थापित करते हैं, तो यह किसी भी अंतिम उपयोगकर्ता को डेटाबेस से बाहर कर देगा, और यह उनके प्रश्नों के समाप्त होने की प्रतीक्षा नहीं करेगा।

यह डेटाबेस को केवल पढ़ने की स्थिति में छोड़ देता है, यहां कोई परिवर्तन नहीं किया जा सकता है।

SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

और अंत में, अपने आप को साफ करें।

/*Bring'er online, lad*/
RESTORE DATABASE DiffRestoreTest WITH RECOVERY

DROP DATABASE DiffRestoreTest

उम्मीद है की यह मदद करेगा!!

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