SQL Server 2005 - Hızlı El Kitabı
Skip Navigation Links.

BACK UP,RESTORE

Sürekli değişen bir veri tabanı ile çalışıyor isek ve bir gün veri tabanımızın bolzulma imkanı var ise verilerimizi bir yerde yedeklemek çok anlamlıdır.Veri tabanı üzerinde backup işlemi yaparak,herhangi bir olası veri tabanı bozulması durumunda,bu backup’ı kullanarak(resore ederek) o an ki verilerimize ulaşabiliriz.

 

Bir kullanıcının veri tabanı üzerinde backup yapabilmesi için kullanıcıya db_backupoperator rolüne dahil etmemiz yeterli olacaktır.

 

Full BackUp

 

Full back up’da bütün veriler extent extent sırasıyla kopyalanır.

 

BACKUP DATABASE [database name] TO DISK ['\directory\filename'] WITH INIT

 

 

INIT : Eğer daha öncesinde bir kopyası alındı ve böyle bir dosya var ise,üzerine yazılır.

 

 

Differential Backup

 

Differential backup yapılabilmesi için öncelikle full back up yapılması gerekmektedir.Saat 6’da full backup yaptım ve 4 saatte bir differential back up yapıyor isem;

 

6’da bütün verilerin kopyası elde edilir.

10’da ise,6’dan itibaren değişen extend’ler var ise onlar yenileriyle değiştirilir.

14’de ise,6’dan itibaren değişen extend’ler var ise onlar yenileriyle değiştirilir.

18’de ise, 6’dan itibaren değişen extend’ler var ise onlar yenileriyle değiştirilir.

 

Yani en son full backup’dan sonra değişen bir şeyler var ise,yeni extent’ler kopyalanır.

 

BACKUP DATABASE [database name] TO DISK ['\directory\filename'] WITH DIFFERENTIAL

 

 

Differential backup,eğer full backup yapılır ise gerçekleştirilebileceğini söylemiştik.Diffrential backup’da her bir extent’in değişip değişmediği kontrol edilir.veri tabanı, her bir extent’in durumunu tutmak için 1 veya 0 kullanır.Eğer Full backup alınırsa her bir extent için değer 0 olarak ayarlanır.Yani hiç birinde değişiklik yok denir.Daha sonra bu extent’ler üzerinde bir değişiklik olduğunda bu bit değeri 1 olarak ayarlanır.Ardından Differential back up alınmak istendiğinde,hangi extent’in durumu 1 ise o extent yenisiyle değiştirilir.Bir Data Page boyutu 8 KB olduğundan ve 8 KB’da 8192 bit olduğundan,aslında bir Data Page kullanarak 8192 extent’in durumu tutulmuş oluyor.

 

Transaction Log Backup

 

Transaction Log Backup,Veri tabanının Recovery modu Full veya Bulk-Logged olduğu durumlarda alınabilmektedir.Eğer Transaction Log backup gerçekleştirmek istiyor iseniz,öncelikle Full backup alınmalı ardından Transaction Log backup alınmalıdır.

 

BACKUP LOG [database name] TO DISK ['\directory\filename'] WITH INIT

 

 

Transaction Log backup’da bir önceki backup’da Log Sequence Number(LSN) nerede kalmış ise oradan başlanır ve açık bir transaction görene kadar devam eder.Açık bir transaction gördüğünde ise backup işlemi tamamlanır.

 

Filegroup Backup

 

Filegroup backup’da veri tabanının tamamını değilde sadece beliritlen filegroup içerisinde giren verilerin backup’ı alınır.

 

BACKUP DATABASE [database name] FILEGROUP=[filegroupname] TO DISK ['\directory\filename']

 

 

Differential backup’da olduğu gibi,filegroup’lar üzerinde de differential backup uygulabailir.

 

 

BACKUP DATABASE [database name] FILEGROUP=[filegroupname] TO DISK ['\directory\filename'] WITH DIFFERENTIAL

 

 

Mirrored Backups

 

Şimdiye kadar gördüğümüz backup’lar aynı anda sadece bir tane kopya işlemi yapmaktaydı.SQL Server 2005 ile birlikte aynı anda en fazla 4 olmak şartıyla birden fazla kopyalama işlemi yapabiliyoruz.Yalnız yapılan bütün kopyalamalarda,kopyalanan yerin türü aynı olmalıdır.DISK’e kopyalanayorsa, hepsi DISK olmalıdır.TAPE ise hepsi TAPE olmalıdır gibi.

 

AdventureWorks veri tabanının 4 kopyasını alalım;

 

BACKUP DATABASE AdventureWorks TO DISK='C:\Backup\AW.bak'

            MIRROR TO DISK='\\Server1\Backup\AWMirror1.bak'

            MIRROR TO DISK='\\Server2\Backup\AWMirror2.bak'

            MIRROR TO DISK='\\Server3\Backup\AWMirror3.bak'

WITH FORMAT

 

   

FORMAT: belirtilen yerdeki header’ı siler,daha önce alınmış olan backupları geçerisiz kılar.

 

 

Partial Backup

 

Read only olarak ayarlanmış filegroup’ların backup’ının alınması anlamsızdır.Bunu engellemek adına,read only olan filegroup’ların backup’ını alma demek için şu komutu kullanıyoruz;

 

BACKUP DATABASE AdventureWorks READ_WRITE_FILEGROUPS TO DISK='C:\Backup\AW.bak'

 

 

  ÖRNEK : AdventureWorks veri tabanı için sırasıyla full/differential/transaction log backup alalım

 

Product tablosunda;

 

-- ilk backup aliniyor,orjinal degerler tutuluyor

BACKUP DATABASE AdventureWorks TO DISK='C:\Data\AW.BAK'

 

-- Daha sonra butun urunlerin ListPrice degerini 100 yapiyorum

UPDATE Production.Product SET ListPrice=100

 

-- Transaction log dosyasinin backup'ini aliyorum.ListPrice=100 diye –

-- yaptığım değişiklik bu log dosyslarında tutuluyor.

BACKUP LOG AdventureWorks TO DISK='C:\Data\AW1.TRN'

 

-- Daha sonra butun urunlerin ListPrice degerini bu sefer 200 yapiyorum

UPDATE Production.Product SET ListPrice=200

 

-- Son fullback’tan sonraki değişiklikleri AWDIFF1.BAK içerisinde

-- tutuyorum.Yani bu backup içerisinde ListPrice’lar 200 olarak duruyor.

BACKUP DATABASE AdventureWorks TO DISK='C:\Data\AWDIFF1.BAK' WITH DIFFERENTIAL

 

-- ListPrice’ı 300 yapıyorum

UPDATE Production.Product SET ListPrice=300

 

-- Tekrar logun backup’ını alıyorum

BACKUP LOG AdventureWorks TO DISK='C:\Data\AW2.TRN'

 

 

Not: 6 Kasımda veri tabanımın full backup‘ını aldıktan sonra her gün sırasıyla differential backup alıyorum.Dolayısıla 10 kasıma geldiğimde elimde bir tane full backup bir tanede differential backup olacaktır.10 kasımda sistemde bir arıza oldu ve veri tabanını kaybettik.Backup dosyalarını kullanarak 9 kasımdaki verileri elde edebiliriz.Bunun için öncelikle Full backup’ı restore edip ardından 9 kasımdaki differential backup’ı restore etmem gerekecektir.

 

 

Recovery Models

 

Simple Recovery: Eğer veri tabanı recovery modu Simple olarak ayarlandı ise Transaction Log minimum düzeyde tutulur.Yapılan değişiklikle log dosyasında tutulmaz.Dolayısıyla bir backup dosyasını alıp,Log backup’ıde bu verilerin üstüne uygulayamazsınız.Eğer veri tabanınızın recovery modunu Simple olarak ayarladı iseniz,ve sistemde bir hata oluşur ise,bu durumda sadece en son aldığınız backup’a göre verileri elde edersiniz.

 

Simple recovery modunda Transaction Log Backup alamazsınız.Sadece full ve differential backup alabilirsiniz.Dolayısıyla sistemde oluşabilecek hataları düşünerek çok kısa aralıklarla backup almamalısınız ki performans düşmesin,çok uzun aralıklarla da backup almamalısınız,çünkü elinizde transaction log yoktur,dolayısıyla sistemin arıza vermesi durumunda çok gerilerdeki verileri elde edebilirsiniz.

 

Full Recovery: Bu modelde,bütün işlemler transaction log’da tutulur.Bit hata durumunda öncelikle Full backup dosyası restore edilir ve transaction log back’ı restore edilip beliritlen zamana göre recovery yapılır.verileri belirtilen bir zamana döndürmek bu modelde mümkündür.

 

Bulk-Load: Full Recovery modu gibidir fakat BULK LOAD işlemlerinde log tutma işlemi minimum düzeyde yapılır.BULK LOAD işlemi sırasında gerçekleşen bütün işlemleri adım adım tutmaz.Dolayısıyla BULK LOAD işleminin tamamı bir işlemdir.Herhangi bir hata durumunda beliritlen bir zamana dönmek zordur.Transaction log dosyası BULK LOAD işlemlerinde her bir işlemi tek tek tutmadığı için öncelikle Full back dosyası var ise o restore edilir,ardından varsa differential backup dosyası restore edilir ve son transaction backup dosyası restore ve recovery edilir.

Sistemde bir hata oluştuğu zaman, son ana geri dönebilmek için,sistemin transaction log backup’ı alınmalıdır.Yalnız bu backup’ın alınabilmesi için data file’larda bir problem olmaması gerekir. Dediğimiz gibi BULK LOAD işlemleri için tek tek log tutulmuyordu.Dolayısıyla son olarak bir transaction log backup’ı alınamıyorsa,verilerimizin son durumunu elde edemeyiz.

 

Yukarıda backup’ını aldığımız AdventureWorks veri tabanında bir hata oluştutuğnu varsayalım ve restore,recovery işlemlerini yapalım.

 

İlk haline dönmek için;

 

RESTORE DATABASE AdventureWorks FROM DISK='C:\Data\AW.BAK' WITH RECOVERY

 

 

RECOVERY dediğimizde veri tabanı çalışmaya başlar,bağlantılar yapılabilir,yani normal çalışmasını sürdürür.Fakat NORECOVERY olarak belirler isem bu durumda veri tabanının durumu Restoring’dir ve dışarıya kapalıdır,kullanılamaz.

 

ListPrice 100 olduğu duruma geri dönmek için;

 

RESTORE DATABASE AdventureWorks FROM DISK='C:\Data\AW.BAK' WITH NORECOVERY

RESTORE LOG AdventureWorks FROM DISK='C:\Data\AW1.TRN' WITH RECOVERY

 

 

ListPrice’ın 200 olduğu duruma dönmek için; differential bir backup’ı restore edebiliriz.Differential backup,full backup’ın üstüne kurulmalıdır ve Full back’ı NORECOVERY pozisyonunda almak gerekir.

 

RESTORE DATABASE AdventureWorks FROM DISK='C:\Data\AW.BAK' WITH NORECOVERY

RESTORE DATABASE AdventureWorks FROM DISK='C:\Data\AWDIFF1.BAK' WITH RECOVERY

 

 

ListPrice’ın 300 olduğu duruma dönmek için;

 

RESTORE DATABASE AdventureWorks FROM DISK='C:\Data\AW.BAK' WITH NORECOVERY

RESTORE DATABASE AdventureWorks FROM DISK='C:\Data\AWDIFF1.BAK' WITH NORECOVERY

RESTORE LOG AdventureWorks FROM DISK='C:\Data\AW2.TRN' WITH RECOVERY

 

 

Validating Backup

 

Alınan bir backup’ın doğru olup olmadığını test etmek için aşağıdaki komutu kullanabiliriz;

 

RESTORE VERIFYONLY FROM DISK='C:\Data\AW.BAK'