SQL सर्वर 2008 R2 हस्तांतरण लॉग के साथ COPY_ONLY पूर्ण बैकअप पुनर्स्थापित करें


11

कुछ शोध करने के बाद मुझे इस प्रश्न का उत्तर नहीं मिल रहा है।

पृष्ठभूमि मैं एक बैकअप योजना को स्थापित करने का प्रयास कर रहा हूं जो निम्नलिखित तीन आवश्यकताओं को पूरा करता है:

  1. बैकअप की विश्वसनीयता, रात भर का बैकअप रखना
  2. लेन-देन लॉग बैकअप जो से बहाल किया जा सकता है
  3. डिस्क स्थान की कम मात्रा का उपयोग किया जाता है
  4. बैकअप ऑडिटिंग टूल के लिए स्थानीय रूप से उपलब्ध होना चाहिए

इसलिए उन जरूरतों को पूरा करने के लिए मैं साप्ताहिक, पूर्ण दैनिक, और प्रति घंटे के लेनदेन के बारे में सोच रहा हूं। फिर हर रात एक copy_only बैकअप चलेगा जिसे ऑफसाइट भेज दिया जा सकता है, यह बैकअप इसलिए किया जाता है ताकि लॉग चेन टूट न जाए, और हमारे पास विश्वसनीय रात्रि पूर्ण बैकअप ऑफ़साइट है, बिना स्थानीय डिस्क स्पेस के खाने के लिए।

प्रश्न क्या copy_only बैकअप से पुनर्स्थापित करना और लेनदेन लॉग को पुनर्स्थापित करना संभव है।

मैं सिर्फ एक उदाहरण देता हूं ताकि आप जान सकें कि मैं किस बारे में बात कर रहा हूं।

नीचे दी गई सूची का उपयोग करते हुए मैं सोच रहा हूं कि क्या TransbackbackupG.trn, TransactionbackupH.trn, अंत में TransactionbackupI.trn के बाद FullbackupCOPY_ONLYC.bak को पुनर्स्थापित करना संभव है।

> ---List of Backups---   
FullbackupA.bak 01/01/2013 00:00:00   
>  DifferntialbackupA.bak 02/01/2013 00:00:00 
FullbackupCOPY_ONLYA.bak 02/01/2013 00:00:00
>     TransactionbackupA.trn 02/01/2013 01:00:00
>     TransactionbackupB.trn 02/01/2013 02:00:00
>     TransactionbackupC.trn 02/01/2013 03:00:00
>  DifferntialbackupB.bak 03/01/2013 00:00:00 
FullbackupCOPY_ONLYB.bak 03/01/2013 00:00:00
>     TransactionbackupD.trn 03/01/2013 01:00:00
>     TransactionbackupE.trn 03/01/2013 02:00:00
>     TransactionbackupF.trn 03/01/2013 03:00:00
>  DifferntialbackupC.bak 04/01/2013 00:00:00 
FullbackupCOPY_ONLYC.bak 04/01/2013 00:00:00
>     TransactionbackupG.trn 04/01/2013 01:00:00
>     TransactionbackupH.trn 04/01/2013 02:00:00
>     TransactionbackupI.trn 04/01/2013 03:00:00

शायद यह पूरा सेटअप उचित नहीं है मैं SQL सर्वर के लिए काफी नया हूं और मैं जाते ही सीखने की कोशिश कर रहा हूं। किसी भी सलाह / मदद की सराहना की जाएगी।

जवाबों:


14

SQL Server 2008 में एक पूर्ण बैकअप लॉग श्रृंखला को नहीं तोड़ता है। यह केवल डिफरेंशियल बेस-एलएसएन को रीसेट करता है।

आप केवल एक प्रतिलिपि से पुनर्स्थापित करने के बाद लॉग बैकअप भी पुनर्स्थापित कर सकते हैं। निम्नलिखित स्क्रिप्ट डेमो है कि:

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_2' WITH INIT,FORMAT;
GO
USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_1' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_1' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;

यह एक डेटाबेस और एक तालिका बनाता है और उस तालिका में 50 पंक्तियों को सम्मिलित करता है। इस क्रम में उन आवेषणों के बीच कई बैकअप लिए जाते हैं:

  1. पूर्ण
  2. लॉग
  3. पूर्ण
  4. फुल कॉपी_ऑनली
  5. लॉग

अगला डेटाबेस इस तरह से गिराया और बहाल किया गया है:

  1. पहला पूर्ण
  2. पहला लॉग
  3. दूसरा लॉग

निम्नलिखित SELECTदर्शाता है कि पुनर्स्थापना सफल रही।

इससे पता चलता है कि न तो एक COP_ONLYसामान्य और न ही एक पूर्ण बैकअप लॉग श्रृंखला को तोड़ता है।

फिर डेटाबेस को फिर से गिरा दिया जाता है और इस तरह बहाल किया जाता है:

  1. कॉपी_ऑनली फुल
  2. दूसरा लॉग

बाद में SELECTफिर से सफलता प्रदर्शित करता है।

यह दर्शाता है कि आप COPY_ONLYअपने लॉग रिस्टोर के आधार के रूप में एक पूर्ण बैकअप का उपयोग कर सकते हैं ।

विभेदक परीक्षण

मैंने एक DIFFERENTIALसंस्करण भी बनाया :

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_1' WITH DIFFERENTIAL,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_2' WITH DIFFERENTIAL,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_3' WITH DIFFERENTIAL,INIT,FORMAT;
GO
USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore F1, D1, D2',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_1' WITH NORECOVERY; 
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_1' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;--<--Fails!
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore FC, D3',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_3' WITH NORECOVERY;--<--Fails!
GO
DROP DATABASE BakTst13;
GO
RAISERROR('------> Starting restore F2, D2, D3',0,1)WITH NOWAIT;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_2' WITH NORECOVERY; 
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_3' WITH RECOVERY;
GO
SELECT * FROM BakTst13.dbo.tst;
GO
DROP DATABASE BakTst13;

इस क्रम में बैकअप लेता है:

  1. पहला पूर्ण
  2. पहला अंतर
  3. दूसरा पूर्ण
  4. दूसरा अंतर
  5. कॉपी_ऑनली डिफ
  6. तीसरा अंतर

यह तब इस बहाल मार्ग की कोशिश करता है:

  1. पहला पूर्ण
  2. पहला अंतर
  3. दूसरा अंतर

इस त्रुटि के साथ चरण 3 विफल रहता है:

Msg 3136, Level 16, State 1, Line 4
This differential backup cannot be restored because the database has not been restored to the correct earlier state.

इससे पता चलता है कि एक सामान्य पूर्ण बैकअप अंतर श्रृंखला को तोड़ता है।

अगला डेटाबेस गिरा दिया गया है और इस पुनर्स्थापना प्रवाह का प्रयास किया गया है:

  1. कॉपी_ऑनली फुल
  2. तीसरा अंतर

चरण 2 उपरोक्त चरण 3 के समान त्रुटि के साथ विफल हो जाता है। इससे पता चलता है कि अंतर बैकअप के लिए आधार के रूप में केवल एक कॉपी बैकअप का उपयोग नहीं किया जा सकता है।

फिर डेटाबेस फिर से गिरा दिया जाता है और निम्नलिखित पुनर्स्थापना को निष्पादित किया जाता है:

  1. दूसरा पूर्ण
  2. दूसरा अंतर
  3. तीसरा अंतर

निम्न चयन साबित करता है कि यह पुनर्स्थापना सफल रही। यह दिखाता है कि एक COPY_ONLYपूर्ण बैकअप अंतर श्रृंखला को बाधित नहीं करता है।


मैं इस जानकारी की तलाश में था कि क्या आप copy_only पूर्ण बैकअप के लिए लेन-देन लॉग लागू कर सकते हैं। यह वास्तव में अच्छी जानकारी है!
ब्रेन २००

2

जब अंतर शामिल होते हैं तो यहां क्या होता है:

CREATE DATABASE BakTst13;
GO
ALTER DATABASE BakTst13 SET RECOVERY FULL;
GO
USE BakTst13;
GO
CREATE TABLE dbo.tst(id INT IDENTITY(1,1));
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 10 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 20 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_1' WITH INIT,FORMAT,DIFFERENTIAL
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 30 rows so far
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_1' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 40 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_2' WITH INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 50 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Full_C' WITH COPY_ONLY,INIT,FORMAT;
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 60 rows so far
GO
BACKUP DATABASE BakTst13 
TO DISK = 'BakTst13_Diff_2' WITH INIT,FORMAT,DIFFERENTIAL
GO
INSERT INTO dbo.tst DEFAULT VALUES
GO 10 -- 70 rows so far
GO
BACKUP LOG BakTst13 
TO DISK = 'BakTst13_Log_2' WITH INIT,FORMAT;
GO


USE tempdb;
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_2' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT COUNT(*) FROM BakTst13.dbo.tst; -- Must be 70: log chain not broken
GO
DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE LOG BakTst13 FROM DISK='BakTst13_Log_2' WITH RECOVERY;
GO
SELECT COUNT(*) FROM BakTst13.dbo.tst; -- Must be 70
GO
DROP DATABASE BakTst13;

एक शब्द में: हाँ, आप COPY_ONLYआगे लॉग बैकअप को पुनर्स्थापित करने के लिए बैकअप का उपयोग कर सकते हैं । आप जो नहीं कर सकते हैं वह COPY_ONLYबैकअप को एक विभेदक आधार के रूप में उपयोग करता है। इसका मतलब है कि आप पुनर्स्थापित बैकअप पर किसी भी अंतर बैकअप को पुनर्स्थापित करने में सक्षम नहीं होंगे COPY_ONLY:

DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;

यदि आप यह कोशिश करते हैं, तो आपको एक त्रुटि मिलेगी:

Processed 160 pages for database 'BakTst13', file 'BakTst13' on file 1.
Processed 2 pages for database 'BakTst13', file 'BakTst13_log' on file 1.
RESTORE DATABASE successfully processed 162 pages in 0.009 seconds (139.811 MB/sec).
Msg 3136, Level 16, State 1, Line 2
This differential backup cannot be restored because the database has not been restored to the correct earlier state.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

विभेदक बैकअप को समझना मुश्किल हो सकता है और यहां तक ​​कि अनुभवी डीबीए को भी मूर्ख बना सकता है।

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