Diferansiyel Yedekleme Sorunu - Neden? Mümkün mü?


13

SQL Server 2014 kullanıyorum ve durum şu:

  • A sunucum ve B sunucum var.
  • Gecelik ETL, sunucu A'da işlenir.
  • Yükleme işlemi tamamlandıktan sonra, veritabanı X yedeklenir ( CHECKSUMve RESTORE VERIFYONLYgüvenilirliği sağlamak için ve ile) ve sonra B sunucusuna gönderilir.
  • Sunucu B bakdosyayı alır ve veritabanını oraya geri yükler.

Farklı yedekleme stratejisi kullanmak istiyorum ki:

  1. Tam yedekleme yalnızca Cumartesi günü yapılır,
    yani Cumartesi günü A sunucusunda tam yedekleme -> B sunucusuna gönder -> B sunucusunda tam yedeklemeyi geri yükle

  2. Günlerin geri kalanı diferansiyel yedekleme olacaktır,
    yani sunucu A'daki diferansiyel yedekleme -> sunucu B'ye gönder -> Sunucu B'deki diferansiyel yedeği geri yükleme

Denedim ama bir hata alıyorum:

hiçbir dosya aktarmaya hazır olmadığından günlük veya diferansiyel yedeklemesi geri yüklenemez.

Emin değilim neden. Kontrol ettim sys.database_filessunucu A ve sunucu B ve görüyorum ki olabilir differential_Base_LSNve differential_base_GUIDaynıdır. Kontrol edilecek başka bir yer var mı?

Bu arada, yukarıdaki 2. adımda, sunucu B'deki diff yedeklemesini geri yüklediğimde, her zaman hem Tam yedeklemeyi hem de diferansiyel yedeklemeyi geri yüklemem gerekir mi?

WITH RECOVERYTam yedekleme bir gün önce geri yüklendiğinden, yalnızca diferansiyel yedeklemeyi geri yükledim (ve bu hata mesajını aldım).

Açıklığa kavuşturmak için: Evet, B sunucusundaki db'nin diferansiyeller arasında okunabilir olmasını istiyorum. Bunu nasıl başarabilirim? Her gece RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)kombo dizilim için tek seçeneğim mi?

Herhangi bir rehberlik çok takdir edilecektir.

Yanıtlar:


15

Burada uğraşmanıza gerek yok RECOVERYve NORECOVERYburada tek ihtiyacınız olan STANDBYseçenek. İşte nasıl kullanılacağına dair hızlı bir demo.

Bir veritabanı oluşturun, basit kurtarmaya ayarlayın ve bir tablo oluşturun.

Veri ekleyin, bazı farklar alın.

Eğlenceli, değil mi?

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

Evet, yalan söyledim. Bu sıkıcı kısım.

Tam yedeklemenizi şu şekilde geri yükleyebilirsiniz 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'

Farklılıkları şu sırayla geri yükleyebilirsiniz 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'

Ve bu sinir bozucu Günlük dosyalarının aksine, Farkları geri yüklerken de atlayabilirsiniz:

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

Okunabilirliği test etmek istiyorsanız, bunu geri yükleme komutları arasında çalıştırın. Her biriyle kimliklerin arttığını görmelisiniz. Eğer yapmazsan, korkunç bir şekilde yanlış bir şey yaptın.

Dosyaları geri yüklediğinizde, son kullanıcıları veritabanından çıkartacağını ve sorgularının bitmesini beklemeyeceğini unutmayın.

Bu aynı zamanda veritabanını salt okunur durumda bırakır, burada hiçbir değişiklik yapılamaz.

SELECT * 
FROM DiffRestoreTest.dbo.t1 AS t

Ve son olarak, kendinizden sonra temizleyin.

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

DROP DATABASE DiffRestoreTest

Bu yardımcı olur umarım!!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.