SQL Server 2008 R2 İşlem günlükleriyle COPY_ONLY tam yedeklemeyi geri yükle


11

Biraz araştırma yaptıktan sonra bu soruya bir cevap bulamıyorum.

Arka Plan Aşağıdaki üç gereksinime uyan bir yedekleme planı oluşturmaya çalışıyorum:

  1. Her gece tam yedeklemeye sahip yedeklemelerin güvenilirliği
  2. Geri yüklenebilecek işlem günlüğü yedekleri
  3. Düşük disk alanı
  4. Bir denetim aracı için yedeklere yerel olarak erişilebilir olmalıdır

Bu ihtiyaçları karşılamak için haftalık, günlük diferansiyel ve saatlik olarak tam yedeklemeyi düşünüyorum. Daha sonra her gece saha dışına gönderilebilen bir kopya_ony yedekleme çalışır, bu yedekleme günlük zincirinin kırılmaması için yapılır ve çok fazla yerel disk alanı yemek zorunda kalmadan saha dışında güvenilir gece tam yedeklemelerine sahibiz.

Soru copy_only yedeklemesinden geri yükleme ve ardından işlem günlüklerini geri yükleme mümkün.

Sadece bir örnek vereyim, böylece neden bahsettiğimi biliyorsun.

Aşağıdaki listeyi kullanarak FullbackupCOPY_ONLYC.bak'ı ve ardından TransactionbackupG.trn, TransactionbackupH.trn, nihayet TransactionbackupI.trn'yi geri yüklemek mümkün olup olmadığını merak ediyorum.

> ---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

Belki bu kurulum makul değil SQL Server için oldukça yeni ve ben giderken öğrenmeye çalışıyorum. Herhangi bir tavsiye / yardım mutluluk duyacağız.

Yanıtlar:


14

SQL Server 2008'deki tam yedekleme, günlük zincirini bozmaz. Sadece diferansiyel taban lsn'yi sıfırlar.

Ayrıca, yalnızca bir kopyadan geri yükledikten sonra günlük yedeklemelerini geri yükleyebilirsiniz. Aşağıdaki komut dosyası bunu gösterir:

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;

Bir veritabanı ve bir tablo oluşturur ve bu tabloya 50 satır ekler. Bu kesici uçlar arasında bu sırayla birkaç yedek alınır:

  1. Tam
  2. Giriş
  3. Tam
  4. Tam Kopya_Yalnızca
  5. Giriş

Sonra veritabanı bırakılır ve şu şekilde geri yüklenir:

  1. 1. Tam
  2. 1. Günlük
  3. 2. Günlük

Aşağıda SELECTgeri yüklemenin başarılı olduğu gösterilmiştir.

Bu, ne COP_ONLYtam ne de normal bir Tam Yedeklemenin günlük zincirini bozmadığını gösterir.

Sonra veritabanı tekrar bırakılır ve şu şekilde geri yüklenir:

  1. Yalnızca Tam Kopyala
  2. 2. Günlük

Daha sonra SELECTtekrar başarı gösterir.

Bu COPY_ONLY, Günlük Geri Yükleme işleminizin temeli olarak tam bir yedeklemeyi kullanabileceğinizi gösterir .

Diferansiyel testler

Ben DIFFERENTIALde bir sürüm oluşturdum :

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;

Bu, yedekleri şu sırayla alır:

  1. 1. Tam
  2. 1. Fark
  3. 2. Tam
  4. 2. Fark
  5. Yalnızca Kopyalama
  6. 3. Fark

Daha sonra bu geri yükleme yolunu dener:

  1. 1. Tam
  2. 1. Fark
  3. 2. Fark

3. Adım bu hatayla başarısız olur:

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.

Bu, normal bir tam yedeklemenin diferansiyel zinciri kırdığını gösterir.

Sonra veritabanı bırakılır ve bu geri yükleme akışı denenir:

  1. Yalnızca Tam Kopyala
  2. 3. Fark

Adım 2, yukarıdaki adım 3 ile aynı hatayla başarısız olur. Bu, yalnızca kopya yedeklemenin diferansiyel geri yüklemenin temeli olarak kullanılamayacağını gösterir.

Sonra veritabanı yeniden bırakılır ve aşağıdaki geri yükleme yürütülür:

  1. 2. Tam
  2. 2. Fark
  3. 3. Fark

Aşağıdaki seçim, bu geri yüklemenin başarılı olduğunu kanıtlar. Bu, COPY_ONLYTam yedeklemenin diferansiyel zinciri kesintiye uğratmadığını gösterir .


Bir copy_only tam yedeklemesine bir işlem günlüğü uygulayıp uygulayamayacağınız hakkında bilgi arıyordum. Bu gerçekten iyi bir bilgi!
Brain2000

2

Farklılıklar söz konusu olduğunda şunlar olur:

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;

Tek kelimeyle: evet, COPY_ONLYdaha fazla günlük yedeklemesini geri yüklemek için bir yedek kullanabilirsiniz . Yapamayacağınız şey COPY_ONLYyedeklemeyi temel olarak kullanmaktır . Bu, geri yüklenen COPY_ONLYyedeklemedeki herhangi bir diferansiyel yedeklemeyi geri yükleyemeyeceğiniz anlamına gelir :

DROP DATABASE BakTst13;
GO
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Full_C' WITH NORECOVERY;
RESTORE DATABASE BakTst13 FROM DISK='BakTst13_Diff_2' WITH NORECOVERY;

Bunu denerseniz bir hata alırsınız:

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.

Farklı yedekleri anlamak zor olabilir ve deneyimli DBA'ları bile kandırabilir.

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.