SQL Server’de yedekleme ve geri yükleme – II (RESTORE)

Veri tabanlarını Yeniden Kurma(RECOVERY işlemi)
Önceki yazıda yedekleme stratejilerinden ve backup işlemlerinin nasıl yapılacağından bahsettik. Şimdi bu yedekleri sistem çöktüğü zaman veya herhangi bir durumda nasıl kullanacağımızı, bunları kullanarak nasıl bir geri yükleme yapacağımızı işleyeceğiz. Alınmış yedeklerden veri tabanını ayağa kaldırmadan önce elimizdeki yedek dosyalarının doğruluğundan, formatından emin olmalıyız. Bu işlem için Management Studio kullanılabildiği gibi aşağıdaki T-SQL komutları da kullanılabilir.
1 – RESTORE HEADERONLY : Alınmış olan yedeğin header bilgilerini listeler. Aynı yedek dosyası veya aygıtında birden fazla yedek varsa hepsinin header bilgisi listelenir. Header bilgisi, veri tabanı adını, yedek dosyasının adını, yedekleme ortamının tipini(disk, type), yedekleme metodunu(full database, Differential, transaction log), yedekleme tarihini, yedek boyutunu, LSN numaralarını, Collation gibi birçok bilgiyi içerir.

RESTORE HEADERONLY FROM disk='C:\Deneme.bak'

2 – RESTORE FILELISTONLY : Backup dosyasında bulunan orjinal veritabanı ve transaction log dosyaları hakkındaki bilgileri döndürür. Böylece o yedek aygıtı veya dosyası içerisinde hangi veri tabanının yedeğinin bulunduğunu öğrenmiş olur yanlış yedek dosyalarını restore etmemiş oluruz.

RESTORE FILELISTONLY FROM disk='C:\Deneme.bak'

3 – RESTORE LABELONLY : Yedek dosyasının tutulduğu yedekleme ortamı hakkynda bilgiyi döndürür.

RESTORE LABELONLY FROM disk='C:\Deneme.bak'

4 – RESTORE VERIFYONLY : Yedekleme işleminin doğru yapılıp yapılmadığını, yedek dosyasının geçerli bir backup dosyası olup olmadığını, sistem tarafından okunabilir olup olmadığını kontrol eder. Eğer dosya, SQL Server tarafından uygunsa “The backup set on file X is valid.” mesajı döner.

RESTORE VERIFYONLY FROM disk='C:\Deneme.bak'

Bu komutları çalıştırarak hem yedek dosyasının doğruluğunu denetlemiş olur hem de yedeği restore ettiğimizde karşımızda ne tür özellik ve seçeneklere sahip bir veri tabanının çıkacağını öğrenmiş oluruz.
Elimizdeki backup dosyalarının doğruluğunu denetledikten sonra tavsiye edilen diğer adımlar, kullanıcıların veri tabanına erişmesini kısıtlamak için “dbo use only” seçeneği aktifleştirilmesi ve istenmeyen bir durumda geri dönülmek üzere güncel bir log backup’ın alınmasıdır.
RESTORE Komutu
SQL Server üzerinde backup’lardan geri dönme için RESTORE komutu kullanılır. Bu komutla birlikte RECOVERY veya NORECOVERY veya STANDBY parametreleri kullanılır. Default seçenek olarak RECOVERY seçeneğinde restore işlemi son transaction log ile birlikte gerçekleştirilir. Yazının başında alttığımız gibi SQL Server, transaction logdaki onaylanmamış işlemleri geri döndürür ve onaylanmış işlemleri ileri gönderir. Eğer full backup’tan sonra elimizde restor edilmeyi bekleyen bir Differential backup veya log backup varsa bu seçeneği kullanmamalıyız. Böyle bir durum için NORECOVERY seçeneği tercih edilmelidir. Bu seçenek, çoklu yedek dosyalasının restore edileceği anlamına gelir. NORECOVERY seçeneği son yedek hariç bütün yedekler için kullanılır. STANDBY parametresi, NORECOVERY seçeneğine alternatif olarak kullanılır. Veri tabanını NORECOVERY ile restor ettiğimizde veri tabanı, “Restoring” moduna girer bu durumda kullanıcılar veri tabanına erişemez, veri tabanı üzerinde herhangi bir sorgulama yapılamaz. STANDBY seçeneğindeyse kullanıcıların yalnızca veri çekmelerine(SELECT) izin verilmez.
Aynı yedek dosyası veya aygıtı içerisinden birden fazla yedek dosyası varsa bunları FILE parametresi verilerek seçilir.
Elimizdeki yedekleri farklı bir sunucu veya disk pathine restore etmek için MOVE TO parametresi kullanılır.
RESTORE komutuyla birlikte kullanılan diğer parametre REPLACE parametresidir. Veri tabanı yedek dosyasının, varolan veri tabanının üzerine yazılması, onun yerini alması için kullanılır.
Aşağıdaki örnekte daha önce aldığımız full backup’ı restore etmeye çalışalım.

RESTORE DATABASE Deneme
FROM DISK = N'C:\Deneme.bak'

Bu komut sonrası SQL Server 2005’te The tail of the log for the database “Deneme” has not been backed up. Use BACKUP LOG WITH NORECOVERY to backup the log if it contains work you do not want to lose. Use the WITH REPLACE or WITH STOPAT clause of the RESTORE statement to just overwrite the contents of the log. hata mesajıyla karşılaşırız. Bu özellik, SQL Server 2005 ile birlikte gelmiş olup elimizdeki yedek dosyasının restore etmeye çalıştığımız güncel veri tabanından daha eski olduğunu konusunda bizi uyarmaktadır. Son yedekten bu yana yapılan değişiklikleri kaybetmemek için bir log backup almamız istenmektedir(Tail log backup). Bunun için ya NO_TRUNCATE ve NORECOVERY parametrelerini kullanarak güncel bir log backup alacağız ya da REPLACE komutuyla güncel veri tabanının üzerine yazacağız. Şimdi bu adımları tek tek gerçekleştirelim. Öncelikle veri tabanının güncel log backup’ını alalım.

--Database erişiliyorsa
BACKUP LOG Deneme TO DISK = 'C:\DenemeLog.bak'
WITH NORECOVERY;
GO
--Database erişilmez durumdaysa
BACKUP LOG Deneme TO DISK = 'C:\DenemeLog.bak'
WITH NO_TRUNCATE;

Ardından elimizdeki güncel full backup’ı restore ediyoruz. Full backup’tan sonra aldığımız güncel log backup’ı da restore edeceğimiz için NORECOVERY parametresini kullanıyoruz.

--En güncel full backup'ı restore et
RESTORE DATABASE Deneme
	FROM DISK = 'C:\DenemeFull.bak'
	WITH FILE=1, NORECOVERY;

Eğer elimizde bir de differential backup varsa onu da restore ediyoruz. Eğer differential backup yoksa bu adımı geçebiliriz.

--En günce differential backup'ı restore et
RESTORE DATABASE Deneme
	FROM DISK = 'C:\DenemeDiff.bak'
	WITH FILE=1,
	NORECOVERY;

Bu adımdan sonra eğer elimizde birden fazla log backup varsa onları da WITH NORECOVERY parametresiyle sırasıyla restore ediyoruz. Hatta en son log dosyasında belli bir ana dönmek için de aşağıda vereceğimiz parametreleri girebiliriz.

--En günce differential backup'ı restore et
RESTORE DATABASE Deneme
	FROM DISK = 'C:\DenemeLog1.bak'
	WITH FILE=1,
	NORECOVERY;

Bu aşamaya kadar veri tabanı kullanıcılar tarafından erişilemez çünkü hala restoring modundadır. Bütün transaction logları restore ettikten sonra veri tabanını kullanıma açmak için aşağıdaki satırı yazalım.

RESTORE DATABASE Deneme WITH RECOVERY;

Veya ilk başta yaptığımız güncel log backup alınmaz. Full backup var olan veri tabanının üzerine yazılır.

RESTORE DATABASE Deneme
	FROM DISK = N'C:\Deneme.bak' WITH REPLACE

En son güncel log backup kullanılarak yedek dosyasını tümüyle restore etmek yerine belli bir tarihe kadar restore edilmesi için STOPAT parametresi kullanılır. Aşağıdaki örnekte log dosyasındaki 10 Haziran’a kadarki işlemlerin restore edilmesi istenmiştir.

RESTORE LOG Deneme
FROM DISK = 'C:\DenemeLog.bak'
WITH FILE = 1
	RECOVERY
	STOPAT = 'June 10, 2007 1:00'

Elimizdeki yedek dosyasını var olan veri tabanı üzerinde değil de başka bir veri tabanı olarak restore etmek için WITH MOVE parametresi kulanılır.

RESTORE DATABASE Deneme1
	FROM DISK = 'C:\DenemeFull.bak'
	WITH MOVE 'Deneme' TO 'C:\Deneme1.mdf',
	MOVE 'Deneme_log' TO 'C:\Deneme1.ldf',
	REPLACE

Buradaki Deneme ve Deneme_log yedek dosyalarındaki data dosyalarının mantıksal ismidir. Bunu öğrenmek için de aşağıdaki satır kullanılır.

RESTORE FILELISTONLY FROM DISK = 'C:\DenemeFull.bak'

COPY_ONLY Seçeneği
SQL Server 2005 ile birlikte gelmiş olan bu özellik sistem tarafından oluşturulan LSN zincirini(sağladığımız düzenli backup alma sistemini) bozmadan full database veya transaction log backup almayı sağlar. Bilindiği gibi yedekler senaryolarında ilk önce full backup alınır ve ardından Differential veya Log backup alınır. Alınan backuplar en son alınmış full backup ile ilişkili olur. Belli aralıklarla aşağıdaki şekilde backuplar aldığımız düşünelim.

USE master
GO
BACKUP DATABASE Deneme TO DISK='C:\Dnm_Full1.BAK'
	WITH INIT, NAME='Dnm_Full1'
GO
UPDATE Deneme..Musteri SET AdSoyad='A' WHERE MusteriId=1
GO
BACKUP DATABASE Deneme TO DISK='C:\Dnm_Diff1.BAK'
	WITH DIFFERENTIAL, INIT, NAME='Dnm_Diff1'
GO
UPDATE Deneme..Musteri SET AdSoyad='B' WHERE MusteriId=1
GO
BACKUP DATABASE Deneme TO DISK='C:\Dnm_Diff2.BAK'
	WITH DIFFERENTIAL, INIT, NAME='Dnm_Diff2'
GO
UPDATE Deneme..Musteri SET AdSoyad='C' WHERE MusteriId=1
GO
BACKUP LOG Deneme TO DISK='C:\Dnm_Log1.BAK'
	WITH INIT, NAME='Dnm_Log1'
GO
UPDATE Deneme..Musteri SET AdSoyad='D' WHERE MusteriId=1
GO
BACKUP LOG Deneme TO DISK='C:\Dnm_Log2.BAK'
	WITH INIT, NAME='Dnm_Log2'
GO

Burada görüldüğü gibi ilk önce bir full backup ardından 2 kez differential backup ve son olarak 2 log backup alınmış ve her backup aralığında database üzerinde değişiklik yapılmış. Alınan her backup kendisine en yakın full backup’ın LSN(log sequence number) değerini de taşır. msdb.dbo.backupset tablosundan alınmış olan backupların LSN aralıklarına bakalım.

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


Buradaki type kolonu, alınan yedek dosyasının türünü belirtir. Aşağıdaki değerleri alabilir:
D = Database
I = Database Differential
L = Log
F = File or Filegroup
G = File Differential
P = Partial
Q = Partial Differential
database_backup_lsn kolonu en son alınmış full backup’a ait database_backup_lsn LSN değerini berir.
Şekilde görüldüğü gibi en son alınmış olan full backup’ın ilk LSN değeri “21000000008000159¨ değerine sahip. Ondan sonra alınmış tüm backupların database_backup_lsn kolunu bu değeri göstermektedir.
Şimdi aynı şekilde en sonki log backuptan sonra bir full backup daha alalım ve ardından birer tane Differential ve Log backup alalım.

--Yeni bir full backup alalım
BACKUP DATABASE Deneme TO DISK='C:\Dnm_Full2.BAK'
	WITH INIT, NAME='Dnm_Full2'
GO
UPDATE Deneme..Musteri SET AdSoyad='E' WHERE MusteriId=1
GO
BACKUP DATABASE Deneme TO DISK='C:\Dnm_Diff3.BAK'
	WITH DIFFERENTIAL, INIT, NAME='Dnm_Diff3'
GO
UPDATE Deneme..Musteri SET AdSoyad='F' WHERE MusteriId=1
GO
BACKUP LOG Deneme TO DISK='C:\Dnm_Log3.BAK'
	WITH INIT, NAME='Dnm_Log3'


Görüldüğü gibi son alınan backuplar daha önce alınmış full backup’ı(Dnm_Full1) değil en son alınmış full backup’ı referans aldılar(Dnm_Full2). Bundan sonra alınacak tüm backuplar, Dnm_Full2 isimli full backup’a bağlı olacaktır. Bu durumda recovery işlemini de aldığımız full backup bazında yapabiliriz.

RESTORE DATABASE Deneme FROM DISK='C:\Dnm_Full1.BAK' WITH NORECOVERY, REPLACE
RESTORE LOG Deneme FROM DISK='C:\Dnm_Log1.BAK' WITH NORECOVERY
RESTORE LOG Deneme FROM DISK='C:\Dnm_Log2.BAK' WITH RECOVERY 

Eğer Dnm_Full1 ile birlikte ikinci full backuptan sonra alınmış olan Dnm_Log3 dosyasını kullanmak istersek hatalı bir durum oluşmuş olur.

RESTORE DATABASE Deneme FROM DISK='C:\Dnm_Full1.BAK' WITH NORECOVERY, REPLACE
--RESTORE LOG Deneme FROM DISK='C:\Dnm_Log1.BAK' WITH NORECOVERY
RESTORE LOG Deneme FROM DISK='C:\Dnm_Log3.BAK' WITH RECOVERY 

Processed 176 pages for database 'Deneme', file 'Deneme' on file 1.
Processed 5 pages for database 'Deneme', file 'Deneme_log' on file 1.
RESTORE DATABASE successfully processed 181 pages in 0.097 seconds (15.222 MB/sec).
Msg 4305, Level 16, State 1, Line 3
The log in this backup set begins at LSN 21000000017100001, which is too recent to apply to the database. An earlier log backup that includes LSN 21000000014800001 can be restored.
Msg 3013, Level 16, State 1, Line 3
RESTORE LOG is terminating abnormally.

Eğer gerçekten bundan sonraki backuplar için başlangıç noktası olarak Dnm_Full2’yi alacaksak daha önce aldığımız Dnm_Full1, Dnm_Diff1, Dnm_Diff2, Dnm_Log1 ve Dnm_Log2 backuplarının bir anlamı kalmamaktadır. Peki amacımız daha önce aldığımız backupları geçersiz kılmak değil de sadece o anda güncel bir full backup’a ihtiyacımız olursa ne yapacağız. İşte bunun için SQL Server 2005 WITH COPY_ONLY seçeneğini sunmaktadır. WITH COPY_ONLY seçeneği, backup alma düzenimizi bozmayacak şekilde backup aldırır.

USE master
GO
BACKUP DATABASE Deneme TO DISK='C:\Dnm_Full1.BAK'
	WITH INIT, NAME='Dnm_Full1'
GO
BACKUP DATABASE Deneme TO DISK='C:\Dnm_Diff1.BAK'
	WITH DIFFERENTIAL, INIT, NAME='Dnm_Diff1'
GO
BACKUP DATABASE Deneme TO DISK='C:\Dnm_Diff2.BAK'
	WITH DIFFERENTIAL, INIT, NAME='Dnm_Diff2'
GO
BACKUP LOG Deneme TO DISK='C:\Dnm_Log1.BAK'
	WITH INIT, NAME='Dnm_Log1'
GO
BACKUP LOG Deneme TO DISK='C:\Dnm_Log2.BAK'
	WITH INIT, NAME='Dnm_Log2'
GO
--Yeni bir full backup alalım
BACKUP DATABASE Deneme TO DISK='C:\Dnm_Full2.BAK'
	WITH INIT, COPY_ONLY, NAME='Dnm_Full2'
GO
BACKUP DATABASE Deneme TO DISK='C:\Dnm_Diff3.BAK'
	WITH DIFFERENTIAL,COPY_ONLY, INIT, NAME='Dnm_Diff3'
GO
BACKUP LOG Deneme TO DISK='C:\Dnm_Log3.BAK'
	WITH INIT,COPY_ONLY, NAME='Dnm_Log3'
GO
--Normal bir Log backup alalım
BACKUP LOG Deneme TO DISK='C:\Dnm_Log4.BAK'
	WITH INIT, NAME='Dnm_Log4'

Aynı şekilde tekrar msdb.dbo.backupset tablosunu sorgulayalım. Bu arada tablodaki is_copy_only kolonunu da okuyalım.

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


Görüldüğü gibi ikinci full backup’tan sonraki backup’ların Bu durumda aşağıdaki gibi recovery işlemlerinde bulunabiliriz.

RESTORE DATABASE Deneme FROM DISK='C:\Dnm_Full1.BAK' WITH NORECOVERY, REPLACE
RESTORE LOG Deneme FROM DISK='C:\Dnm_Log1.BAK' WITH NORECOVERY
RESTORE LOG Deneme FROM DISK='C:\Dnm_Log4.BAK' WITH RECOVERY 

Copy-only seçeneğinin kullanıldığı differential backup recovery amaçlı kullanılamaz.

--BAŞARILI
RESTORE DATABASE Deneme FROM DISK='C:\Dnm_Full1.BAK' WITH NORECOVERY, REPLACE
RESTORE DATABASE Deneme FROM DISK='C:\Dnm_Diff1.BAK' WITH RECOVERY
--BAŞARISIZ
RESTORE DATABASE Deneme FROM DISK='C:\Dnm_Full2.BAK' WITH NORECOVERY, REPLACE
RESTORE DATABASE Deneme FROM DISK='C:\Dnm_Diff3.BAK' WITH RECOVERY

Processed 176 pages for database 'Deneme', file 'Deneme' on file 1.
Processed 1 pages for database 'Deneme', file 'Deneme_log' on file 1.
RESTORE DATABASE successfully processed 177 pages in 0.074 seconds (19.497 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.

Ekran sonuçlarında şunu da görünüyoruz; Transaction Log backup bir önceki backupa ait en sonki LSN’dan itibaren yedekleme yapmaktadır.
SQL Server, kullanıcı veri tabanlarını yedeklediği gibi sistem veri tabanlarının da yedeklenmesine izin verir.
SQL Server üzerinde backup işlemlerini yapabilmek için sysadmin,db_owner veya db_backupoperator rolüne sahip olmak gerekir.
Yedekleme Senaryoları
1 – Simple recovery – Full backup örneği
Her gün saat 23:00’de full backup aldığımızı ve veri tabanının saat 15:00’da zarar gördüğünü ve transaction log’un tüm işlemleri kaydetmediğini(Simple recovery model) düşünelim. Bu senaryoda ancak dün gece alınmış full backup’tan geri dönülür. Bu durumda dün geceden bu yana yapılan değişiklikler kaybedilmiş olur.
2 – Full recovery – Full backup örneği
Her gün saat 23:00’de full backup aldığımızı ve veri tabanının saat 15:00’da zarar gördüğünü ve transaction log’un tüm işlemleri kaydettiğini(Full recovery model) düşünelim. Bu senaryoda öncelikle veri tabanı kullanıcıların erişimine kapatılır ve hemen güncel bir log backup alınır (WITH NO_TRUNCATE). Dün gece alınmış full backup, bozulmuş veri tabanının üzerine yüklenir ve az önce alınmış olan log backup yüklenir.
3 – Full recovery – Full ve Log backup örneği
Her gün saat 23:00’de full backup aldığımızı ayrıca gün içerisinde 10:00 – 14:00 – 18:00 saatlerinde log backup aldığımızı ve veri tabanının saat 15:00’da zarar gördüğünü düşünelim. Öncelikle veri tabanı kullanıcıların erişimine kapatılır ve hemen güncel bir log backup alınır (WITH NO_TRUNCATE). Dün gece alınmış full backup, bozulmuş veri tabanının üzerine yüklenir ardından 10:00 ve 14:00’te alınmış olan log backup sırasıyla recovery edilir ve son olarak az önce alınmış olan log backup yüklenir.
4 – Full recovery – Full, Differential ve Log backup örneği
Her hafta pazar günü full backup ve her gün 23:00’da differential backup alıyoruz. Ayrıca gün içerisinde 10:00 – 14:00 – 18:00 saatlerinde log backup aldığımızı ve veri tabanının hafta içi perşembe günü saat 15:00’da zarar gördüğünü düşünelim. Öncelikle veri tabanı kullanıcıların erişimine kapatılır ve hemen güncel bir log backup alınır (WITH NO_TRUNCATE). Geçtiğimiz pazar günü alınmış olan full backup, bozulmuş veri tabanına yüklenir ardından çarşamba günü 23:00’da alınmış differential backup yüklenir. Böylece pazar günününde çarşamba günü gece 23:00’a kadar yapılmış değişiklikler yüklenmiş olur. Ardından perşembe günü 10:00 ve 14:00’te alınmış transaction log recovery edilir ve son olarak az önce alınmış olan log backup yüklenir.
5 – Full recovery – Full, Differential ve Log backup örneği(NO_TRUNCATE)
Aşağıdaki örneği inceleyelim.

BACKUP DATABASE Deneme TO DISK='C:\Dnm_Full1.BAK'
	WITH NAME='Dnm_Full1', INIT
GO
BACKUP LOG Deneme TO DISK='C:\Dnm_Log1.BAK'
	WITH NAME='Dnm_Log1', INIT
GO
BACKUP LOG Deneme TO DISK='C:\Dnm_Log2.BAK'
	WITH NAME='Dnm_Log2', INIT
GO
BACKUP DATABASE Deneme TO DISK='C:\Dnm_Diff1.BAK'
	WITH NAME='Dnm_Diff1', INIT, DIFFERENTIAL
GO
BACKUP LOG Deneme TO DISK='C:\Dnm_Log3.BAK'
	WITH NAME='Dnm_Log3', INIT
GO
BACKUP DATABASE Deneme TO DISK='C:\Dnm_Diff2.BAK'
	WITH NAME='Dnm_Diff2', INIT, DIFFERENTIAL
GO
--Sistem crash oldu
--Güncel Log backup alalım
BACKUP LOG Deneme TO DISK='C:\Dnm_Log4.BAK'
	WITH NAME='Dnm_Log4', INIT

Bu örnekte, sırasıyla Full, Dnm_Full1, Dnm_Log1, Dnm_Log2, Dnm_Diff1, Dnm_Log3, Dnm_Diff2, Dnm_Log4 yedek dosyaları alınmıştır. Böyle bir senaryoda log dosyaları birbirilerine zincirleme bağlı oldukları için sadece log backup kullanılarak recovery edilebilir veya daha mantıklı olanı son diferensiyal yedeği ve güncel log backup’ı kullanmaktır.

RESTORE DATABASE Deneme FROM DISK='C:\Dnm_Full1.BAK' WITH NORECOVERY, REPLACE
--RESTORE LOG Deneme FROM DISK='C:\Dnm_Log1.BAK' WITH NORECOVERY
--RESTORE LOG Deneme FROM DISK='C:\Dnm_Log2.BAK' WITH NORECOVERY
--RESTORE DATABASE Deneme FROM DISK='C:\Dnm_Diff1.BAK' WITH NORECOVERY
--RESTORE LOG Deneme FROM DISK='C:\Dnm_Log3.BAK' WITH NORECOVERY
RESTORE DATABASE Deneme FROM DISK='C:\Dnm_Diff2.BAK' WITH NORECOVERY
RESTORE LOG Deneme FROM DISK='C:\Dnm_Log4.BAK' WITH RECOVERY

Aradaki log backupları kullanmayarak adımları kısaltımış olduk. Çünkü differential backup aldığımız zaman en son alınmış full backup’tan bu yana alınmış log backuplar birleştirilmiş olur.
Veya sadece loglaları da kullanabiliriz.

RESTORE DATABASE Deneme FROM DISK='C:\Dnm_Full1.BAK' WITH NORECOVERY, REPLACE
RESTORE LOG Deneme FROM DISK='C:\Dnm_Log1.BAK' WITH NORECOVERY
RESTORE LOG Deneme FROM DISK='C:\Dnm_Log2.BAK' WITH NORECOVERY
--RESTORE DATABASE Deneme FROM DISK='C:\Dnm_Diff1.BAK' WITH NORECOVERY
RESTORE LOG Deneme FROM DISK='C:\Dnm_Log3.BAK' WITH NORECOVERY
--RESTORE DATABASE Deneme FROM DISK='C:\Dnm_Diff2.BAK' WITH NORECOVERY
RESTORE LOG Deneme FROM DISK='C:\Dnm_Log4.BAK' WITH RECOVERY


Son olarak en kötü senaryodan bahsedelim. Elimizde herhangi bir full backup yoksa ve hatalı bir durum gerçekleştiyse bunu şimdiye kadar anlattığımız yöntemlerle çözmemiz imkansız. Bunun için third-party toollar kullanılabilir. Bu işlemlerde kullanılan en ünlü araçlar şunlardır;
Red-Gate SQL Log Rescue
Lumigent Log Explorer
ApexSQL Log
Management Studio Kullanmak
Şimdiye kadar anlattığımız tüm işlemler Management Studio ekranından da kolaylıkla yapılabilir. Yedeği alınacak veri tabanı sağ tıklanarak Tasks bölümünden Backup ve Restore işlemleri yapılabilir.

Restore bölümünün sağladığı kolaylık, daha önce alınmış backup dosyalardan hangilerini yüklememizin yeterli olacağını işaretlemesidir.

Aynı zamanda bu ekrandaki Options bölümünden REPLACE, WITH RECOVERY, WITH NORECOVERY seçenekleri de aktifleştirilebilir.
SQL Server yedek alımının otomatikleştirilmesi(Maintenance Plan)
SQL Server, veri tabanı için hayati önem arzeden database integrity, rebuild index, backup yönetimi, denetleme, koruma işlemleri için, rutin bir şekilde backup dosyalarını saklamak ve zamanı geldiğinde en eski dosyaları silmek gibi süreçleri oluşturmak için etkili bir bakım programı sunmaktadır. Management Studio’da altında bulunan Maintenance Plan isimli bu program, daha önceki versiyonlarda da olup SQL Server 2005’te daha yönetimsel hala getirilmiş oldu. Programın üzerinde Wizard’ı kullanılarak oluşturulacak tasklarla birçok yönetimsel işlemler gerçekleştirilebilir, sql serverin bakımı ve denetimi daha kolayca gerçekleştirilebilir. Bu programın Wizardı gerekli yönlendirmeleri yaptığı için ekran görüntülerini buraya koymadım.

SQL Server’de yedekleme ve geri yükleme – II (RESTORE)” üzerine 12 düşünce

  1. Yusuf

    Hocam öncelikle elinize sağlık.
    Ben bi sorun yaşıyorum bi umutla size danışmak istedim.
    Üzerinde çlıştığım projenin backuplarını projede db klasörüne atardım. bu beni yanıltmış olcak ki projenin yedeğini alırken .mdf dosyasını almamışım. yani elimde veri tabanına ait sadece .bak dosyası var boyutuda 5.233 KB . Ben pc ye format atmak zorunda kaldım. proje üzerinde çalışmaya başlayınca hatayı gördüm. veri tabanına ait .mdf yok. sadece .bak var. ne yapabilirim. bir şey yapılabilir mi.cavap yazabilirseniz sevinirim. saygılarımla.

    Cevapla
  2. Ahmet Kaymaz Yazar

    Merhaba Yusuf,.bak dosyası derken neyi kastettiğin önemli. Bu dosya, bahsettiğin veri tabanına ait bir backup mı. Eğer öyleyse ne tür bir backup. Geçmişte aldığın bir full backup ise elinde mdf olmaksızın bu dosyayı restore etmen yeterli olacaktır. Doğal olarak o backup’ı ne zaman aldıysan o zamana geri dönülmüş olur.
    Ayrıca projenin yedeğini alırken .mdf dosyasını almak zorunda değilsin. O anda güncel bir full backup alman yeterli olacaktır.
    .bak dosyasında ne olduğunu yazarsan belki daha doğru yardımcı olabilirim.Kolay gelsin,

    Cevapla
  3. Yusuf

    Hocam çok teşekkür ederim. Sorunu çözdüm. Evet bak dosyası veritabanına ait full bir backup tı. Serverde yeni bir veri tabanı oluşturdum. ve oluşturduğum veri tabanının .mdf ve .ldf dosyalarının yolu ile elimdeki .bak dosyasının işaret ettiği .mdf ve .ldf dosyalarının yollarını eşleştirdim. ve restore işlemi gerçekleşti.Özetle elimdeki database.bak dosyasının işaret ettiği G:\. \Database.mdf ve F:\..\Database.ldf şeklinde idi. ben yeni oluşturduğum boş databasin .mdf ve .ldf dosyalarını bunlarla değiştirdim.Tekrar ilginiz için çok teşekkür ederim.
    İyi çalışmalar.

    Cevapla
  4. musa

    bendeki durum biraz daha karışık elimde sadece log dosyası var bu dosyayı kullanarak datalarıma tekrar ulaşmam mümkün mü sql 2005 var databasess den yedekleri aldım ama sadece log dosyasını almış diğer dosyayı almamış dolayısıyla ben de yedeklerim tamam dır dedim ve sağ tıklayarak data baseleri sildim şimdi geri getirmemin bi yolu var mı

    Cevapla
  5. Ahmet Kaymaz Yazar

    Sadece Log dosyasını backup almak ne demek anlamadım. copy-paste işlemiyle mi yedek aldınız yoksa SQL Server üzerinden Log Backup mı aldınız. Eğer elinizde daha önce alınmış bir full backup yok ise hiçbir şekilde veriyi restore edemezsiniz.

    Cevapla
  6. sinan

    mrblar restore etmeye caçlıtığımız full backupda böyle bi hata sorunu veriyor dosya yolları ile alakalı olabilirmi yoksa yedek bozukmudur saygılar
    An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.Express.ConnectionInfo)———-
    ADDITIONAL INFORMATION:The media family on device ‘C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\deneme_backup_2010_11_06_170005_5156250.bak’ is incorrectly formed. SQL Server cannot process this media family.
    RESTORE HEADERONLY is terminating abnormally. (Microsoft SQL Server, Error: 3241)For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.4053&EvtSrc=MSSQLServer&EvtID=3241&LinkId=20476———-
    BUTTONS:OK
    ———-

    Cevapla
  7. Ahmet Kaymaz Yazar

    Sinan Bey,Backup alınan ve Restore edilen SQL Server’lerin sürümlerinin aynı olması veya Restore edilen sunucunun daha üst sürümde olması gerekmektedir. Eğer bu şartlar uygunsa o zaman yedek dosyası bozuk olabilir. Bunun için RESTORE VERIFYONLY komutu kullanılarak dosyanın doğruluğu kontrol edilebilir.Eğer yedek dosyasını FTP aracılığıyla bir yerden indiriyorsanız transfer modunu “binary mode” olarak ayarlamanız dosyanın formatı açısından daha doğru olacaktır.

    Cevapla
  8. Yusuf ORAL

    saygılarımı suranım öncelikle yardımlarınız için şimdiden teşekkürler
    Sorunum şu
    differential backup almak ıstıyorum sebebide
    serverın bulundugu yer baska ılde ben baska ildeyim backup dosyası sıkıstırınca bile 8000 mb oluyor. ben
    sadece degısıklıklerı alıp localimdeki serveri guncellemek ıstıyorum .
    Internette bakındım biraz full backup alıp sonra differential backup almam gerektıgını gordum ama ılk full backup i gerı alırken no_recovery modunda işlem bitiyor ama sql server management da veritabanı isminin yanıda restoring diyerek beklıyor veritabanı ulasılamaz dıyor differential backup restore islemıne gecemedım bıle bu yuzden
    ana sıstemde backup gunluk full olarak sadece fırmanın verıtabanı alınıyor sırasıyla neler yapmam gerektıgını soyleyeblırmısınız acaba backuplar soyle restoreler soyle gibi

    Cevapla
  9. zafer

    selam hoçam bi sorunum var yardım cı olabilirsen sevinirim web tabanlı muhasebe programı kullanıyrdum hosting firmesından yedek istedim pc ye kurmak için onlarda bana bak uzantılı bir dosya yolladılar sql de bu dosyayı attac etmeye calıştıgımda error:5171 hatasıyla karşılaşıyorum yardımınız için şimdiden teşekkürler

    Cevapla
  10. Mert Karadeniz

    Merbaha,
    Benim şöyle bir sıkıntım var , aslında sorumun cevabı sizin anlattıklarınız arasında vardır ama ben tam SQL’e hakim olamadığım için bulamadım.Şimdi ben kendi projemden otomatik backup ve restore işlemleri yaptırıyorum.Herhangi bir problemim yok bu konuda,sıkıntım şurda zaten bunuda yeni farkettim ben veritabanına her yeni backup aldığımda kendi içinde bir backup geçmişi oluşturduğunu gördüm ve ben SQL üzerinden backup yaptırırken bana geçmişten alışmış backupları göstererek seçmemi istiyor ve orda seçip yüklüyorum.Yalnız bunu yazılım üzerinden yaptığım zaman yani vertabanını restore yapacağım zaman geçmişteki backuplar arasından sanırım ilkini seçiyor ve en son halini yüklemiyor.Acaba ben restore işlemi yaptırırken veritabanının son halini nasıl aktarabilirim.

    Sorgum şu şekilde : restore database Data from disk = ‘VeriTabani.bak’

    Eklemem gerek bir sorgu olduğunu biliyorum yada burdan değilde backup aldığım kısımdanda bir değişiklik yapılabilir diye düşünüyorum.

    Yardımcı olursanız sevinirim.Şimdiden teşekkürler…

    Cevapla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.