Two databases syncing changed blocks, representing SQL Server Change Tracking

SQL Server Change Tracking: Ne Zaman Kullanılır, Nasıl Açılır, CDC’den Farkı Nedir?

SQL Server Change Tracking’in ne kaydettiği, CDC ve temporal table ile farkı, nasıl açılacağı, MIN_VALID_VERSION ile güvenilir senkronizasyon sorgusu ve üretimde dikkat edilecekler.

Kasım 10, 2021

Bir mobil uygulamanın, bir önbelleğin, bir arama indeksinin ya da bir veri ambarının SQL Server’daki değişiklikleri takip etmesi gerektiğinde ilk akla gelen çözüm genellikle trigger’lar, UpdatedAt kolonları ve el yapımı log tablolarıdır. SQL Server’ın bu iş için yerleşik ve hafif bir özelliği vardır: Change Tracking. Doğru senaryoda trigger’lardan çok daha az kodla ve daha güvenilir şekilde “son senkronizasyondan beri hangi satırlar değişti?” sorusunu yanıtlar.

Bu rehberde Change Tracking’in ne kaydettiğini ve ne kaydetmediğini, Change Data Capture’dan farkını, nasıl açılacağını, güvenilir bir senkronizasyon sorgusunun nasıl yazılacağını ve üretimde dikkat edilmesi gereken noktaları anlatıyoruz.

SQL Server Danışmanlığı

Veri senkronizasyonu mu planlıyorsunuz?

Aryasoft; Change Tracking, CDC ve replikasyon seçeneklerini iş yükünüze göre değerlendirir, güvenilir ve izlenebilir bir senkronizasyon mimarisi kurar.

Destek Alın

Change Tracking Ne Kaydeder?

Change Tracking, bir tabloda hangi satırın değiştiğini ve değişikliğin türünü (insert, update, delete) kaydeder. Değişen satırı primary key değeriyle tanımlar; satırın yeni hâlini almak için uygulama bu anahtarla kaynak tabloya join yapar. İsteğe bağlı olarak bir update’te hangi kolonların değiştiği de kaydedilebilir.

Change Tracking şunları kaydetmez:

  • Satırın eski değerlerini ya da ara değerlerini.
  • Bir satırın iki senkronizasyon arasında kaç kez değiştiğini; yalnızca değiştiğini.
  • Değişikliği kimin yaptığını.

Bir kolonu aynı değere set eden bir UPDATE bile değişiklik olarak kaydedilir.

Change Tracking mi, CDC mi, Temporal Table mı?

Özellik Change Tracking Change Data Capture (CDC) Temporal Table
Ne kaydeder Hangi satır değişti, işlem türü Her değişikliğin önceki ve sonraki değerleri Satırın tüm geçmiş sürümleri
Nasıl çalışır DML transaction’ı içinde, senkron Transaction log’dan, asenkron (Agent job’larıyla) DML ile birlikte geçmiş tablosuna yazar
Primary key gerekir mi Evet Hayır (net değişiklik sorguları için gerekir) Evet
Tipik kullanım Uygulama ve önbellek senkronizasyonu ETL, veri ambarı yüklemeleri, denetim Zaman içinde sorgulama, geçmiş kayıt
Ek yük Düşük, ama her DML’e eklenir Log okuma ve değişiklik tabloları Geçmiş tablosunun büyümesi

Kısacası; “son senkronizasyondan beri ne değişti, en güncel hâli ver” yeterliyse Change Tracking, her değişikliğin değerlerine ihtiyaç varsa CDC, satırın geçmişte belirli bir andaki hâli gerekiyorsa temporal table doğru araçtır.

Change Tracking Nasıl Açılır?

Önce veritabanı düzeyinde, ardından izlenecek her tablo için açılır:

ALTER DATABASE SatisDB
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE dbo.Musteri
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON);

-- Tutarlı senkronizasyon için snapshot isolation
ALTER DATABASE SatisDB SET ALLOW_SNAPSHOT_ISOLATION ON;

CHANGE_RETENTION, değişiklik bilgisinin ne kadar süre tutulacağını belirler. Bu süre, en uzun senkronizasyon aralığınızdan, istemcilerin çevrimdışı kalabileceği en uzun süre de hesaba katılarak, daha uzun olmalıdır. TRACK_COLUMNS_UPDATED, hangi kolonların değiştiğini de kaydeder ama ek alan kullanır; yalnızca gerçekten ihtiyaç varsa açın.

Güvenilir Bir Senkronizasyon Sorgusu

Senkronizasyon yapan uygulama, her çalışmada bir sonraki sefere kullanacağı versiyon numarasını saklar. Doğru kalıp üç şeyi birlikte yapar: işlemi snapshot isolation içinde çalıştırır, son versiyonun hâlâ geçerli olduğunu kontrol eder ve değişiklikleri kaynak tabloyla birleştirir:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN;

DECLARE @last_sync bigint = 1500;   -- uygulamanın sakladığı son versiyon
DECLARE @current   bigint = CHANGE_TRACKING_CURRENT_VERSION();

IF @last_sync < CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID(N'dbo.Musteri'))
BEGIN
    -- Değişiklik bilgisi temizlenmiş: tam yeniden yükleme gerekir
    SELECT N'FULL_RELOAD' AS action;
END
ELSE
BEGIN
    SELECT ct.MusteriId, ct.SYS_CHANGE_OPERATION, m.Ad, m.Sehir
    FROM CHANGETABLE(CHANGES dbo.Musteri, @last_sync) AS ct
    LEFT JOIN dbo.Musteri AS m ON m.MusteriId = ct.MusteriId;   -- silinen satırlar NULL döner
END

SELECT @current AS next_sync_version;   -- uygulama bunu saklar
COMMIT;

Uyarı

CHANGE_TRACKING_MIN_VALID_VERSION kontrolünü atlamayın. Uygulama retention süresinden uzun süre senkronize olmazsa, eski değişiklik bilgisi temizlenmiş olur ve CHANGETABLE sessizce eksik sonuç döndürebilir. Bu kontrol, istemcinin tam yeniden yüklemeye geçmesi gerektiğini güvenilir şekilde söyler.

Snapshot isolation, versiyonu okuduğunuz an ile değişiklikleri okuduğunuz an arasında gelen yeni işlemlerin sonucu karıştırmasını önler.

Üretimde Dikkat Edilmesi Gerekenler

  • Senkron ek yük: Change Tracking bilgisi, DML işleminin kendisiyle aynı transaction içinde yazılır. Çok yoğun yazma alan tablolarda bu ek yükü test edin.
  • İç tablolar büyüyebilir: Her izlenen tablonun bir iç (side) tablosu ve veritabanı genelinde bir commit tablosu vardır. Otomatik temizlik geride kalırsa bu tablolar büyür ve sorgular yavaşlar.
  • Manuel temizlik: Otomatik temizliğin yetişemediği durumlar için sys.sp_flush_CT_internal_table_on_demand prosedürü vardır.
  • Kısa retention, uzun kesinti: Retention’ı kısa tutmak alanı korur ama uzun süre çevrimdışı kalan istemcileri tam yüklemeye zorlar. İkisi arasında bilinçli bir denge kurun.

Not

SQL Server 2025, büyük iç tablolar için varsayılan olarak açık gelen yeni bir uyarlamalı (adaptive shallow) temizlik yaklaşımı getirir. Temizlik artık adım adım ilerler ve büyük tablolarda geride kalma riski azalır. Gerekirse trace flag 8273 ile eski davranışa dönülebilir.

İç tabloların boyutunu izlemek için:

SELECT OBJECT_NAME(it.parent_object_id) AS tracked_table,
       it.name AS internal_table,
       SUM(ps.row_count) AS row_count,
       SUM(ps.reserved_page_count) * 8 / 1024.0 AS reserved_mb
FROM sys.internal_tables AS it
JOIN sys.dm_db_partition_stats AS ps ON ps.object_id = it.object_id
WHERE it.internal_type_desc = N'CHANGE_TRACKING'
GROUP BY it.parent_object_id, it.name
ORDER BY reserved_mb DESC;

Hangi Tablolarda Açık? Nasıl Kapatılır?

-- Change Tracking açık veritabanları ve tablolar
SELECT DB_NAME(database_id) AS database_name, is_auto_cleanup_on,
       retention_period, retention_period_units_desc
FROM sys.change_tracking_databases;

SELECT OBJECT_SCHEMA_NAME(object_id) + N'.' + OBJECT_NAME(object_id) AS table_name,
       is_track_columns_updated_on
FROM sys.change_tracking_tables;

-- Kapatmak: önce tablolar, sonra veritabanı
ALTER TABLE dbo.Musteri DISABLE CHANGE_TRACKING;
ALTER DATABASE SatisDB SET CHANGE_TRACKING = OFF;

Kontrol Listesi

  • İhtiyaç “hangi satır değişti” ise Change Tracking, “hangi değerler değişti” ise CDC seçildi.
  • İzlenen tabloların primary key’i var.
  • Retention süresi en uzun senkronizasyon aralığından uzun.
  • Senkronizasyon snapshot isolation içinde çalışıyor ve MIN_VALID_VERSION kontrol ediliyor.
  • İç tabloların boyutu ve otomatik temizlik izleniyor.
Bir tabloda hangi satırların değiştiğini ve değişikliğin türünü kaydeden, uygulama senkronizasyonu için tasarlanmış hafif bir SQL Server özelliğidir. Satırların eski değerlerini kaydetmez.
Change Tracking yalnızca hangi satırın değiştiğini senkron olarak kaydeder. CDC ise transaction log’dan her değişikliğin önceki ve sonraki değerlerini asenkron olarak yakalar.
Evet. Değişen satırlar primary key değerleriyle tanımlanır; primary key’i olmayan tablolarda Change Tracking açılamaz.
Son senkronizasyon versiyonu bu değerden küçükse değişiklik bilgisi temizlenmiştir ve sonuçlar eksik olabilir. Bu durumda istemci tam yeniden yükleme yapmalıdır.

SQL Server Danışmanlığı

Senkronizasyonu trigger’larla değil, doğru araçla kurun

Aryasoft’un kıdemli DBA ekibi Change Tracking, CDC ve replikasyon seçeneklerini iş yükünüze göre değerlendirir; güvenilir, izlenebilir ve bakımı kolay bir veri senkronizasyon mimarisi kurar.

4.7/5