COPY_ONLY BACKUP Seçeneği

SQL Server 2005 ile hayatımıza girmiş olan bu özellik sistem tarafından oluşturulan LSN(Log Sequence Number) zincirini bozmadan Full veya Transaction Log Backup almamızı sağlar.

Yedekleme yapısı ilk bir Full Backup daha sonra Diffrential veya Log Backup alınarak devam eder. Alınan Backuplar en son alınan Full Backup ile ilişkili olur.

Örneğimiz üzerinden daha net açıklayarak gidelim ;

 

Örneğimize başlamadan önce aşağıda ki Demo DB ve Tablomuzu oluşturalım Scripti Run ederek.

CREATE  DATABASE [SQLTURKIYE_ExampleBackup]
GO

use [SQLTURKIYE_ExampleBackup]
Go
CREATE TABLE Deneme (ID INT IDENTITY (1,1) , Uniq_Id uniqueidentifier)
Go
INSERT INTO Deneme (Uniq_Id)
SELECT NEWID()
GO 1000

 

Bir adet Full Backup daha sonra 1 kez Diffrential Backup ve 2 kere de yapımız üzerinden T-LOG Backup almış olalım. Aldığımız her Backup kendisine en yakın Full-Backup  ‘ın LSN değerini taşır.  Aşağıda ki scripti kendi sistemimize uyarlayarak çalıştıralım.

BACKUP DATABASE [SQLTURKIYE_ExampleBackup] TO  DISK = N'C:\MSSQL\BACKUP\SQLTURKIYE_BackupExample_Full_1.bak' WITH NOFORMAT, NOINIT,  NAME = N'SQLTURKIYE_BackupExample-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO
BACKUP DATABASE [SQLTURKIYE_ExampleBackup] TO  DISK = N'C:\MSSQL\BACKUP\SQLTURKIYE_BackupExample_Diffrential_1.bak' WITH  DIFFERENTIAL , NOFORMAT, NOINIT,  NAME = N'SQLTURKIYE_BackupExample-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO
BACKUP LOG [SQLTURKIYE_ExampleBackup] TO  DISK = N'C:\MSSQL\BACKUP\SQLTURKIYE_BackupExample_TLog_1.trn' WITH NOFORMAT, NOINIT,  NAME = N'SQLTURKIYE_BackupExample-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO
BACKUP LOG [SQLTURKIYE_ExampleBackup] TO  DISK = N'C:\MSSQL\BACKUP\SQLTURKIYE_BackupExample_TLog_2.trn' WITH NOFORMAT, NOINIT,  NAME = N'SQLTURKIYE_BackupExample-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO

Backup süreçlerimiz tamamlandıktan sonra aldığımız backup ları ve aldıkları LSN leri aşağıda hazırlamış olduğum script ile görebiliriz.

SELECT  name ,
        backup_start_date ,
        type ,
        first_lsn ,
        last_lsn ,
        database_backup_lsn
FROM    msdb.dbo.backupset
WHERE   database_name = 'SQLTURKIYE_ExampleBackup';

Script Sonucu :

Type kısmında D,I ve L harflerini görmektesiniz. Bunların anlamı ;

D: Full Backup

I : Diffrential Backup

L: Log Backup    demektir.

Bunların dışında bulunan diğer Type lar ise ;

F : File or FileGroup

G : File Diffrential

P : Partial

Q : Partial Diffrential

database_backup_lsn kolonunu incelediğimizde burada ki değer en son alınmış full backup a ait LSN değerini verir. Örneğimizi inceleyecek olur isek ; aldığımız en son Full Backup ‘ın first_LSN i ‘34000000109100183’ dur. Bu değer Full Backup tan sonra alınan tüm Backup ların database_backuo_lsn  i olarak görünmektedir.

Örneklerimizi genişletelim ve bir Full, bir Diff ve bir adetde T-LOG Backup alalım.

BACKUP DATABASE [SQLTURKIYE_ExampleBackup] TO  DISK = N'C:\MSSQL\BACKUP\SQLTURKIYE_BackupExample_Full_2.bak' WITH NOFORMAT, NOINIT,  NAME = N'SQLTURKIYE_BackupExample-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO
BACKUP DATABASE [SQLTURKIYE_ExampleBackup] TO  DISK = N'C:\MSSQL\BACKUP\SQLTURKIYE_BackupExample_Diffrential_2.bak' WITH  DIFFERENTIAL , NOFORMAT, NOINIT,  NAME = N'SQLTURKIYE_BackupExample-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO
BACKUP LOG [SQLTURKIYE_ExampleBackup] TO  DISK = N'C:\MSSQL\BACKUP\SQLTURKIYE_BackupExample_TLog_3.trn' WITH NOFORMAT, NOINIT,  NAME = N'SQLTURKIYE_BackupExample-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO

Backup lardan sonra History e bakalım LSN leri incelemek için ;

SELECT  name ,
        backup_start_date ,
        type ,
        first_lsn ,
        last_lsn ,
        database_backup_lsn
FROM    msdb.dbo.backupset
WHERE   database_name = 'SQLTURKIYE_ExampleBackup';

Aşağıda ki sonuç ekranında da gördüğünüz üzere aldığımız on backuplar en son aldığımız Full Backup ‘ın LSN ini taşımakta ve bundan sonra alacağımız diğer backup larda en son aldığımız Full Backup ‘ın LSN ini taşıyor olacak.

Aldığımız Full Backup bazında DB Restore süreçlerimizi de yönetebiliriz.  İlk aldığımız Backup ın üzeirne son aldığımız T-log Backup ‘ı Restore etmeye çalışalım.

 

RESTORE DATABASE [SQLTURKIYE_ExampleBackup] FROM DISK='C:\MSSQL\BACKUP\SQLTURKIYE_BackupExample_Full_1.bak' WITH NORECOVERY, REPLACE;
RESTORE LOG [SQLTURKIYE_ExampleBackup] FROM DISK=N'C:\MSSQL\BACKUP\SQLTURKIYE_BackupExample_TLog_3.trn' WITH RECOVERY;

Processed 336 pages for database ‘SQLTURKIYE_ExampleBackup’, file ‘SQLTURKIYE_ExampleBackup’ on file 1.
Processed 5 pages for database ‘SQLTURKIYE_ExampleBackup’, file ‘SQLTURKIYE_ExampleBackup_log’ on file 1.
RESTORE DATABASE successfully processed 341 pages in 0.015 seconds (177.473 MB/sec).
Msg 4305, Level 16, State 1, Line 43
The log in this backup set begins at LSN 34000000119600001, which is too recent to apply to the database. An earlier log backup that includes LSN 34000000116700001 can be restored.
Msg 3013, Level 16, State 1, Line 43
RESTORE LOG is terminating abnormally.

Bu şekilde yukarıda ki gibi ilk Full Backup ile birlikte ikinci Full Backup tan sonra alınana Log Backup ı dönmek isteidğimizde hatalı bir durum oluşturmuş oluyoruz.

Bu süreçten sonra backuplar için başlangış noktaıs alarak ikinci Full Backup ‘ı alacağımızdan ‘SQLTURKIYE_BackupExample_Full_2’ daha önce aldığımız backup ların bir anlamı kalmamaktadır.

Amacımız önceden aldığımız Backup ‘ları geçersiz kılmak değil de sadece o anda güncel Full Backup ise SQL Server 2005 ile hayatımıza giren WITH_ COPY_ONLY özelliğidir. Bu özellik ,  Backup sıralamamaızı bozmadan Backup almamızı sağlamaktadır.

BACKUP DATABASE [SQLTURKIYE_ExampleBackup] TO  DISK = N'C:\MSSQL\BACKUP\SQLTURKIYE_BackupExample_Full_3.bak' WITH COPY_ONLY,NOFORMAT, NOINIT,  NAME = N'SQLTURKIYE_BackupExample-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO
BACKUP DATABASE [SQLTURKIYE_ExampleBackup] TO  DISK = N'C:\MSSQL\BACKUP\SQLTURKIYE_BackupExample_Diffrential_3.bak' WITH  DIFFERENTIAL ,COPY_ONLY, NOFORMAT, NOINIT,  NAME = N'SQLTURKIYE_BackupExample-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO
BACKUP LOG [SQLTURKIYE_ExampleBackup] TO  DISK = N'C:\MSSQL\BACKUP\SQLTURKIYE_BackupExample_TLog_4.trn' WITH COPY_ONLY,NOFORMAT, NOINIT,  NAME = N'SQLTURKIYE_BackupExample-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO

Yukarıda birer adet Full,Diffrential ve T-Log Backup aldık.

SELECT  name ,
        backup_start_date ,
        type ,
        first_lsn ,
        last_lsn ,
        database_backup_lsn,
		is_copy_only
FROM    msdb.dbo.backupset
WHERE   database_name = 'SQLTURKIYE_ExampleBackup';

Script sonucunu incelediğimizde Backup ın  Copy Only Backup olduğunu  is_copy_only kolonunda  görmekteyiz.

 

Kolay Gelsin.

 

Leave a Reply

Your email address will not be published. Required fields are marked *