Stretch Database Nedir
Kendi sistemlerinizdeki veritabanlarınızı Azure’a arşivlemek isterseniz ihtiyacınız olan şey StretchDatabase’dir. Özellikle büyüyen ve silmek istemediğiniz eski verilerinizi Azure’a arşivleyip istediğiniz gibi sorgulayabilirsiniz.
Stretch Database ile verinizin pahalı sistemlerinizde çok büyümesini engelleyerek, disk maliyetini, backup maliyetini ve bakım maliyetlerini azaltabilirsiniz, backup restore sürelerinizi kısaltabilirsiniz.
Ayrıca en önemlisi uygulama içersinde bir değişiklik yapmadan bütün tabloyu aynı şekilde sorgulayabilirsiniz.
Eğer veri Azure üzerinde ise Azure üzerinden, kendi sistemlerinizde ise kendi sistemlerinizden uygulamaya iletilecektir. Bu işlemlerin kontrolü arka tarafta SQL Server tarafından halledilecektir.
Microsoft bir özelliği ilk çıkardığında genellikle o özelliği tam anlamıyla kullanamayız. Bir sürü kısıtlama olur. Bu özellikte de şu an itibariyle bir çok kısıtlama var. Ama birkaç sürüm sonra bu kısıtlamalardan kurtulacağımızı düşünüyorum.
Stretch Database Kısıtlamaları:
- Azure’a aktarılmış verileri update veya delete yapamıyoruz.
- Stretch yapılmış tabloya linked server ile insert yapamıyoruz.
- Stretch yapılmış tablo için indexed view oluşturamıyoruz.
- Kendi sistemimizdeki index’ler üzerinde oluşturduğumuz filter’lar azure üzerindeki yabloya aktarılamıyor. “Filtered Index Nedir” isimli makalede filtered index hakkında bilgi bulabilirsiniz.
- 1023 kolondan fazla kolon sayısı ve 998 index’ten fazla index sayısı olan tablolar stretch yapılamıyor.
- File table ya da filestream veri içeren tablolar stretch yapılamıyor.
- Replike edilen, Change Tracking ya da Change Data Capture kullanan tablolar stretch yapılamıyor. “SQL Server Replication Nedir?” ve “Change Data Capture(CDC)” isimli makaleleri okumak isteyebilirsiniz.
- Memory Optimized Tablolar stretch yapılamıyor.
- “text, ntext, image, timestamp, sql_variant, XML, geometry, geography, hierarchyid, veCLR user-defined types” veri tipleri içeren tablolar stretch yapılamıyor.
- COLUMN_SET içeren tablolar stretch yapılamıyor.
- Computed Column içeren tablolar stretch yapılamıyor. “Computed Column Nedir ve Nasıl Kullanılır?” isimli makaleyi okumak isteyebilirsiniz.
- Default Constraint ya da Check Constraint içeren tablolar stretch yapılamıyor. “CHECK CONSTRAINT” isimli makaleyi okumak isteyebilirsiniz.
- Foreign Key’de parent tablo stretch yapılamıyor. “Primary Key ve Foreign Key” isimli makaleyi okumak isteyebilirsiniz.
- Fulltext Index, xml Index, spatial Index içeren tablolar stretch yapılamıyor. “Full-text Search” isimli makaleyi okumak isteyebilirsiniz.
Bir örnek yaparak konuyu netleştirelim.
Aşağıdaki script yardımıyla bir tablo oluşturalım.
CREATE TABLE [dbo].[StretchTable]( [ID] [int] IDENTITY(1,1) NOT NULL, [Ad] [varchar](50) NULL, [Soyad] [varchar](50) NULL, [Tarih] [datetime] NULL, CONSTRAINT [PK_StretchTable] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
Daha sonra aşağıdaki script’i 30 saniye çalıştırarak tablomuza biraz kayıt ekliyoruz. Tarih kolonunun değeri her seferinde belirtilen iki tarih arasındaki random bir değer oluyor.
USE [test] GO DECLARE @ilktarih DATETIME = '20000101' DECLARE @sontarih DATETIME = '20170101' DECLARE @fark INT = DATEDIFF(DD,@ilktarih,@sontarih) while(1=1) BEGIN DECLARE @rasgeletarih datetime; select @rasgeletarih= DATEADD(DD,@fark*RAND(),@ilktarih) INSERT INTO [dbo].[StretchTable] ([Ad] ,[Soyad] ,[Tarih]) VALUES ('Nurullah' ,'ÇAKIR' ,@rasgeletarih ) END
Örneğin 2015-01-01’den önceki verileri stretch database özelliğini kullanarak azure’a arşivleyeceğimizi düşünelim. Öncelikle bu tarihten önce kaç kayıt insert ettiğimizi aşağıdaki script yardımıyla bularak bir yere not edelim.
SELECT Count(*) FROM [test].[dbo].[StretchTable] where Tarih<'2015-01-01' --256667
İlk olarak aşağıdaki script yardımıyla Instance seviyesinde Stretch Database’i aktif ediyoruz.
EXEC sp_configure 'remote data archive', 1; RECONFIGURE;
Daha sonra veritabanına sağ tıklayarak Tasks-Stretch-Enable diyoruz.
Karşımıza gelen ekranda arşivleyeceğimiz tablomuzu seçiyoruz.
Migrate kısmında EntireTable yazıyor. Biz tüm tabloyu arşivlemek istemiyoruz. Sadece tablomuzdaki Tarih kolonu 2015-01-01 tarihinden önceki verileri arşivlemek istiyoruz. Bu yüzden EntireTable yazan yere tıklıyoruz.
Karşımıza gelen ekranda aşağıdaki gibi Choose Rows’u seçiyoruz.
Name kısmından bir isim veriyoruz.
Where kısmından Tarih isimli kolonumuzu seçiyoruz.
Ortadaki filtre kısmından < işaretini seçerek Value kısmına arşivlemek istediğimiz tarihi yazıyoruz ve Check diyoruz. Success şekline bir geri bildirim aldıktan sonra done ve next diyerek ilerliyoruz.
Bir sonraki ekranda Azure hesabımızı girmemiz gerekiyor. Sing In… yazan kısma tıklıyoruz.
Azure hesabınızla oturum açma işlemi tamamlandıktan sonra karşınıza aşağıdaki gibi bir ekran gelmeli.
Bu ekranda Azure üzerinde daha önce SQL Database ile oluşturmuş olduğum Server’ı kullanmak için Existing server diyorum. “Azure Üzerinde SQL Database Oluşturmak” isimli makalede nasıl oluşturulacağını görebilirsiniz.
Create new server diyerek bu ekranda yeni bir server’da oluşturabilirsiniz.
Sonraki ekranda veritabanı kimlik bilgilerimizi korumak için bir master key oluşturulacağı söylüyor. Bu master key için bir şifre giriyoruz.
Bir sonraki ekranda SQL Server’dan Azure’a erişirken Azure’un kabul edeceği IP ya da IP listesini belirliyoruz.
Use source SQL Server Public IP’yi seçerek tek bir IP için,
Use subnet IP range’i seçerek bir IP aralığı için Azure’dan izin istemiş oluruz.
Microsoft IP aralığına izin istemizi tavsiye ediyor. Ben kendi makinemden test işlemi yaptığım için ilk seçeneği seçiyorum.
Son olarak karşımıza aşağıdaki gibi bir ekran çıkıyor. Finish diyerek işlemi tamamlıyoruz.
Bu işlemden sonra ven Configure Azure kısmında aşağıdaki gibi bir hata aldım. Görünen o ki artık free trial ile oluşturulmuş hesaplar için stretch database özelliğini kullanamıyoruz. (Öncesinde free trial’da stretch database oluşturabiliyorduk)
Dolayısıyla makalenin bundan sonraki kısmında örneğimize devam edemeyeceğim. Microsoft’un böyle deneme işlemleri için bu özelliği kısıtlamasını çok mantıklı bulmadığımı söyleyerek örneğimi burada noktalamak zorunda kalıyorum.
‘Task failed due to following error: Microsoft.SqlServer.Management.Smo.FailedOperationException:
Alter failed for Database ‘test’. —> Microsoft.SqlServer.Management.Common.ExecutionFailureException: An exception occurred while executing a Transact-SQL statement or batch. —> System.Data.SqlClient.SqlException: ‘
Free Trial subscriptions can provision Basic, Standard S0 through S3 databases, up to 100 eDTU Basic or Standard elastic pools and DW100 through DW400 data warehouses’
Eğer siz Azure’un deneme sürümü yerine tam sürümünü kullanıyorsanız burada hata almadan işleminiz tamamlanacaktır.
Aşağıdaki script’i çalıştırarak lokaldeki ve azure’daki satır sayınızı öğrenebilirsiniz.
sp_spaceused @objname = 'dbo.StretchTable', @mode = N'LOCAL_ONLY' GO sp_spaceused @objname = 'dbo.StretchTable', @mode = N'REMOTE_ONLY'
Stretch Database yapısından vazgeçmek isterseniz Enable ettiğimiz kısımda Disable seçeneği karşınıza çıkacaktır.
Burada Bring Data Back From Azure seçeneğini seçerseniz Azure’daki verileriniz tekrar tablonuza gelecektir.
Ya da Leave Data In Azure seçeneğini seçerseniz de verilerinizi Azure’da bırakmış olursunuz.
Sitemizdeki menüdeki Azure sekmesinde Azure ile ilgili diğer makalelere erişebilirsiniz.