การสำรองข้อมูลเต็มรูปแบบใน 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 แถวในตารางนั้น ในระหว่างแทรกเหล่านั้นมีการสำรองข้อมูลหลายรายการตามลำดับนี้:
- เต็ม
- เข้าสู่ระบบ
- เต็ม
- เต็ม Copy_Only
- เข้าสู่ระบบ
ถัดไปฐานข้อมูลจะถูกดร็อปและกู้คืนเช่นนี้:
- ที่ 1 เต็ม
- บันทึกที่ 1
- บันทึกที่ 2
ข้อมูลต่อไปนี้SELECT
แสดงให้เห็นว่าการกู้คืนสำเร็จแล้ว
นี่แสดงให้เห็นว่าไม่ว่าจะเป็นการCOP_ONLY
สำรองข้อมูลเต็มรูปแบบหรือปกติไม่ทำลายห่วงโซ่การบันทึก
จากนั้นฐานข้อมูลจะถูกลบอีกครั้งและเรียกคืนในลักษณะนี้:
- Copy_ เต็มเท่านั้น
- บันทึกที่ 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
- ความแตกต่างที่ 2
- Copy_Only Diff
- ความแตกต่างที่ 3
จากนั้นลองเส้นทางการคืนค่านี้:
- ที่ 1 เต็ม
- ความแตกต่างที่ 1
- ความแตกต่างที่ 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.
นี่แสดงให้เห็นว่าการสำรองข้อมูลเต็มตามปกติจะทำให้เกิดความแตกต่างของเชน
ถัดไปฐานข้อมูลจะถูกดร็อปและพยายามเรียกคืนโฟลว์นี้:
- Copy_ เต็มเท่านั้น
- ความแตกต่างที่ 3
ขั้นตอนที่ 2 ล้มเหลวด้วยข้อผิดพลาดเดียวกับขั้นตอนที่ 3 ด้านบน นี่แสดงให้เห็นว่าไม่สามารถใช้สำเนาสำรองเท่านั้นเป็นฐานสำหรับการกู้คืนส่วนต่างได้
จากนั้นฐานข้อมูลจะถูกดร็อปอีกครั้งและดำเนินการกู้คืนต่อไปนี้:
- เต็ม 2
- ความแตกต่างที่ 2
- ความแตกต่างที่ 3
ตัวเลือกต่อไปนี้พิสูจน์ว่าการกู้คืนนี้สำเร็จ สิ่งนี้แสดงให้เห็นว่าการCOPY_ONLY
สำรองข้อมูลเต็มรูปแบบไม่ได้รบกวนลูกโซ่ที่แตกต่างกัน