SQL Server Değişiklik Yakalama – Change Data Capture (CDC)

MsSQL veritabanında geliştirilen uygulamalarda, özellikle kritik veri barındırıyorsa, değişikliklerin loglanması hayati önem taşımaktadır. Verilerin değişiklik geçmişinin tutulması, hangi verinin hangi veri ile değiştirildiğinin loglanması hayat kurtaracak seviyede önemli olmaktadır.

Normal şartlarda uygulama geliştirici tarafından, sistem üzerinden bu değişiklikler yakalanır, ayrı bir tabloda tutulur. Fakat doğrudan veritabanı üzerinde yapılan değişiklikler yakalanamamaktadır. Bunları yakalayabilmek için de belirli Stored Procedure’ler veya Trigger’lar yazılmaktadır.

Bu kadar önleme rağmen, performans açısından sorun yaşanmaktadır. Sql Server bu konuyu “Change Data Capture (CDC)” ile çözmüş görünüyor. Sql Server 2008 ile birlikte gelen CDC, kendi tablolarını oluşturarak performans konusunda sorun yaşamadan istediğiniz değişiklikleri en güvenli şekilde yakalayabilmektedir. INSERT, UPDATE, DELETE fonksiyonlarını satır bazlı değil, field bazlı olarak yakalamaktadır.

Çalışma mekanizması da şu şekildedir. SQL Server tüm değişiklikleri kendi içerisinde bir “SQL Server Transaction Log” tablosunda tutar. CDC ise, bu logları okuyarak anlamlı bir şekilde SQL’de belirtilen tabloya yazar ve değişiklikleri bizim için LOG tablosuna temiz olarak aktarır

EXEC sp_cdc_enable_db

kodu ile SQL server üzerinde CDC aktif hale getirilir. Bu prosedür çalıştırıldıktan sonra sys.databases tablosuna is_cdc_enabled kolonu eklenir. Bu sayede, hangi veritabanları için CDC özelliğinin açık olduğunu da görebiliriz.

EXEC sp_cdc_enable_table
@source_schema = N’dbo’,
@source_name = N’Urun’,
@role_name = NULL,
@filegroup_name = N”,
@supports_net_changes = 1

Komutu çalıştırdığımızda aşağıdaki hata mesajı döndü.
Msg 22939, Level 16, State 1, Procedure sp_cdc_enable_table_internal, Line 182
The parameter @supports_net_changes is set to 1, but the source table does not have a primary key defined and no alternate unique index has been specified.
Tablo üzerinde EditorId alanını primary key olarak atayalım. Ardından sp_cdc_enable_table prosedürünü yeniden çalıştıralım. Prosedür sonrası aşağıdaki mesajlar dönecektir.
Job ‘cdc.AK_capture’ started successfully.
Job ‘cdc.AK_cleanup’ started successfully.
Böylece AK isimli veritabanı için capture işlemini yapacak iş emirleri oluşturulmuş oldu. İlk Job, değişiklikleri logdan okuyup ilgili verileri toplar. İkinci Job ise belli tarih öncesi kayıtları temizler.
Bu prosedür @captured_column_list seçmeli parametre de alır. TAblodaki tüm kolonları deği belli kolonları capture edilmesi istenirse ilgili kolonlar bu parametreye comma-separated list olarak girilir.

SELECT name, type, type_desc, is_tracked_by_cdc FROM sys.tables

sys.tables tablosunda hangi tabloları için CDC’nin devrede olduğunu okuyabiliriz. Bir diğer değişiklik sözkonusu veritabanın sistem tabloları altında cdc şemasına bağlı aşağıdaki tabloların oluşmasıdır.

cdc.change_tables : CDC’nin takip altına aldığı tabloları içerir.
cdc.captured_columns : Tablolarda capture edilecek kolonları içerir.
cdc.ddl_history : ALTER TABLE komutuyla tablo yapısında yapılan değişiklikleri içerir.
cdc.lsn_time_mapping : Transaction izleri bu tabloda tutulur böylece sırasıyla hangi işlemleri yapılacağı buradan öğrenilir.

Bu işin yazılımsal kanadını bir kenara bırakacak olursak, MsSQL’deki bu tablolar adli bilişim açısından da ciddi manada değerli olmaktadır. İncelenecek veritabanı göz önüne alındığında, Sql Server içerisinde yer alacak log tabloları incelenerek toplu olarak yapılan değişiklikler veya işlemler görüntülenebilir ve adli inceleme esnasında dikkate alınabilir.

 

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir