Masalah Cadangan Diferensial - Mengapa? Apakah ini Mungkin?

13

Saya menggunakan SQL Server 2014 dan ini situasinya:

  • Saya memiliki server A dan server B.
  • ETL Overnight diproses di server A.
  • Setelah proses pemuatan selesai, database X akan didukung (dengan CHECKSUMdan RESTORE VERIFYONLYuntuk memastikan keandalan) dan kemudian dikirim ke server B.
  • Server B menerima bakfile dan kemudian mengembalikan database di sana.

Saya ingin menggunakan strategi cadangan diferensial sehingga:

  1. Cadangan penuh hanya dilakukan pada hari Sabtu
    yaitu Cadangan penuh pada server A pada hari Sabtu -> kirim ke server B -> Kembalikan cadangan penuh pada server B

  2. Sisa hari akan menjadi cadangan diferensial,
    yaitu cadangan diferensial di server A -> kirim ke server B -> Kembalikan cadangan diferensial di server B

Saya sudah mencoba tetapi saya mendapat kesalahan, mengatakan:

log atau cadangan diferensial tidak dapat dipulihkan karena tidak ada file yang siap bergulir ke depan.

Tidak yakin kenapa. Saya memeriksa sys.database_filesserver A dan server B, dan saya bisa melihat bahwa differential_Base_LSNdan differential_base_GUIDitu sama. Ada tempat lain untuk diperiksa?

Ngomong-ngomong, pada langkah 2 di atas, ketika saya memulihkan cadangan berbeda pada server B, apakah saya selalu perlu mengembalikan kedua cadangan Lengkap + cadangan diferensial setiap kali?

Saya hanya mengembalikan cadangan diferensial WITH RECOVERY(dan menerima pesan kesalahan itu) karena cadangan lengkap telah dipulihkan sehari sebelumnya.

Untuk memperjelas: Ya, saya ingin db di server B dapat dibaca di antara perbedaan. Bagaimana saya bisa mengatasi itu? Apakah satu-satunya pilihan saya untuk RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)mengkombinasikan urutan setiap malam?

Bimbingan apa pun akan sangat dihargai.

saya tidak tahu apa apa
sumber

Jawaban:

15

Anda tidak perlu dipusingkan RECOVERYdan di NORECOVERYsini, yang Anda butuhkan adalah STANDBYpilihan. Berikut ini demo singkat tentang cara menggunakannya.

Buat database, atur ke pemulihan sederhana, dan buat tabel.

Masukkan data, ambil beberapa diff.

Menyenangkan bukan?

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

Ya, saya berbohong. Itu bagian yang membosankan.

Anda dapat mengembalikan cadangan lengkap Anda di 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'

Anda dapat memulihkan Diffs dengan 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'

Dan tidak seperti file-file Log sial itu, Anda dapat langsung beralih ketika mengembalikan 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'

Jika Anda ingin menguji keterbacaan, jalankan ini di antara mengembalikan perintah. Anda harus melihat peningkatan ID masing-masing. Jika tidak, Anda melakukan sesuatu yang sangat salah.

Perlu diingat bahwa ketika Anda mengembalikan file, itu akan menendang pengguna akhir dari database, dan itu tidak akan menunggu pertanyaan mereka selesai.

Ini juga membuat database dalam status hanya baca, tidak ada perubahan yang dapat dilakukan di sini.

SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

Dan akhirnya, bersihkan dirimu.

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

DROP DATABASE DiffRestoreTest

Semoga ini membantu!!

Erik Darling
sumber