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