SQL Server 2008 R2 กู้คืนการสำรองข้อมูลเต็มรูปแบบ COPY_ONLY พร้อมบันทึกธุรกรรม


11

หลังจากทำวิจัยฉันไม่สามารถหาคำตอบสำหรับคำถามนี้ได้

ความเป็นมาฉันกำลังพยายามตั้งค่าแผนสำรองที่เหมาะกับข้อกำหนดสามข้อต่อไปนี้:

  1. ความน่าเชื่อถือของการสำรองข้อมูลมีการสำรองข้อมูลเต็มรูปแบบทุกคืน
  2. การสำรองข้อมูลบันทึกธุรกรรมที่สามารถกู้คืนได้
  3. ใช้พื้นที่ดิสก์ในระดับต่ำ
  4. การสำรองข้อมูลต้องสามารถเข้าถึงได้ในเครื่องสำหรับเครื่องมือตรวจสอบ

ดังนั้นเพื่อให้เหมาะกับความต้องการเหล่านั้นฉันจึงคิดว่าการสำรองข้อมูลเต็มรูปแบบทุกสัปดาห์ความแตกต่างรายวันและธุรกรรมรายชั่วโมง จากนั้นทุกคืนจะมีการสำรองข้อมูล copy_only ซึ่งสามารถจัดส่งนอกสถานที่ได้การสำรองข้อมูลนี้จะทำเพื่อไม่ให้ห่วงโซ่การบันทึกเสียหายและเรามีการสำรองข้อมูลเต็มรูปแบบที่เชื่อถือได้ทุกคืนโดยไม่ต้องกินพื้นที่ดิสก์ในท้องถิ่นมากนัก

คำถามเป็นไปได้ไหมที่จะกู้คืนจากข้อมูลสำรอง copy_only และกู้คืนบันทึกธุรกรรมหลังจาก

ให้ฉันเป็นตัวอย่างให้คุณรู้ว่าฉันกำลังพูดถึงอะไร

ใช้รายการด้านล่างฉันสงสัยว่ามันเป็นไปได้ที่จะเรียกคืน FullbackupCOPY_ONLYC.bak ตามด้วย TransactionbackupG.trn, TransactionbackupH.trn, สุดท้าย TransactionbackupI.trn

> ---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 Server และฉันพยายามที่จะเรียนรู้เมื่อฉันไป คำแนะนำ / ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม

คำตอบ:


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. เต็ม Copy_Only
  5. เข้าสู่ระบบ

ถัดไปฐานข้อมูลจะถูกดร็อปและกู้คืนเช่นนี้:

  1. ที่ 1 เต็ม
  2. บันทึกที่ 1
  3. บันทึกที่ 2

ข้อมูลต่อไปนี้SELECTแสดงให้เห็นว่าการกู้คืนสำเร็จแล้ว

นี่แสดงให้เห็นว่าไม่ว่าจะเป็นการCOP_ONLYสำรองข้อมูลเต็มรูปแบบหรือปกติไม่ทำลายห่วงโซ่การบันทึก

จากนั้นฐานข้อมูลจะถูกลบอีกครั้งและเรียกคืนในลักษณะนี้:

  1. Copy_ เต็มเท่านั้น
  2. บันทึกที่ 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. ที่ 1 เต็ม
  2. ความแตกต่างที่ 1
  3. เต็ม 2
  4. ความแตกต่างที่ 2
  5. Copy_Only Diff
  6. ความแตกต่างที่ 3

จากนั้นลองเส้นทางการคืนค่านี้:

  1. ที่ 1 เต็ม
  2. ความแตกต่างที่ 1
  3. ความแตกต่างที่ 2

ขั้นตอนที่ 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. Copy_ เต็มเท่านั้น
  2. ความแตกต่างที่ 3

ขั้นตอนที่ 2 ล้มเหลวด้วยข้อผิดพลาดเดียวกับขั้นตอนที่ 3 ด้านบน นี่แสดงให้เห็นว่าไม่สามารถใช้สำเนาสำรองเท่านั้นเป็นฐานสำหรับการกู้คืนส่วนต่างได้

จากนั้นฐานข้อมูลจะถูกดร็อปอีกครั้งและดำเนินการกู้คืนต่อไปนี้:

  1. เต็ม 2
  2. ความแตกต่างที่ 2
  3. ความแตกต่างที่ 3

ตัวเลือกต่อไปนี้พิสูจน์ว่าการกู้คืนนี้สำเร็จ สิ่งนี้แสดงให้เห็นว่าการCOPY_ONLYสำรองข้อมูลเต็มรูปแบบไม่ได้รบกวนลูกโซ่ที่แตกต่างกัน


ฉันกำลังหาข้อมูลว่าคุณสามารถใช้บันทึกธุรกรรมเพื่อสำรองข้อมูลแบบเต็ม copy_only ได้หรือไม่ นี่เป็นข้อมูลที่ดีจริงๆ!
Brain2000

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.

การสำรองข้อมูลที่แตกต่างกันนั้นยากที่จะเข้าใจและอาจหลอกได้แม้แต่ DBA ที่มีประสบการณ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.