~/Ali GÖREN

SQL Server’da Veri Değişikliklerini İzlemek: CDC ve Change Tracking Nedir?

Ali Goren · · 4 dk okuma

SQL Server’da Veri Değişikliklerini İzlemek: CDC ve Change Tracking Nedir?


Herkese selamlar. Son yazının üzerinden 240 yıl falan geçti. Bu yazıyı da arayı fazla uzatmamak adına yazmak istedim.

Şimdi bu yazının konusu CDC yani Change Data Capture olayı. Bir de yan sanayi olarak Change Tracking olayı var. Aslında ikisi de aynı işi yapıyorlar. Sadece maliyet noktasında farklılıkları var.

Change Data Capture, SQL Server’a has bir özellik değil bu arada. Bunu destekleyen farklı veri tabanları da var. Örneğin PostgreSQL, MySQL, MongoDB gibi. Ama bu yazıda ben SQL server üzerine yoğunlaşmak istedim.

Not: Bu yazı sadece CDC ve Change Tracking nedir onu anlatıyor. Diğer yazılarda ise uygulama aşamasına geçerek örnekler sunmak istiyorum.

CDC Tam Olarak Neyi Anlatıyor?

CDC ya da diğer bir özellik olan Change Tracking kavramları, bize veri tabanındaki değişikliklerin anında yakalanmasını ve başka bir yere loglanmasını anlatıyor gibi basit bir şey söyleyebilirim.

Normalde bu işlemler için, client tarafında AOP yaklaşımlı çözümler mevcut iken(Entity Framework tarafında da yine bu işlemler uygulama içerisinde yapılabilmekte), bu yaklaşımda böyle bir gereksinim bulunmamaktadır.

Çünkü burada işlemler en azından SQL Server tarafında veri tabanı tarafından gerçekleştirilmektedir.

Uygulama dışında CDC olmadan başka neler yapılabilirdi? Belki çoktan aklınıza gelmiş olabilir. Trigger kullanımı da bu konuda size destek sağlayabilird. Ancak şu ana kadar baktığınız her şey, ekstra geliştirmeler gerektiriyor.

Faydaları Neler?

Öncelikle ilk faydası, development zamanını düşürmesidir. Yani kendiniz bu iş için ayrıca bir application logic yazmak zorunda değilsiniz.

Database şema değişikliğinin bilinmesi zorunluluğu da yok. Yani yeni kolonlar eklemek zorunda değilsiniz ya da triggerlar ya da ikinci bir tablo. Bu tablo genelde silinen ya da değişen kayıtları basit bir timestamp datası ile tutabiliyor sonuçta. Ama buna da gerek duymuyorsunuz.

Gelelim TTL, retention gibi konulara. Normalde, CDC olmasaydı, siz belirli dataları manuel bir çözüm ile silmek durumunda kalabilirdiniz. Bu tablo sadece değişenleri tutan bir tablo olduğu için, ilgili işlem bitince, silinmeleri gerekiyor sonuçta. CDC ise otomatik olarak bunu bir background task gibi süresi dolanları silerek çözmekte.

DML işlemlerinde öyle aman aman bi yük yok. Birazdan değineceğimiz Change Tracking işleminde ufak da olsa bir yük var. Ancak öyle çok da büyük bir yük değil. Yani bir manuel çözüm bu trigger vs. olabilir, bu gibi çözümlerden kesinlikle daha az yüke sahip.

Change Data Capture vs. Change Tracking Arasındaki Farklar Nelerdir?

Öncelikle her ikisi de DML değişikliklerini desteklemekte. Ayrıca DML veri türü ya da kolon değişiklikleri de bu iki işlemde desteklenmekte.

Gelelim fark noktasına. Öncelikle, CDC tarihsel veri tutarken, change tracking tutmuyor. Haliyle bu alan olarak change tracking işlemini tercih edilebilir hale getiriyor.

Fakat bir başka noktada da CDC kullanılabilir oluyor. Çünkü CDC, asenkron bir şekilde çalışırken, Change Tracking senkron bir şekilde çalışıyor.

CDC tarafında bir veri değişikliğinde kullanıcı tablosunda hem gerçekleşeni hem de gerçek datayı saklama işlemi gerçekleştirilir. Bu işlem transaction logları asenkron şekilde okunarak gerçekleştirilir. Aşağıda bir CDC işlem örneği yer almaktadır;
CDC simulasyonu
Change Tracking ise değişiklik bilgisini saklarken, (örneğin yeni bir satır eklediniz, güncellediniz ya da sildiniz) değişikliğe dair ayrıntıları belirtmez. Yani hangi veriler değişmiş bilemezsiniz. Kısacası bu işlemde hangi satırlarda değişiklik olduysa onu bilirsiniz fakat ne değişmiş bilemezsiniz. Bir de change tracking işleminde işlemler senkron olarak gerçekleştirilir, tarihsel veri tutmaz. Bu nedenle depolama noktasında daha az maliyetlidir.
Change Tracking simulasyonu
CDC işlemini database seviyesinde aktif etmek ya da pasif etmek için, sp_cdc_enable_db | sp_cdc_disable_db prosedürlerini çalıştıran kullanıcılar, sysadmin rolünde olmalıdır.

CDC işlemini tablo seviyesinde aktif ya da pasif etmek için sp_cdc_enable_table | sp_cdc_disable_table prosedürlerini çalıştıran kullanıcılar sysadmin rolünde ya da database db_owner rolünde olmalıdır. Bu ikisi farklı şeyler. Buna dikkat etmek gerekebilir.

Bu roller dışında bir kullanıcı rolü ile bu işlemler yapılamaz.

Şu anlık bu yazı bu kadar arkadaşlar. Okuduğunuz için teşekkür ederim. Haydi görüşürük ❤

Kaynaklar