SSIS’ de Checkpoint Kullanımı

SQL Server Integration Services kullanarak oluşturduğumuz ETL operasyonlarının temel işi, ihtiyaç duyduğumuz formatta verileri hazırlamaktır ve bu işi mümkün olduğunca otomatize etmek isteriz. Otomatize edilmiş sistemlerin genellikle yumuşak karınları vardır. Oluşabilecek her hangi bir değişiklikle (veri kaynağındaki formatın değişmesi, hatalı bir verinin yol açtığı başka sorunlar, Server problemleri gibi) birlikte hata alabilirsiniz. Bu da başlangıçtan hata alıncaya ve bu hatayı düzeltinceye kadar ki zamanı kaybetmenize yol açar! Aslında daha fazlasına…

Bir ETL süreci düşünün ki performans sorunları yüzünden ya da sahip olunan kaynaklar sonucu çok uzun sürüyor olsun. Mesela 8 saat civarında çalışan ve ancak tamamlanan bir süreciniz var. Bu sürecin yedinci saatinin sonlarında hata aldığınızı hayal edebiliyor musunuz? Basit matematikle açıklayacak olursak; yedi saat süre geçmiş olmasına rağmen elinizde hiç bir şey yok. Bunun üzerine hata için herhangi bir öngörüde bulunarak önlem almadıysanız bunu düzeltmek için kaybedeceğiniz bir süre daha var ve bunu düzelttikten sonra şu ana kadar yapılan işlemleri geri almanız gerekebilir. Bunun için daha önce ki yazılarımdan SSIS’ de Transaction kullanımına bakmanızı tavsiye ederim. Bunu da yapmanıza rağmen önünüzde aynı noktaya gelebilmek adına harcayacağınız bir yedi saatiniz daha var! İyi ihtimalle bir 15 saat kaybetmiş durumdasınız.

Böylesi bir durumda neler yapılabilir? Her şeyden önce olası hatalara karşı her zaman hazırlıklı olacak şekilde SSIS paketleri oluşturmakta fayda var. Fakat buna rağmen hata alma ihtimalimiz olası bir durumdur. Böylesi zamanları ön görerek SSIS içerisinde Checkpoint noktaları oluşturabiliriz. Checkpoint oluşturmak bir hata aldığınızda ve bunu düzelttikten sonra paketi tekrar çalıştırdığınızda eğer tanımlanmış bir checkpoint varsa hata alınan yerden başlayarak devam etmemize yardımcı olur.

Nasıl çalıştığından biraz bahsedecek olursak; ilgili paket için bir Checkpoint tanımladığınızda, SSIS bir XML dosyası oluşturur. Başarılı bir şekilde çalışan executable’ ları (Data Flow, Container’ lar, Diğer Control Flow Task’ leri gibi) ve o anda sizin tarafınızdan tanımlanmış (User Defined) variable’ ları bu dosyada tutar. Eğer paket başarılı bir şekilde tamamlanırsa oluşturulan dosya silinir. Eğer herhangi bir executable’ da hata olduğu için paket durmuşsa bu bilgiyi içinde saklar. Bir sonraki çalışma anında XML dosyasına bakar ve kaldığı yerden devam eder. Aşağıda nasıl çalıştığını daha iyi anlayabiliriz.

Aşağıda bir Data Flow içerisinde bir dosyadan okuduğumuz verileri ilgili tabloya aktarmadan önce veri üzerinde bir güncelleme işlemi yapıyoruz. Sonra dosyayı aktarılan veriler klasörüne koyuyoruz.
No Checkpoint
Bu paket üzerinde bir Checkpoint tanımlamak için öncelikle Control Flow üzerinde herhangi bir yere basarak paket property’ lerine gidiyoruz. Aşağıdaki property’ leri düzenlememiz gerekiyor.

CheckpointFileName: Checkpoint dosyası için path ve dosya adı veriyoruz.
CheckpointUsage: Paket içerisinde checkpoint kullanılacaksa buradan belirtiyoruz. Aşağıdaki değerlerden uygun olanını seçmemiz gerekiyor.
Never: Checkpoint kullanılmayacak anlamına geliyor. Aynı zamanda paketlerde Default değerdir.
IfExists: Eğer var olan bir Checkpoint dosyası varsa kullanılarak bir önceki çalışma anında kaldığı yerden devam eder. En sık kullanılan seçenektir diyebilirim.
Always: Paketin her çalışmasında Checkpoint dosyasının kullanılacağı anlamına geliyor. Eğer Checkpoint dosyası yoksa paket hata alacaktır!
SaveCheckpoints: Default olarak False gelir. Eğer Checkpoint kullanılacaksa True olarak seçilmelidir.
Checkpoint
Bundan sonrası kritik! Dikkat ettiyseniz Checkpoint oluştururken paket property’ lerini konfigüre ettik. Peki bunu task’ ler bazında nasıl yaparız? Yani hangi task’ de hata alırsak kaldığı yerden devam edecek? Hangi task’ ler ya da Container’ lar için bunu sağlamak istiyorsak, onun property’ lerini konfigüre etmeliyiz. Bunun için FailPackageOnFailure property’ sini True yapmamız yeterli olacaktır. Bu property’ sini True yapmadığımız bir task için hata alırsak, XML dosyasında bununla ilgili bir kayıt olmayacağından paket yeniden başlatıldığında checkpoint kullanılmayacaktır!

Execute SQL Task için FailPackageOnFailure property’ sini True olarak seçiyoruz.
FailPackageOnFailure
Bir sonraki adım olarak Execute SQL Task’ in hata almasını sağlayacağız. Bunun ForceExecutionResult property’ sini Failure olarak seçiyoruz. (Bu property’ yi test yaparken kullanırsanız işini çokça kolaylaştıracaktır. ) Hata alıp XML dosyasına gerekli bilgilerin yazılması için paketi çalıştırıyoruz.

Aşağıda gördüğünüz gibi paket çalışma sırasında hata aldı. SSIS yukarıda tanımladığımız Checkpoint property’ leri doğrultusunda XML dosyasını oluşturdu.
Error
Eğer merak ederseniz, belirtiğiniz dosya yolunu takip ederek Checkpoint dosyasının içeriğine bakabilirsiniz. Artık hatayı düzelttikten sonra paketin nasıl davranacağını izleyebiliriz. Şu anda başarılı bir şekilde çalışan ve hata veren task’ lerin hangileri olduğu bilgisi elimizde var. ForceExecutionResult property’ sini tekrar None yaptıktan sonra paketi tekrar çalıştırıyoruz.
Result
Beklediğimiz gibi paket kaldığı yerden devam ederek tamamlandı. bu işlemden sonra Checkpoint dosyasını koyduğumuz dosya yolunu kontrol edecek olursanız artık herhangi bir dosya olmadığını göreceksiniz. Paket başarılı bir şekilde tamamlandığı için herhangi bir şey kayıt altına alınmadığı için SSIS dosya oluşturmaya gerek duymadı.

Checkpoint ve Transaction’ lar doğru şekilde kullanıldıklarında SSIS ile yapacağımız projelerde işimizi kolaylaştıracaklardır. Fakat dikkat edilmesi gereken önemli noktalar olduğunu söyleyebiliriz. Bunlardan bir kaçından bahsetmek istiyorum. Control Flow içerisinde For Each Loop ya da For Loop Container kullanacaksanız bunlar için checkpoint kullanmanız anlamlı olmayacaktır! Çünkü loop container’ lar içerisinde kullanacağınız checkpoint’ ler kayıt altına alınmazlar. Dolayısıyla hangi task’ lerin başarılı ya da başarısız sonuçlandığını bilemezsiniz. Eğer bu hataya düşerseniz container içerisinde hata almamış bir task’ in tekrar çalıştığını göreceksiniz.

Eğer Sequence Container kullanacaksanız burada da dikkat etmeniz gereken noktalar var. sonuç beklediğiniz gibi olmayabilir! Sequence Container’ larla birlikte Transaction‘ ları kullanmanızı şiddetle tavsiye ederim. Yaşayacağınız sorunları kontrol altına almanız için kolaylık sağlayacaklardır.

Yukarıda oluşturduğumuz paketi kullanarak, executable’ ları bir Sequence Container içerisine alıyoruz. Sequence Container için FailPackageOnFailure property’ sini True olarak seçiyoruz. Hata ile sonuçlandıracağımız Execute SQL Task için bu sefer FailParentOnFailure seçeneğini True yapıyoruz ve paketi çalıştırıyoruz.
Sequence Container
Şu andan sonra paketi tekrar çalıştırdığımızda Execute SQL Task ile işleme başlayarak paketin başarılı şekilde tamamlanmasını gözlemleyeceğiz. Fakat aşağıdaki gibi bir sonuç doğuyor!
Sequence Container Result
Paket içerisinde Transaction tanımlamış olsaydık, yaptığımız işlemleri roll-back ederek paketin Sequence Container’ dan başlamasını sağlayabilirdik. Transaction kullanırken dikkat etmeniz gereken bir durum var. Eğer bir paket hata alır ve durursa, yeniden başlattığınızda bir önceki çalışmasında başarılı bir şekilde commit ettiği transaction’ ları tekrar yapabilir.

Bu konuda değerlendirebilecek çok fazla senaryo var. Bunlarla yüzleşmemek adına henüz paketler dizayn edilirken Checkpoint noktaları planlanarak ilerlenmelidir. Her işi bir Data Flow içerisinde yapıyor olmak yerine bunu alt parçalara bölerek checkpoint kullanımı ile desteklerseniz zaman ve efor kaybınızı minimize edebilirsiniz.

Reklamlar
Bu yazı SSIS içinde yayınlandı ve , , , olarak etiketlendi. Kalıcı bağlantıyı yer imlerinize ekleyin.

One Response to SSIS’ de Checkpoint Kullanımı

  1. Geri bildirim: SSIS’de checkpoint kullanımı | Veri Yönetimi Departmanından Haberler

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s