SSIS’ de Transaction Kullanımı

Integration Services kullanarak bir çok mission critical sisteme veri aktarıyorsunuz yada başka işlemler yapıyorsunuzdur. Control Flow boyunca bir çok paket bir çok executable peşi sıra çalışıyordur. Diyelim ki düzenli olarak veri aktardığınız bir veri ambarı var. Verilerinizi aktarırken bir kısmını update ettiğinizi düşünün ve belirli bir noktadan sonra paket hata verdi! Yaptığınız değişiklikleri geri alabilir misiniz? Raporlarda görünecek sonuçlara etkimiş durumdasınız. Büyük bir kriz olacabilecek bir durum. Bu tip kritik gördüğünüz executable’ lar (Paketler, Containerlar, Tasklar) için Transaction tanımlayarak gerçekleştirdiğiniz işlemleri roll-back edebiliyorsunuz.

SQL Server Data Tools kullanarak oluşturduğum örnek veri aktarım paketi aşağıdaki gibidir. Öncelikle bir kısım veriyi başarılı bir şekilde aktardıktan sonra Transaction tanımlayacağız ve davranışını gözlemlememiz daha kolay olacak.

İlk etapta veri aktaracağım DimCustomer ve FactInternetSales tablolarım boş durumda.
Tables

 

 

 

 

 

 

 

 

 

 

 

 

 

Load Customer ve Load Internet Sales data flowları ile veri ambarına verileri aktarıyorum.

Load

 

 

 

 

 

 

Daha sonra Staging tarafında veriler üzerinde değişiklikler yapıyorum ve yeni bir aktarım gerçekleştiriyorum. Fakat yaptığım değişikler sonucu hata alıyorum.
Error
Tablolardaki verileri silerek süreci baştan alıyorum ve bu akış boyunca her hangi bir hata olursa bütün süreci roll-back etmek için Transaction tanımlayacağız. Bunun için Sequence Container’ ın property’ lerine giderek; IsolationLevel ve TransactionOption propertylerini set etmeliyiz. Isolation Level default olarak Serializable geliyor. Listede SQL Server’ dan bildiğimiz transaction seçeneklerini göreceksiniz. Serializable olarak bırakıyoruz. TransactionOptionlarda üç farklı seçeneğiniz var.

Not Supported: Eğer tanımlanmış bir transaction varsa ona dahil eder.
Supported: Eğer tanımlanmış bir transaction varsa bu executable’ o ona dahil eder.
Required: Eğer tanımlanmış bir transaction varsa ona dahil eder yoksa kendisi bir transaction tanımlar.
Burada bir transaction başlatmak için Required seçeneğini seçiyoruz.
Transaction
Transaction tanımladık şimdi paketi çalıştırıyoruz.
Error Transaction

 

 

 

 

 

 

 

Yine hata aldık fakat bu sefer tablolar boş durumda. Tanımladığımız transaction ile birlikte aktarılan kayıtlar roll-back edildi.
Table Final

 

 

 

 

 

 

 

 

 

 

 

 

 

Paket seviyesinde transaction tanımlayarak paket boyunca yaptığınız her işlemi roll-back edebilirsiniz. Bunun için Control Flow üzerinde herhangi boş bir alana tıkladıktan sonra F4‘ e basmanız yeterli. Ondan sonra yine IsolationLevel ve TransactionOption property’ lerini set etmelisiniz.

SSIS içinde yayınlandı | , , , ile etiketlendi | 3 Yorum

DbProviderFactories Hatası Çözümü

SQL Server kurulu olan sisteminize IBM DB2 provider yükledikten sonra tablo oluşturmaya çalıştığınızda yada SQL Server Management Studio aracını açmak istediğinizde aşağıdaki hatayı alabilirsiniz.

ADDITIONAL INFORMATION:

The ‘DbProviderFactories’ section can only appear once per config file. (System.Configuration)

Yapmanız gereken aşağıdaki dosyaları kontrol etmeniz ve </DbProviderFactories> ifadesini silmeniz. Yaptığınız değişiklikleri silmeniz ya da SQL Server/Visual Studio kurulumlarını yeniden yapmanız bir fayda sağlamayacaktır.

C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\Machine.Config
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Machine.Config

Her bir dosya için ayrı ayrı aşağıda belirttiğim satırı siliyorsunuz.

<DbProviderFactories>
			<add name="IBM DB2 for i5/OS .NET Provider" invariant="IBM.Data.DB2.iSeries" description=".NET Framework Data Provider for i5/OS" type="IBM.Data.DB2.iSeries.iDB2Factory, IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26"/>
			<add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
</DbProviderFactories>
<!-- Silinecek Satır!!! --><DbProviderFactories/>
	</system.data>

Değişiklikleri yaptıktan sonra SSMS’ yu yeniden başlatıyoruz.

SQL Server içinde yayınlandı | , , ile etiketlendi | Yorum bırakın

Paralel Çalışan ETL Paketleri Oluşturma

Diyelim ki elimizde veri tabanı şemaları birbiriyle aynı olan ETL paketleri var. Mesela aktarımı yapılacak olan şubelerden, bayilerden ya da farklı ülkelerden gelen veriler var. Genellikle bu paketler içerisindeki veriyi aktarmak için For Loop Task gibi bir yapı kullanılır. Bu gibi döngülerin olduğu ETL çözümlerinde zaman problemlerinden şikayet edilir. Örnek olarak toplamda 8 saate tamamlanan bir paketimiz olduğunu varsayalım. Bu ETL paketi içersindeki olası bir hata sonucu o gün için aktarımı gerçekleştirememiş olmamız kullanıcılara sunduğumuz raporların güncelliğini yitirmesine sebep olur. Bu tip bir paket içerisinde bir şubenin aktarımlarının yapılması için bir başka şubeyi beklemesine gerek yoksa her şubenin bir diğerinin tamamlanmasını beklemesi sürenin bu kadar uzamasının asıl sebebidir. Her şube için ayrı ayrı ETL çözümleri oluşturmadan, varolan paketi aynı anda bütün şubelerin kullanması mümkün olabilir mi? Eğer bu mümkün olursa paket süresi, aktarımı en uzun süren şubenin tamamlanması kadar sürecektir.

Öncelikle cevabı verelim; böyle bir şey mümkün. Aşağıda bunu nasıl yapabileceğinizin bir örneğini görebilirsiniz.

Senaryo şu şekilde; birbirleriyle aynı şemaya sahip ama birbirinden farklı sunucularda ve dolayısıyla farklı veri tabanlarında olan veriyi hedef sunucudaki veri tabanına taşımak istiyorsunuz. Öncelikle işlemi gerçekleştirmek için bir kaç tane kaynak veri tabanı, bir tane hedef veri tabanı ve bunların ortak kullanacağı bir ETL paketine ihtiyacımız var. Bu tek başına bir paket olabileceği gibi bir çok paketin olduğu kompleks bir projede olabilir. SSIS içerisinde yapmanız gereken; kaynak sunucular ve veri tabanları için Project Variable oluşturmuş olmanız gerekiyor.

Image

Daha sonra kaynak veri tabanlarına bağlanmak için oluşturduğunuz connection manager’ ın property’ lerine girerek ServerName ve InitialCatalog değerlerini oluşturduğunuz proje parametreleri ile set etmeniz gerekiyor.

Image

ETL paketinizi de tamamladıktan sonra artık deployment için uygun ortamı hazırlamanız gerekiyor. SQL Server 2012 ile birlikte gelen project deployment modeli kullanabilmek için öncelikle Integration Services Catalogs altında bir SSISDB oluşturmanız gerekli. Oluşturacağınız projeleri burada istediğiniz gibi alt klasörlere koyarak yönetebilir, yetkilendirmelerini yapabilir hatta deploy ettiğiniz paketlerin geçmiş versiyonlarına bile gidebilirsiniz. Bu adımdan sonra kaç farklı veri tabanına bağlanmanız gerekiyorsa o kadar environment variable oluşturmanız gerekiyor. Project variable olarak oluşturduğunuz değişkenleri environment variable ile eşledikten sonra işlem tamam!

ssiscat3

Buraya kadar yapamadığımızı bilmediğimiz bir şey yoktu. Asıl cevabını aradığımız soru; farklı environment variable’ lar kullanarak aynı paketi eş zamanlı olarak çalıştırabiliyor muyuz? Bunun için schedule etmek üzere bir job oluşturuyoruz. Yalnız bu adımları yapmadan önce job’ ı oluşturduğumuz kullanıcının SQL Server Agent servisine yetkisi var mı kontrol etmeliyiz. Diyelim ki yok. Böyle bir durumda SSIS Package Execution Proxy oluşturmamız gerekiyor. Proxy üzerinden job’ ın owner’ ı olan kullanıcıya gerekli yetkiyi vermemiz lazım. Bu işlem için de öncelikle Credential oluşturmuş olmamız gerekli. Bu bize SQL Server’ dan güvenli bir şekilde dışarıya çıkış yetkisi verecektir. En basit haliyle windows’ da lokal (Domain kullanıcısıda olabilir) bir kullanıcı oluşturup bu kullanıcıya SQL Server Login’ leri üzerinden yetki vererek credential oluşturulabilir. Neden windows user oluşturuyoruz? Bildiğiniz gibi SQL Server’ da Logins SQL Server’ a güvenli bir şekilde bağlanmak için kullanılırlar. Dışarıya güvenli bir şekilde çıkmak için de Credentials kullanıyoruz. Credentials kullanarak SQL Server Agent dışındaki bir hesabın SQL job’ ı çalıştırmasını sağlayacağız. New Credentials diyerek daha önceden oluşturduğumuz lokal windows kullanıcısı için credential tanımlıyoruz.

Credentials

Bu işlemin ardından oluşturduğumuz credential’ ı kullanacak Proxy’ yi oluşturuyoruz. SQL Server Agent altındaki Proxies kısmından ya da SSIS Package Execution üzerine gelerek New Proxy diyoruz ve oluşturduğumuz credential ile birlikte SSIS job’ ı çalıştıracak proxy tanımını yaratıyoruz.

Proxy

Artık job oluşturmak ve bunu çalıştırmak için bir engel kalmadı. SQL Server Agent üzerinde sağ tıklayarak New->Job diyoruz ve karşımıza çıkan ekranın Owner kısmında Credential bilgilerini verdiğimiz Windows kullanıcısını yazıyoruz.

Job1

Daha sonra Steps sekmesinde New diyerek yeni bir job adımı oluşturuyoruz. Step Name alanını doldurduktan sonra Type kısmıda SQL Server Integration Services Package seçeneğini seçiyoruz. Run as kımında ise oluşturduğumuz Proxy’ yi seçmemiz gerekiyor. Package Source kısmında SSIS Catalog seçilmişken Server adını yazıp authentication bilgilerini yazıyoruz.

Job2

Oluşturacak olduğumuz job adımı için ilgili paketi seçip configuration kısmında kullanacak olduğumuz Environment ile paket içerisindeki değişkenleri eşliyoruz. Bu adımı, bu environment variable’ kullanarak çalıştır demiş oluyoruz. Tamam diyerek bu işlemi bitiriyoruz.

Image

Son adım olarak Schedules sekmesine tıklıyoruz ve burada oluşturduğumuz adımı veya adımları schedule ederek işlemi tamamlıyoruz. (Schedule’ ı Enable etmeyi unutmayın!)

Image

Job oluştururken izlediğimiz adımların aynısını diğer Enviroment’ lar içinde tamamladıktan sonra belirlediğimiz zaman geldiğinde hedef tabloya Select çekerek verilerin aktarıldığını görebilirsiniz. Böylece ETL paketlerimizi farklı ortamlar için birbirini bekleme zorunluluğu olmadan, eş zamanlı olarak çalıştırmış oluyoruz.

Paketlerin birbirlerinden bağımsız olarak paralel çalışmaları bu karakteristiğe sahip paketlerin çalışma sürelerini bir hayli azaltacaktır.

SSIS Project Parameters: http://technet.microsoft.com/en-us/library/hh213214.aspx

Environment Variables: http://stackoverflow.com/questions/15206184/how-to-configure-ssis-2012-project-to-run-under-different-environment-configurat
Create a SQL Server Agent Proxy: http://technet.microsoft.com/en-us/library/ms175834.aspx

Create a Credential: http://technet.microsoft.com/en-us/library/ms190703(v=sql.110).aspx

Schedule a Package by using SQL Server Agent: http://technet.microsoft.com/en-us/library/gg471507.aspx

SSIS içinde yayınlandı | , , , , , , , ile etiketlendi | 1 Yorum