ปัญหาการสำรองข้อมูลต่างกัน - เพราะเหตุใด เป็นไปได้ไหม


13

ฉันใช้ SQL Server 2014 และนี่คือสถานการณ์:

  • ฉันมีเซิร์ฟเวอร์ A และเซิร์ฟเวอร์ B
  • ETL ข้ามคืนประมวลผลบนเซิร์ฟเวอร์ A
  • หลังจากกระบวนการโหลดเสร็จสิ้นฐานข้อมูล X จะได้รับการสำรอง (ด้วยCHECKSUMและRESTORE VERIFYONLYเพื่อให้มั่นใจในความน่าเชื่อถือ) จากนั้นจะถูกส่งไปยังเซิร์ฟเวอร์ B
  • เซิร์ฟเวอร์ B ได้รับbakไฟล์จากนั้นกู้คืนฐานข้อมูลที่นั่น

ฉันต้องการใช้กลยุทธ์การสำรองข้อมูลที่แตกต่างกันเพื่อที่:

  1. การสำรองข้อมูลทั้งหมดจะทำในวันเสาร์เท่านั้น
    เช่นการสำรองข้อมูลเต็มรูปแบบบนเซิร์ฟเวอร์ A ในวันเสาร์ -> จัดส่งไปยังเซิร์ฟเวอร์ B -> กู้คืนการสำรองข้อมูลเต็มรูปแบบบนเซิร์ฟเวอร์ B

  2. ส่วนที่เหลือของวันจะเป็นการสำรองข้อมูลที่แตกต่างกัน
    เช่นการสำรองข้อมูลที่แตกต่างกันบนเซิร์ฟเวอร์ A -> จัดส่งไปยังเซิร์ฟเวอร์ B -> เรียกคืนการสำรองข้อมูลต่างกันในเซิร์ฟเวอร์ B

ฉันได้ลองแล้ว แต่ฉันพบข้อผิดพลาดว่า:

ไม่สามารถกู้คืนบันทึกหรือการสำรองข้อมูลส่วนต่างได้เนื่องจากไม่มีไฟล์พร้อมที่จะเปิดใช้งาน

ไม่แน่ใจว่าทำไม ฉันตรวจสอบsys.database_filesบนเซิร์ฟเวอร์ A และเซิร์ฟเวอร์ B และฉันเห็นว่าdifferential_Base_LSNและdifferential_base_GUIDเหมือนกัน มีอะไรให้ตรวจสอบอีกบ้าง?

ในขั้นตอนที่ 2 ข้างต้นเมื่อฉันกู้คืนการสำรองข้อมูล diff บนเซิร์ฟเวอร์ B ฉันจำเป็นต้องกู้คืนทั้งการสำรองข้อมูลทั้งหมด + การสำรองข้อมูลต่างกันทุกครั้งหรือไม่

ฉันกู้คืนการสำรองข้อมูลส่วนต่างเท่านั้นWITH RECOVERY(และได้รับข้อความแสดงข้อผิดพลาดนั้น) เนื่องจากการสำรองข้อมูลเต็มรูปแบบได้รับการกู้คืนแล้วเมื่อวันก่อน

เพื่อชี้แจง: ใช่ฉันต้องการให้ db บนเซิร์ฟเวอร์ B อ่านได้ระหว่างดิฟเฟอเรนเชียล ฉันจะหลีกเลี่ยงสิ่งนั้นได้อย่างไร ตัวเลือกเดียวของฉันที่จะ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'

คุณสามารถคืนค่า Diffs ตามลำดับด้วย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'

และแตกต่างจากไฟล์ Log ที่น่ารำคาญคุณสามารถข้ามไปข้างหน้าเมื่อกู้คืน Diffs ได้เช่นกัน:

/*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'

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

โปรดทราบว่าเมื่อคุณกู้คืนไฟล์มันจะทำให้ผู้ใช้ปลายทางออกจากฐานข้อมูลและจะไม่รอให้การสอบถามเสร็จสิ้น

สิ่งนี้ยังทำให้ฐานข้อมูลอยู่ในสถานะอ่านอย่างเดียวไม่สามารถทำการเปลี่ยนแปลงได้ที่นี่

SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

และสุดท้ายทำความสะอาดตัวเอง

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

DROP DATABASE DiffRestoreTest

หวังว่านี่จะช่วยได้ !!

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