Recent comments

None


İçerik Ara











Yasal Uyarı
Bu sitede sunulan tüm bilgi ve dökümanlar Turgay Sahtiyan tarafından yazılmaktadır. Yazıların kaynak göstermek şartıyla kullanılması serbesttir.

© Copyright 2009-2013
Takvim
<<  Haziran 2017  >>
PaSaÇaPeCuCuPa
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789
Keywords

SQL Server 2012 ile gelen yenilikler ve iyileştirmeler üzerine incelemelerimize devam ediyoruz. Bugünkü konumuz Management Studio üzerinden restore işlemi yaparken kullandığımız ara yüzde yapılan iyileştirmeler ve geliştirmeler.

[more]

Microsoft’un açıkladığına göre bu iyileştirmelerin bir çoğu müşterilerden gelen istekler doğrultusunda gerçekleştirilmiş. Aslında çok büyük geliştirmeler söz konusu değil fakat restore ekranı çok sık kullanılan bir ekran olduğu için geliştirmeler oldukça faydalı olmuş.

Sözü fazla uzatmadan yapılan iyileştirme ve geliştirmelere bakalım.

1

1. Restore dosyasını seçtiğimiz anda ilgili backup’lar otomatik olarak seçilmekte. Çok büyük bir özellik olarak gözükmese bile her restore işleminde bunları seçiyor olmak bize zaman kaybettirmekteydi.

2. Restore edilecek database’in adı backup dosyasından okunup default olarak otomatikman yazılmakta. Ayrıca Restore to kısmında default olarak yazan “the last backup taken” yazısının yanına en son alınan backup’ın tarihi de eklenmiş durumda.

3. Restore ekranında yapılan belki de en büyük geliştirme zaman bazlı restore işlemleri için kullanabileceğimiz Görsel Zaman Çizelgesi ekranı.

2

Bu ekran vasıtasıyla backup’ların ne zaman alındığını görsel bir zaman çizelgesi üzerinde görebiliyoruz. Ayrıca zaman bazlı bir seçim yaptığımızda seçtiğimiz tarihin görsel olarak hangi alana denk geldiğini görerek hangi backup’ların restore edileceğini rahatça görebiliyoruz.

4. Files bölümünde ise oldukça faydalı olacağını düşündüğüm bir geliştirme yapılmış.

3

Relocate all files to folder kısmında restore edilecek database’in data ve log dosyalarının nereye yerleştirileceğini seçebiliyoruz. Daha önce bu işlemi dosya dosya yapabiliyorduk. 1’den fazla örneğin 8 tane data dosyası içeren database’de klasör değişikliğini her bir dosya için ayrı ayrı yapmamız gerekiyordu. Bu yeni özellik vasıtasıyla artık çok daha hızlı bir şekilde bu değişiklikleri yapabileceğiz.

5. Options bölümünde ilk göze çarpan, ekranı daha kullanışlı hale getirebilmek için yapılan düzenlemeler. Bunun haricinde Restore’den önce Tail-Log backup alınmasını istiyorsak bunu seçebiliyoruz.

4

6. Bir diğer güzel geliştirme ise Restore işleminden önce bağlı kullanıcıların disconnect edilmesi. Bunu sağlamak için database, restore’dan önce otomatik olarak single user mode’a alınmaktadır.

SSMS Restore ekranında yapılan iyileştirmeler ve geliştirmeler bu şekilde. Daha önce söylediğim gibi bu geliştirmeler çok büyük geliştirmeler değil. Fakat restore ekranı çok sık kullandığımız bir ekran olduğu bu geliştirmelerin işlerimizi hızlandıracağı aşikar.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server’da temel olarak 3 backup tipi bulunmaktadır. Bunlar Full, Differential ve Log Backup’tır. Her transaction’ın işlem bilgilerini içeren Transaction Log Backup ile istenilen bir ana dönmek mümkündür. Bu makalemde Transaction Log Backup kullanarak istenen bir zamana nasıl dönebileceğimize bakıyor olacağız.

[more]

Gerçekleştireceğim örnekte bir tabloya değişik zamanlarda kayıtlar gireceğim. Ve daha sonra bu tabloyu istediğim bir ana geri döndüreceğim.

İlk olarak bir çalışma tablosu oluşturuyorum.

create database DBLogBackup
GO
--Log Backup kullanabilmek için recovery model'i Full yapıyorum
ALTER DATABASE [DBLogBackup] SET RECOVERY FULL 
GO
Use DBLogBackup
GO
Create table tbl1(DatetimeX datetime, Value int)
GO

 

Log Backup’ların restore edilebilmesi için ilk olarak bir Full Backup’ın restore edilmesi gerekmektedir. O yüzden işlemlere başlamadan önce bir Full Backup alıyorum.

--İşlemlere başlamadan önce Full Backup alıyorum
backup database DBLogBackup to disk='D:\DBLogBackup_Full.bak'

 

Şimdi farklı zamanlarda 3 adet insert yapacağım.

insert tbl1 select GETDATE(), 1
GO
insert tbl1 select GETDATE(), 2
GO
insert tbl1 select GETDATE(), 3
GO

 

Insert işlemlerinden sonra elimde şöyle bir tablo olacak.

image

Şimdi bir Log Backup alıyorum.

--Insert işlemlerinden sonra Log Backup alıyorum
backup Log DBLogBackup to disk='D:\DBLogBackup_Log.trn'

 

Şimdi zaman bazlı restore işlemi yapacağım. Yukarıdaki resme bakıyorum ve saat 16:16:35’e dönmeye karar veriyorum ve bu ana döndüğümde tablomda sadece 1 nolu kayıtın olması gerektiğini biliyorum.

Restore işleminde ilk olarak Full Backup’ı restore edip daha sonra Log Backup’ı restore edeceğim. Eğer birden fazla Log Backup var ise istediğim ana gelene kadar bütün Log Backup’ları sırası ile restore etmem lazım. Benim 1 adet Log Backup'ım olduğu için sadece Full ve Log Backup’ı restore edeceğim.

use master
GO
--Önce Full Backup'ı restore ediyorum.
--Bu işlemden sonra Log Backup'ı da restore edeceğim için.
--   WITH NORECOVERY seçeneğini kullanıyorum.
RESTORE DATABASE [DBLogBackup] FROM  DISK = N'D:\DBLogBackup_Full.bak' 
	WITH  NORECOVERY, REPLACE
GO
--Şimdi Log Backup'ı restore ediyorum.
--İstenilen bir ana dönmek için STOPAT seçeneğini kullanıyorum
RESTORE LOG [DBLogBackup] FROM  DISK = N'D:\DBLogBackup_Log.trn' 
	WITH  STOPAT = '2011-12-04 16:16:35.000'
GO

 

Restore’den sonra tablodaki kayıtlara baktığımda;

image

16:16:35’e döndüğüm için beklediğim gibi sadece 1 nolu kayıt bulunmakta.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Bu makalemde SQL Server 2005 ile gelen Dump Device’ların backup-restore operasyonlarında ne şekilde kullanılabileceklerini görüyor olacağız.

[more]

Eğer hazırladığınız scriptlerin birden fazla yerinde backup restore kodları kullanıyorsanız Dump Device’lar işinizi kolaylaştıracaktır. Çünkü herhangi bir backup folder’ı değişikliğinde tüm backup restore komutlarında değişiklik yapılmaktansa Dump Device’da yapılacak değişiklik işi çözecektir.

Dump Device T-SQL ile şu şekilde create edilebilir;

USE master;
GO
EXEC sp_addumpdevice 'disk', 'myDumpDevice', 'D:\Backup\DenemeXBackup.bak';

 

Tanımlı Dump Device’ları sys.backup_devices catalog view’den sorgulanabilir.

image

Ayrıca SSMS üzerinden de tanımlı Dump Device’lara bakılabilir.

image

Şimdi tanımladığımız bu Dump Device’ı kullanarak backup alalım.

backup database Denemex to myDumpDevice With INIT

 

Bir de restore denemesi yapalım.

Restore database DenemeX from myDumpDevice With Replace

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Ya da data dosyalarındaki otomatik büyüme (auto growth) işlemleri normalden fazla zaman mı alıyor? Eğer öyle ise muhtemelen SQL Server 2005 ile gelen Instant File Initialization (Anında Dosya Oluşturulması) özelliğini kullanmıyorsunuzdur.

[more]

SQL Server 2005 ile gelen ve şu ana kadar gördüğüm kadarıyla çok az DBA tarafından bilinen Instant File Initialization, data dosyalarının allocate edilirken 0’lar ile doldurulmadan anında allocate edilmesidir.

Dosyalar verilirken 0’lar ile doldurulmadığı için disaster recovery gibi veritabanlarının sıfırdan restore edildiği durumlarda oldukça fazla zaman kazandırmaktadır.

Ayrıca gene data dosyalarında yapılan otomatik büyüme (Auto Growth) işlemlerinde de yeni verilen alanlar 0’lar ile doldurulmayacağı için işlem daha hızlı tamamlanacaktır.

Instant File Initialization özelliği SADECE data dosyalarında işe yarar. Log dosyalarının doğası gereği verilen alanın 0’lar ile doldurulması gerekmektedir.

Instant File Initialization Nasıl Aktif Edilir?

Instant File Initialization özelliğinin kullanılabilmesi için SQL Server service hesabının Local Group Policy’de Perform Volume Maintenance Tasks’a eklenmesi gerekmektedir. Bu ekrana Start>>All Programs>>Administrative Tools yolundan ulaşabilirsiniz. Servis hesabı eklendikten sonra servisin kapatılıp açılması gerekir.

Karşılaştırma

Makalemin bu kısmında Instant File Initialization özelliğinin aktif ve pasif olduğu durumlarda 20GB’lık yeni bir veritabanı oluşturma işleminin ne kadar sürdüğünü karşılaştıracağız.

İlk olarak Perform Volume Maintenance Task’tan SQL Server service hesabını çıkartıp, servisi kapatıp açalım ve aşağıdaki veritabanı oluşturma script’ini çalıştıralım.

CREATE DATABASE [IFI_Deneme] ON  PRIMARY 
	( NAME = N'IFI_Deneme', FILENAME = N'D:\DATA\IFI_Deneme.mdf' , SIZE = 20971520KB , FILEGROWTH = 1024KB )
 LOG ON 
	( NAME = N'IFI_Deneme_log', FILENAME = N'D:\DATA\IFI_Deneme_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)

 

Instant File Initialization aktif değilken veritabanı oluşturulma işlemi 6 dakika 8 saniye sürdü.

Şimdi aynı işlemi Perform Volume Maintenance Tasks’a SQL Server service hesabını ekledikten ve servisi kapatıp açtıktan sonra tekrar yapalım.

Bu şekilde yani Instant File Initialization aktif iken veritabanı oluşturulma işlemi 3 saniye sürdü.

Neredeyse 120 kat daha hızlı. Süper değil mi?

240 GB'lık bir veritabanı üzerinde yaptığım restore denemesinin sonuçları ise şu şekilde;

Instant Instant File Initialization Aktif değil iken : 1.5 saat

Instant Instant File Initialization Aktif iken : 37 dakika 34 saniye

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server’da master,model ve tempdb database’lerinin owner’ı değiştirilmeye çalışılırsa aşağıdaki gibi bir hata alınabilir.

[more]

image

Cannot change the owner of the master, model, tempdb or distribution database.
(Microsoft SQL Server, Error: 15109)

master,model ve tempdb database’lerinin owner’ları SSMS’ten ya da aşağıdaki T-SQL kodu ile değiştirilemez.

use model
EXEC dbo.sp_changedbowner @loginame = N'sa'

 

Bu değişikliği yapmak için detach-attach ya da backup-restore yöntemlerinin kullanılması gerekir.

System Database’lerin de detach-attach ve backup-restore yöntemlerinin nasıl kullanıldığı ile alakalı aşağıdaki makalelerimi okumanızı tavsiye ederim.

SQL Server da Master DB Database File larını Taşımak

SQL Server – master database backup – restore

SQL Server 2008 – Model ve MSDB Database lerinin Taşınması

SQL Server da TempDB Database File larını Taşımak

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server Magazine’in Ocak 2011 sayısında Paul Randal’ın üzerinde durduğu, bir database’i aynı server üzerinde yeni bir lokasyona taşımanın güvenli yolu yöntemini, bu yazıyı okuduğumdan beri ben de sıklıkla kullanmaktayım. Bugün size bu yöntemin adımlarını gösteriyor olacağım.

[more]

Daha önceleri DB taşımalarını backup-restore ya da attach-detach yöntemleriyle yapmaktaydım. Bu yöntemlerde sıkıntı duyduğum noktalar, backup-restore seçeneğinde işlemin uzun sürmesi, detach-attach yönteminde ise yetkisel problemlerdi.

Paul Randal’ın yöntemini okuduktan sonra artık aynı makina içindeki DB taşımalarında bu yöntemi kullanmaktayım.

Yöntem şu şekilde;

  1. DB’yi offline’a çekiyoruz.
    		
    ALTER DATABASE AdventureWorks SET OFFLINE
    	
  2. Data ve log dosyalarını yeni lokasyona kopyalıyoruz. Yedek kalması açısından şu an için eski lokasyonda bir kopyasını bırakıyoruz.
  3. System Catalog’larında data ve log dosyalarının yeni lokasyonlarını ALTER DATABASE komutu ile belirtelim.
    USE master
    GO
    ALTER DATABASE [AdventureWorks]	
    	MODIFY FILE (NAME = 'AdventureWorks_Data', FILENAME = 'D:\Data\AdventureWorks_Data.mdf')
    GO
    ALTER DATABASE [AdventureWorks]	
    	MODIFY FILE (NAME = 'AdventureWorks_Log', FILENAME = 'D:\Data\AdventureWorks_Log.ldf')
    GO

  4. DB’yi online’a çekiyoruz.
    		
    ALTER DATABASE AdventureWorks SET ONLINE
    	

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Şu sıralar bir konsolidasyon projesi üzerinde çalışmaktayım. Bu proje kapsamında SQL Server Instance’larını ortak pool sunucularda konsolide etmeye çalışıyorum. Ana amaçlarımdan biri lisans maliyetini azaltmak, bir diğer kazancımız ise disk ve maintenance kazancı olacak.

Bu kazançları hesaplarken şöyle bir bilgiye ihtiyacım oldu. Biz genelde SQL Server backup’larımızı direk tape’e almaktayız. Ama hala bazı ortamlarımızda disk’e backup çıkılmakta. Bu durum da gereksiz disk kullanımı demek.

Amacım, tüm SQL Server database’lerimi dolaşmak, her database için en son alınan backup eğer disk’e alındıysa bu backup’ın boyutunu raporlamak. Çıkan rapor sonucunun genel toplamı da benim şu andaki disk’e backup almanın disk açısından maliyeti olacak.

[more]

Bu amaçla aşağıdaki scriptleri yazdım. SQL Server versiyonu olarak 2000,2005,2008 kullandığım için her biri için ayrı ayrı scriptler hazırladım.

--SQL Server 2008
SELECT DatabaseName, backup_finish_date, UserName, Duration_second
	,backup_size_MB
	,compressed_backup_size_MB, Compress_Gain_percentage 
	,physical_device_name 
from
(
	SELECT 
		row_number() over(partition by T1.name order by T2.backup_finish_date desc) as rn
		,T1.Name as DatabaseName
		,T2.backup_finish_date		
		,COALESCE(Convert(varchar(12), T2.user_name, 101),'NA') as UserName
		,DATEDIFF(ss,T2.backup_start_date,T2.backup_finish_date) as Duration_second
		,Round(T2.backup_size/1024./1024,2) as backup_size_MB
		,Round(T2.compressed_backup_size/1024./1024,2) as compressed_backup_size_MB
		,Round(((T2.backup_size-T2.compressed_backup_size)*100.)/T2.backup_size,2) as Compress_Gain_percentage
		,T3.physical_device_name 
	FROM sys.sysdatabases T1 
	LEFT OUTER JOIN msdb.dbo.backupset T2 ON T2.database_name = T1.name
	LEFT OUTER JOIN msdb.dbo.backupmediafamily T3 ON T3.media_set_id = T2.media_set_id
	where T1.dbid>4 and type='D'
		and T3.device_type in (2,102)
)xx	
where rn=1


--SQL Server 2005
SELECT DatabaseName, backup_finish_date, UserName, Duration_second
	,backup_size_MB
	,physical_device_name 
from
(
	SELECT 
		row_number() over(partition by T1.name order by T2.backup_finish_date desc) as rn
		,T1.Name as DatabaseName
		,T2.backup_finish_date		
		,COALESCE(Convert(varchar(12), T2.user_name, 101),'NA') as UserName
		,DATEDIFF(ss,T2.backup_start_date,T2.backup_finish_date) as Duration_second
		,Round(T2.backup_size/1024./1024,2) as backup_size_MB
		,T3.physical_device_name 
	FROM sys.sysdatabases T1 
	LEFT OUTER JOIN msdb.dbo.backupset T2 ON T2.database_name = T1.name
	LEFT OUTER JOIN msdb.dbo.backupmediafamily T3 ON T3.media_set_id = T2.media_set_id
	where T1.dbid>4 and type='D'
)xx	
where rn=1 and T3.device_type in (2,102)


--SQL Server 2000
SELECT xx.*
	,COALESCE(Convert(varchar(12), T2.user_name, 101),'NA') as UserName
	,COALESCE(Convert(varchar(12), T2.user_name, 101),'NA') as UserName
	,DATEDIFF(ss,T2.backup_start_date,T2.backup_finish_date) as Duration_second
	,Round(T2.backup_size/1024./1024,2) as backup_size_MB
	,T3.physical_device_name 
FROM
(
	SELECT 
		T1.Name as DatabaseName,MAX(T2.backup_finish_date) as backup_finish_date, 
		COALESCE(Convert(varchar(20), MAX(T2.backup_finish_date)),'Not Yet Taken') as LastBackUpTaken
	FROM sysdatabases T1 
	LEFT OUTER JOIN msdb.dbo.backupset T2 ON T2.database_name = T1.name
	where T1.dbid>4 and type='D'		
	GROUP BY T1.Name
)xx
LEFT OUTER JOIN msdb.dbo.backupset T2 ON T2.database_name = xx.DatabaseName and T2.backup_finish_date=xx.backup_finish_date
LEFT OUTER JOIN msdb.dbo.backupmediafamily T3 ON T3.media_set_id = T2.media_set_id
WHERE T3.device_type in (2,102)
ORDER BY xx.DatabaseName

 

SQL Server 2008 için hazırladığım script te fazladan compress backup boyutu ve compress backup’tan dolayı yaptığımız kazançta var. Bildiğiniz gibi compress backup özelliği 2008 ile beraber geldiği için 2005 ve 2000’de bu özelliği kullanamamaktayız.

Şimdi SQL Server 2008 olan bir sunucumda script’i çalıştırınca gelen sonuca bakalım.

back

Son alınan backup’ın boyutunu ve süresini görmekteyiz. Rapor sonucunu excel’e atıp backup_size ları toplarsak toplam disk maliyetimizi alabiliriz.

Ayrıca son backup’ın fiziksel diskte nereye alındığını da rapor sonucunda görebilmekteyiz.

Bu scriptleri bütün sunucularda tek seferde çalıştırıp raporlamak için Registered Servers özelliğini kullanabilirsiniz. Bu konuyla alakalı makaleye şuradan erişebilirsiniz.

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Aslında problem sadece 2008’den 2005’e taşımak ile sınırlı değil. Bildiğiniz gibi major üst versiyonlarda oluşturulmuş bir database’i daha alt bir versiyona backup-restore ya da detach-attach ile taşıyamıyoruz.

Bugünkü yazımda bu konuya bir çözüm bulup adım adım bu taşıma işleminin nasıl yapılacağına bakıyor olacağız.

[more]

Giriş paragrafında da belirttiğim gibi konu sadece 2008’den 2005’e taşımak ile ilgili değil. 2008R2’dan 2008’e ya da 2008’den 2000’e yapılan backup-restore ya da detach-attach işlemlerinde de hata alınmaktadır.

Örneğin alınan hatalar şu şekilde;

2008’den 2005’e backup restore;

Msg 3241, Level 16, State 7, Line 2
The media family on device 'D:\dbDeneme2008_2.bak' is incorrectly formed. SQL Server cannot process this media family.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

2008’den 2005’e detach attach;

The database 'XXX' cannot be opened because it is version 655. This server supports version 612 and earlier. A downgrade path is not supported.
Could not open new database 'XXX'. CREATE DATABASE is aborted. (Microsoft SQL Server, Error: 948)

Şimdi çözüme geçelim;

Generate Script ile 2008’den 2005’e Database Taşıma

Ben örneğimi 2008’den 2005’e taşıma olarak yapacağım. Siz aynı mantıkta diğer versiyonlar arası da taşıma yapabilirsiniz.

Önce her zamanki gibi bir çalışma DB’si create edelim. Bu DB’yi 2008 sunucumda create ediyorum.

create database dbDeneme2008
GO
Use dbDeneme2008
GO
create table tblDeneme2008 (a int)
GO
insert tblDeneme2008 select 1
GO

 

Şimdi taşıma adımlarına geçelim

  1. 2008 sunucusunda bulunan taşınacak DB’ye sağ tıklayıp Tasks >> Generate Scripts bölümüne geliyoruz.
  2. Açılan ekranda next yapıp gelen ekranda çalışmak istediğimiz veritabanını seçiyoruz. Yani bu örnek için dbDeneme2008. Next’e tıklıyoruz. 

    1
  3. Script Version kısmında SQL Server 2005 ve Script Data kısmında True seçerek Next’e tıklıyoruz. 

    2

    3 
  4. Choose Object Types kısmından ilgili objeleri seçiyoruz. (SP,Function,Table,View vs.) Bu Örneğimizde sadece table olduğu için tables’ı seçip next’e basıyoruz. 

    4
  5. Tüm table’ları seçiyoruz ve next’e basıyoruz. 

    5
  6. Script’i file’a save etmek istediğimizi belirtip next’e basıyoruz. 

    6
  7. Summary kısmında yaptığımız işlemin bir özetini görüyoruz. 

    7
  8. Finish’e basarak işlemi sonlandırıyoruz. 

    8
  9. 2005 sunucuya geçip dbDeneme2008 adlı yeni bir boş DB create ediyoruz.
    create database dbDeneme2008
    GO
  10. 8. Adım sonucunda oluşan script’i 2005 sunucusunda execute ediyoruz. 

    9
  11. İşlem tamamlandı. 2005 sunucusunda oluşan DB’ye baktığımızda table’ların ve dataların geldiğini göreceğiz. 

    10

Bu makalemizde 2008’den 2005’e bir Database’i generate script metodu ile nasıl taşıyabileceğimizi gördük.

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2008 R2 ya da daha üst bir versiyonda oluşturulmuş bir database’i detach edip 2008 Server’a attach etmeye çalıştığınızda aşağıdaki gibi bir hata alabilirsiniz.

[more]

The database 'dbDenemeR2' cannot be opened because it is version 661. This server supports version 655 and earlier. A downgrade path is not supported.

Could not open new database 'dbDenemeR2'. CREATE DATABASE is aborted. (Microsoft SQL Server, Error: 948)

image

Bu hatanın sebebi üst versiyondan oluşturulan bir database’in daha alt bir SQL Server versiyonuna attach edilememesidir.

Böyle bir durumda aşağıdaki makaleyi kullanarak 2008 R2 DB’nizi SQL Server 2008’e taşıyabilirsiniz.

SQL Server 2008’de Bulunan Bir Database’i SQL Server 2005’e Taşımak (Restore)

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2008 R2 ya da daha üst bir versiyondan aldığınız bir backup’ı SQL Server 2008’e restore etmeye çalıştığınızda aşağıdaki gibi bir hata alabilirsiniz.

[more]

Msg 3169, Level 16, State 1, Line 1
The database was backed up on a server running version 10.50.1600. That version is incompatible with this server, which is running version 10.00.2531. Either restore the database on a server that supports the backup, or use a backup that is compatible with this server.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

image

Bu hatanın sebebi üst versiyondan alınan backup dosyasının daha alt bir SQL Server versiyonuna restore edilememesidir.

Böyle bir durumda aşağıdaki makaleyi kullanarak 2008 R2 DB’nizi SQL Server 2008’e taşıyabilirsiniz.

SQL Server 2008’de Bulunan Bir Database’i SQL Server 2005’e Taşımak (Restore)

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


 

SQL Server 2008 ya da daha üst bir versiyonda oluşturulmuş bir database’i detach edip 2005 Server’a attach etmeye çalıştığınızda aşağıdaki gibi bir hata alabilirsiniz.

[more]

The database 'XXX' cannot be opened because it is version 655. This server supports version 612 and earlier. A downgrade path is not supported.
Could not open new database 'XXX'. CREATE DATABASE is aborted. (Microsoft SQL Server, Error: 948)

image

Bu hatanın sebebi üst versiyondan oluşturulan bir database’in daha alt bir SQL Server versiyonuna attach edilememesidir.

Böyle bir durumda aşağıdaki makaleyi kullanarak 2008 R2 DB’nizi SQL Server 2008’e taşıyabilirsiniz.

SQL Server 2008’de Bulunan Bir Database’i SQL Server 2005’e Taşımak (Restore)

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2008 ya da daha üst bir versiyondan aldığınız bir backup’ı SQL Server 2005 ya da SQL Server 2000’e restore etmeye çalıştığınızda aşağıdaki gibi bir hata alabilirsiniz.

[more]

Msg 3241, Level 16, State 7, Line 2
The media family on device 'D:\dbDeneme2008_2.bak' is incorrectly formed. SQL Server cannot process this media family.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

image

Bu hatanın sebebi üst versiyondan alınan backup dosyasının daha alt bir SQL Server versiyonuna restore edilememesidir.

Böyle bir durumda aşağıdaki makaleyi kullanarak 2008 R2 DB’nizi SQL Server 2008’e taşıyabilirsiniz.

SQL Server 2008’de Bulunan Bir Database’i SQL Server 2005’e Taşımak (Restore)

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Bugün size basit ama bana çok sorulan bir konudan bahsetmek istiyorum. Bildiğiniz gibi SQL Server’da otomatik backup alınabilmektedir. Örneğin her akşam saat 20.00’de backup alınsın diye bir job tanımlanabilir. Bu job’ı işleten servis ise SQL Server Agent’tır ve SQL Server’ın Express yani ücretsiz sürümünde SQL Server Agent’ı bulunmamaktadır.

Bugünkü makalemde SQL Server Express sürümünde Windows Scheduler servisini kullanarak nasıl otomatik backup alınacağını anlatıyor olacağım.

[more]

Express edition dışındaki SQL Server sürümlerinde SQL Server Agent servisi kullanılarak otomatik backup işleminin nasıl yapılacağı ile alakalı yazdığım aşağıdaki makaleyi okuyabilirsiniz.

http://turgaysahtiyan.com/post/SQL-Server-2008-de-Otomatik-BackUp-icin-Job-Olusturma-(Schedule).aspx

Giriş paragrafında da belirttiğim gibi Express sürümlerinde SQL Server Agent bulunmamaktadır. Dolayısıyla otomatik backup işlemini Windows’un kendi scheduler servisi ile yapacağız.

Yapacağımız işlem aslında basit. Backup alacak script i hazırlayıp bu scripti sqlcmd ile windows scheduler servisi vasıtasıyla istediğimiz zamanlar tetikleyeceğiz. Bu arada windows scheduler task SQL Server Agent gibi verilen taskları belirli periyotlarda çalıştırmaya yarar.

Ben bugünkü örneğimi Windows Server 2008 Standart ve SQL Server 2005 Express üzerinde gerçekleştireceğim. Diğer edition’larda ufak ekran farklılıkları olmakla birlikte işin ana mantığı aynıdır.

Şimdi adımlarımıza geçelim.

Backup almak istediğimiz DB için backup script i hazırlıyoruz.

BACKUP DATABASE [AdventureWorks]
TO DISK = N'C:\AdventureWorksDailyBackup.bak'
WITH INIT
GO

 

Bu script i "E:\SQLBackups\DailyBackup.sql" olarak kaydediyoruz.

Windows scheduler task’ında bu dosyayı aşağıdaki komutlar eşliğinde çalıştıracağız. İlk komut DB Server’a windows authentication bağlanmakta, 2.komut ise belirli bir SQL Login ile bağlanmakta. Hangisi sizin için uygunsa onu kullanabilirsiniz. Ben ilkini kullanacağım.

sqlcmd -S serveradi\instanceadi -i "E:\SQLBackups\DailyBackup.sql"

sqlcmd -S serveradi\instanceadi -U BackupAdmin -P sifre -i "E:\SQLBackups\DailyBackup.sql"

Bu arada serveradi\instance adi kısmını kendi server bilgilerinize göre düzenleyiniz. Instance adı Express sürümlerde genelde SQLExpress olmaktadır. Tam olarak ne olduğuna SQL Server Configuration Manager’dan bakabilirsiniz.

Şimdi Task tanımlamalarına başlamak için Task Scheduler’ı açıyoruz.

1

Yani bir task tanımlamak için Task Scheduler Library >> Create Task a basıyoruz.

2

General kısmını aşağıdaki gibi ihtiyacımıza göre dolduruyoruz.

3

Schedule kısmında hangi sıklıkla bu task’ın çalışacağını belirliyoruz. Bizim taskımız her gece 11 de çalışacak.

4

Action kısmında New Action’a basarak işi yapacak işlemi tanımlıyoruz. Bu işlemimiz bir program çalıştıracak. Browse kısmında sqlcmd.exe’sini seçiyoruz. Bu exe genelde C:\Program Files\Microsoft SQL Server\90\Tools\binn klasöründe bulunmaktadır. Son olarakta Add arguments kısmına daha önce yazdığım komutlardan hangisi size uyuyorsa o komutun sqlcmd den sonraki kısmını yazıyoruz. Örneğin aşağıdaki gibi;

sqlcmd -S serveradi\instanceadi -i "E:\SQLBackups\DailyBackup.sql"

Ok’e basarak bu ekranı kapatıyoruz.

5

Artık Scheduler’ımız hazır. Scheduler’a sağ tıklayarak manuel olarak tetikliyoruz.

6

Task çalışmasını bitirip sonlandığında ilgili klasöre backup’ların alındığını göreceğiz.

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server da başarılı olan her backup işlemi bildiğiniz gibi SQL Server Log’a yazılmaktadır. TLog backup kullanımınız var ise ve çok sıklıkla backup alıyorsanız SQL Server Log a çok fazla sayıda kayıt yazılacaktır ve bu da Log’un okunmasını zorlaştıracaktır. Bugünkü yazımda başarılı backup işlemlerinin SQL Server Log’a yazılmasını nasıl engelleyeceğimizi görüyor olacağız.

[more]

Konumuz SQL Server Log olduğu için daha önce Kadir Evciler arkadaşımın yazmış olduğu aşağıdaki makaleyi okumanızı tavsiye ederim.

http://www.turgaysahtiyan.com/post/SQL-Server-Loglarc4b1e28099nc4b1-Okumak-Icin-Ozellestirilmis-Log-Arama-Stored-Precedure-u.aspx

Giriş paragrafında söylediğim gibi default davranış olarak SQL Server başarılı bütün backup işlemlerini log’lar. Buda Log’un okunmasını güçleştirebilir. Örneğin bir production ortamında bulunan 20 DB 5 dk da bir Tlog backup alındığından aşağıdaki gibi bir manzara ile karşılaşabilirsiniz.

Clipboard01

Burada 2 seçeneğiniz olabilir. Ya Filter özelliği ile aramak istediğiniz hatayı arayacaksınız ki burada exclude mantığı gibi bir çalışma mantığı yok (Bu konuyla ilgili yukarıda belirttiğim Kadir Evciler’in yazısını okumanızı tavsiye ederim) ya da backup işlemlerinin loglanmasını engellemeliyiz.

SQL Server da bu engellemeyi yapabilmek için 3226 no’lu Trace Flag i aktif hale getirmemiz yeterli.

Hemen bir örnekle durumu daha açık hale getirelim.

  1. İlk örneğimizde trace flag’ı açmayacağız ve bunun log’landığını izleyeceğiz.
    Use master
    GO
    backup database AdventureWorks2008 to disk='C:\backup1.bak'
    GO


    Error Log’a baktığımızda

    Clipboard02

  2. Şimdi aynı işlemi birde Trace Flag’i açarak yapalım.

    --Flag i açalım
    DBCC TRACEON(3226)
    GO
    Use master
    GO
    backup database AdventureWorks2008 to disk='C:\backup2.bak'
    GO
    --Flag i tekrar kapayalım.
    DBCC TRACEOFF(3226)
    GO

    Error Log’a baktığımızda gerçektende backup işleminin loglanmadığını göreceğiz.

    Clipboard03


Trace Flag’i açma işlemi sadece ilgili sessionda gerçekleştiği için bu yöntemle her defasında açmanız gerekmektedir. Bu sıkıntıyıda aşmak için bu trace flag’i –T parametresi ile Servis açılışına ekleyebilirsiniz.

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Bugünkü yazımda SQL Server Analysis Service te kullanılan OLAP Database lerinin nasıl yedekleneceğini ve yedeklenen bu backup dosyaları kullanılarak nasıl restore yapılacağını görüyor olacağız.

[more]

  1. Yedeklenecek veritabanına sağ tıklayıp backup linkine tıklayalım.

    image
  2. Gelen ekranda Browse kısmından backup dosyasına bir ad verelim. Bu arada browse kısmında sadece belirli folder ların göründüğü dikkatinizi çekecektir. Bu ayarlamanın nereden yapıldığına bakmak için Instance ın üstüne sağ tıklayıp açtığınız properties kısmında ki BackupDir kısmını kullanabilirsiniz.

    image
    image 

    Tekrar backup ekranına dönecek olursak; sıkıştırma yapmak istemediğimizden dolayı Apply compression yazısının check ini kaldırıyoruz. Son olarak Şifreleme yapmak istiyorsak password bilgisini girip OK e basıyoruz ve backup işlemini tamamlıyoruz.

    image
  3. Şimdi backup ladığımız bu veritabanı restore etmeye çalışalım. Bunun için Database yazısına sağ tıklayıp restore linkine tıklayalım.

    image  
  4. Gelen ekranda browse kısmından backup dosyamızı bulup seçelim ve OK e basalım.

    image
  5. Restore Database ekranında database in ismi yani DenemeDB bilgisini girelim. Ayrıca olan bir database in üstüne restore etmek istediğimiz için Allow database overwrite yazısınıda seçerek OK e basalım ve restore ü başlatalım.

    image
  6. Restore işlemi tamamlandığında ekran kapanacaktır.

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Master database SQL server ın en önemli sistem database i olduğu için backup stratejimizi kesinlikle dahil etmeliyiz.

Makaleme devam etmeden önce sistem database leri ile alakalı yazdığım aşağıdaki yazılarımı okumanızı tavsiye ederim.

SQL Server Sistem Veritabanları
TempDB Database File larını Taşımak
Master DB Database File larını Taşımak

Dediğimiz gibi master DB SQL Server ın en core sistem database idir. Zarar gördüğü durumlarda SQL Server service i restart olamaz.

Peki master DB ne gibi bilgiler içerir. Aşağıda ufak bir özetine geçiyorum.

  • Login Nesneleri
  • Sistem Konfigurasyon Bilgileri
  • Endpoint ler
  • User Database Bilgileri
  • Servis in restart olması için gerekli bilgiler

Dolayısıyla master DB nin backup stratejisi içine dahil edilmesi çok yerinde bir hareket olacaktır. SQL Server da SQL Agent ile otomatik backup alma ile alakalı yazıma aşağıdaki linkten erişebilirsiniz.
SQL Server 2008 de Otomatik BackUp için Job Oluşturma (Schedule)

Bu arada not olarak verelim; master DB nin sadece full backup ı alınabilmektedir. Differential yada TLog backup ı alınamaz.

 

Master Database Full Backup


Master DB nin full backup ının alınması diğer User Database ler ile aynıdır. Örneğin aşağıdaki kod ile master DB nin backup ını c:\ root una alalım.

BACKUP DATABASE [master] TO DISK = N'c:\masterbackup.bak' 
GO

 

Master Database Restore


Master DB backup landıktan sonra master DB yi etkileyen bazı değişiklikler yapıldıysa bunlar ne yazık ki restore edilemeyecektir.

Örneğin Backup tan sonra user create edildiyse Restore işleminden sonra bu user lar tekrar create edilmesi gerekmektedir.

Yada Database create edildiyse restore işleminden sonra bu database leri attach etmek en mantıklı yoldur. Eğer bu konuda bilgi almak isterseniz Attach işlemi ile alakalı yazımı okuyabilirsiniz.

Şimdi master DB nin restore adımlarına bakalım

  1. Service i stop ediniz. Bunun için command prompt ta aşağıdaki kodu kullanabilirsiniz.
    net stop MSSQLSERVER
  2. Service i single-user mode da start ediniz.
    Default instance için command prompt ta aşağıdaki kodu kullanabilirsiniz.
    sqlservr.exe –m
    Named instance için ise command prompt ta aşağıdaki kodu kullanabilirsiniz.
    sqlservr.exe -m -s <instancename>
  3. Şimdi restore işlemini yapacağız. Bu işlemi sqlcmd ile command prompt tan gerçekleştireceğiz. Aşağıdaki SQL script i command prompt ta sqlcmd den sonra çalıştırınız.
    SQLCMD
    RESTORE DATABASE master FROM DISK = 'c:\masterbackup.bak' WITH REPLACE;
    GO
  4. Restore işleminden sonra SQL Server service i stop olup sqlcmd nin çalıştığı ekran kapanacaktır.
  5. SQL Server ı start edin
    net start MSSQLSERVER


İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Bugün karşılaştığım ilginç bir hata mesajından bahsetmek istiyorum.

Instance ımda bulunan bir çok DB yi backuplarken herhangi bir hata almazken 100GB ın üzerinde bulunan bir DB yi backuplarken aşağıdaki hatayı aldım.

"failed with the following error: "A nonrecoverable I/O error occurred on file "C:\Backup\xx.bak" (The specified network name is no longer available.)

Bu hata ilk bakışta disk problemi havası vermekte. Fakat internette kısa bir araştırmadan sonra hatanın disk in bozukluğuyla değil boyut yetersizliği ile alakalı olduğunu gördüm :) İnsan daha mantıklı bir hata verir değil mi:)

Benim açımdan problemin çözümü compress backup kullanmak oldu.

Sizinde aklınızın bir yerinde bulunsun. Bu hatayı alırsanız disk im corrupt oldu diye üzülmeyin:)

Bu arada SQL Server 2008 de table ve backup compress ile alakalı yazımı buraya not düşeyim. Belki daha önce kullanmamış olan arkadaşlarımız vardır.

http://www.turgaysahtiyan.com/post/SQL-Server-2008-de-Table-ve-BackUp-Compression-%28Sc4b1kc4b1stc4b1rma%29.aspx

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Bildiğiniz gibi Management Studio üzerinden  bir DB nin en son ne zaman backup ının alındığına bakabiliyoruz. Bunun için bakmak istediğimiz database e sağ tıklayıp properties ekranını açıyoruz.

 ldb1

Bu ekrandaki Last Database Backup yazısının yanındaki tarih database in en son ne zaman backuplandığını gösteriyor.

 

Ayrıca database reportlarındaki Backup and Restore Events ten de bir DB nin backup tarihçesine bakabiliriz.

Bunun için Database>>Reports>>Standart Reports>>Backup and Restore Events tıklıyoruz. Daha sonra açılan pencerede Successful Backup Operations yazısını tıklarsak bu ekran bize bu DB için gerçekleşen başarılı backup operasyonlarını verecektir.

 ldb2

ldb3

Sistemimizde çok sayıda database var ise ve biz bu database lerin son backup alınma tarihine bakmak istiyorsak yukarıda anlattığım 2 yöntemde oldukça zaman alıcı yöntemler.

Peki bütün database ler için son backup alma tarihini tek bir script ile öğrenemezmiyiz. Tabiki öğrenebiliriz. Bugünkü makalemizin nedenide bu :)

Aşağıdaki script ile sistemde bulunan tüm database lerin son backup alınma tarihini öğrenebilirsiniz.

SELECT sd.Name as DatabaseName,
COALESCE(Convert(varchar(12), MAX(bs.backup_finish_date), 101),'Daha Backup Alınmamış') as LastBackUpDate,
COALESCE(Convert(varchar(12), MAX(bs.user_name), 101),'NA') as UserName
FROM sys.sysdatabases sd
LEFT OUTER JOIN msdb.dbo.backupset bs ON bs.database_name = sd.name
GROUP BY sd.Name
ORDER BY sd.Name

 

Benim sistemimde çıkan sonuç

ldb4

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Bu yazımda sıkça sorulan bir konudan bahsetmek istiyorum. “Log dosyası olmadan bir Database Attach edilebilir mi?”

Bu sorunun cevabına geçmeden önce Attach ve Detach hakkında biraz laflayalım.

Backup ile bir DB nin backup ını alıyor ve başka bir ortama restore edebiliyoruz. Attach ile ise Bir DB nin SQL Server a olan bağlantısını kesip, Detach ile tekrar bu bağlantıyı kuruyoruz.

Detach işlemi yapıldığında DB nin SQL Server la bağlantısı kalkıyor dedik. Peki ya bu DB ye ait Data ve Log file lar? Bu dosyalar olduğu gibi disk te kalmakta. Daha sonra bu dosyaları kullanarak istediğimiz server a Attach işlemini gerçekleştirebiliriz.

Burada ufak bir bilgi vermek istiyorum. SQL Server açısından 32 bit ve 64 bit dosya yapısı aynı. Yani attach işlemi 32 bit – 64 bit server lar arasında çalışabilmekte.

Peki nasıl bir case de Attach-Detach kullanırız? Örneğin bir DB yi bir serverdan alıp başka bir server a taşıyacağız. Backup-Restore çözümü ilk akla gelen yöntem olmakla beraber, bazen detach edip, file ları diğer server a taşıyıp, attach etmek daha hızlı bir çözüm olabilmekte.

Şimdi Attach ve Detach in nasıl yapıldığına bakalım.

Detach


Detach işlemi eğer aşağıdaki durumlardan biri geçerli ise yapılamaz.

  • Eğer DB replica ediliyor yada publich ediliyor ise detach edilemez.
  • Eğer attach yapılmak istenen DB nin snapshot ları mevcut ise attach işlemi yapılamaz.
  • Eğer DB mirror lanan bir DB ise attach edilemez.
  • Eğer DB suspect mod da ise detach edilemez.
  • System DB leri detach edilemez. (master,msdb,tempdb,model)

SQL Server Management Studio ile Detach İşlemi

  1. Detach edilmek istenen DB ye sağ tıklanıp Detach yazısı tıklanır.
    image 
  2. Ok e basıyoruz ve Detach i bitiriyoruz J Eğer bağlı olan connection ları drop etmek isterseniz drop connection check box ını tıklayabilirsiniz.
    image


T-SQL ile Detach İşlemi

EXEC sp_detach_db 'AdventureWorks', 'true';
  • 1. parametre DB seçimi için kullanılır.
  • 2.parametre ise detach yapılmadan önce table larda UPDATE STATISTICS yapılıp yapılmayacağını belirleyen parametredir. Eğer bu parametre true ise Update Statistics yapılmaz, false ise yapılır.



Attach


Daha önce detach edilmiş yada kopyalanmış bir DB yi attach yapabilirsiniz.

SQL Server Management Studio ile Attach İşlemi

  1. Databases yazısına sağ tıklanıp attach yazısı tıklanır.
    image
  2. Açılan ekranda Data File ı seçmek amaçlı Add butonuna basılır.
    image
  3. Disk ten data file ın bulunduğu yer seçilir ve OK e basılır.
    image
  4. Current File Path kısmından Dosya uzantılarını kontrol ediyoruz. Ayrıca eğer başka bir isimle restore etmek istiyorsak Attach As kısmında istediğimiz DB adını verebiliriz.
    image 
  5. OK e basarak işlemi bitiriyoruz.


T-SQL ile Attach İşlemi

CREATE DATABASE [AdventureWorks] ON 
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\AdventureWorks_Data.mdf' ),
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\AdventureWorks_Log.ldf' )
 FOR ATTACH

 

Evet. Şimdi makalemizin ana konusu olan “Log dosyası olmadan Database Attach etme” konumuza geri dönelim.


Log Dosyası Olmadan Database Attach Etme


Management Studio ile

Data file larının olduğu ekranda log dosyasını seçip remove butonuna basıyoruz.

image

Bu işlemden sonra OK e basarsak yeni bir log dosyası oluşarak attach işlemi sonuçlanacaktır.


T-SQL ile

CREATE DATABASE [AdventureWorks] ON 
( FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\AdventureWorks_Data.mdf' )
 FOR ATTACH

 

İşlem bu kadar basit. Log dosyasını parametreden kaldırmak yeterli.

Ayrıca bu işlem için sp_attach_single_file_db system prosedürü kullanılabilmekte ama daha sonraki versiyonlarda bu sp kaldırılması gündemde olduğu için kullanmamanızı öneririm.


Açıklayıcı bir yazı olduğunu umuyorum.

İyi çalışmalar,

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Database in zarar görmesi yada bunun gibi database e erişilemeyen durumlarda backup alınmamış işlemlerin kayıpsız olarak geri alınabilmesi için kullanılan back up tipi Tail-Log Backup tır.

Sistem böyle bir durumda normal backup scriptlerinin kullanılmasına izin vermez ve sadece Tail-Log Backup kullanabilirsiniz.

Tail-Log Backup ile Backup Alma


Tail Log backup ın kullanılabilmesi için database Recovery Model in full yada bulk-logged olması gerekmektedir. Ayrıca bu backup işlemi GUI den yapılamaz. Not düşmekte fayda var. Log file ın zarar gördüğü durumlarda Tail-Log backup alınamaz.

Aşağıdaki durumlarda Tail-Log Backup alarak backup lanmamış işlemlerinizi kurtarabilirsiniz.

  • Eğer database online ise restore işlemlerine başlamadan önce WITH NORECOVERY option ı ile tail-log backup alabilirsiniz.
BACKUP LOG database_name TO  WITH NORECOVERY

 

  • Eğer database offline ise ve start edilemiyor ise Tail-Log Backup alabilirsiniz. WITH NORECOVERY kullanımı opsiyoneldir. Eğer database damaged ise WITH CONTINUE_AFTER_ERROR yada WITH NO_TRUNCATE option ı kullanılabilir. WITH NO_TRUNCATE option ı damaged database ler haricinde kullanılmaması önerilir.
BACKUP LOG database_name TO  [WITH { CONTINUE_AFTER_ERROR | NO_TRUNCATE }

 

Şöyle bir senaryo düşünelim.

Live ortamda kullandığımız bir database var ve belirli aralıklarla bu database i backup lıyoruz. Yeni backup zamanı gelmeden disk te bir problem oldu ve mdf file bozuldu. Şu anda Database e erişemiyoruz ve normal backup lama işlemlerini yapamıyoruz. Eldeki backup lardan dönersekte veri kaybımız olacak. Bizim amacımız log dosyası vasıtasıyla veri kayıpsız mdf file a tekrar ulaşmak.

Şimdi bunun örneğini yapalım.

İşlemlere başlamadan önce C:\Backup klasörünü yaratalım. Çünkü backup lar buraya alınacak.

use master
GO

--yeni bir database create ediyoruz.
create database TailSampleDB
GO

--yeni bir table create ediyoruz.
use TailSampleDB
create table TailSampleTbl (a varchar(10))
GO

--Yeni bir satır insert ediyoruz.
--Amacımız her backup tan evvel bir satır ilave etmek.
--Son satır ilavesinden sonra mdf file ı sileceğiz ve 
--Tail-Log Backup ile bu satırı yani datanın son halini kurtarmaya çalışacağız.
insert TailSampleTbl select '1'
GO

--İlk satır ilavesinden sonra full backup alıyoruz.
BACKUP DATABASE [TailSampleDB] TO  DISK = N'C:\backup\full.bak' WITH NOFORMAT, NOINIT,  NAME = N'TailSample-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

--İkinci satırı insert ediyoruz.
insert TailSampleTbl select '2'
GO

--İkinci satırdan sonra diff backup alıyoruz.
BACKUP DATABASE [TailSampleDB] TO  DISK = N'C:\backup\diff.bak' WITH DIFFERENTIAL, NOFORMAT, NOINIT,  NAME = N'TailSample-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

--Üçüncü satırı insert ediyoruz.
insert TailSampleTbl select '3'
GO

--mdf file ı silebilmek için sql server service ini stop ediyoruz.
--daha sonra mdf file ı bulup siliyoruz.
--service i tekrar start ediyoruz.
--şu anda SSMS ten database bakacak olursanız erişilemez olduğunu göreceksiniz.
--Ayrıca SSMS üzerinden backup alınmadığını görebilirsiniz.

--Restore işlemlerine başlamadan önce data kaybı olmaması için Tail-Log Backup alıyoruz.
BACKUP LOG TailSampleDB TO DISK='C:\backup\tail.bak'

--Restore lere başlıyoruz. Önce Full restore.
--Tail log backup a kadar restore işlemleri WITH NORECOVERY option ı ile
RESTORE DATABASE [TailSampleDB] FROM  DISK = N'C:\backup\full.bak' WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  REPLACE,  STATS = 10
GO

--Diff back up restore
RESTORE DATABASE [TailSampleDB] FROM  DISK = N'C:\backup\diff.bak' WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  REPLACE,  STATS = 10
GO

--Tail-Log Backup ı restore ediyoruz.
--Bu restore işlemi son adım olduğu için WITH NORECOVERY kullanıyoruz.
RESTORE LOG [TailSampleDB] FROM  DISK = N'C:\backup\tail.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 10
GO

--Tabloyu kontrol ediyoruz
use TailSampleDB
select * from TailSampleTbl

--bingoo
--Son satır olmak üzere bütün satırlar kurtarıldı.

 

Umarım faydalı bir yazı olmuştur.

İyi çalışmalar

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan