Aracılığıyla paylaş


Veri değişiklik yakalama (CDC) nedir?

Şunlar için geçerlidir:SQL ServerAzure SQL Yönetilen Örneği

Bu makalede, tablolar ve satırlar değiştirildiğinde veritabanındaki etkinliği kaydeden değişiklik verisi yakalama (CDC) hakkında bilgi edinin.

Bu makalede CDC'nin SQL Server ve Azure SQL Yönetilen Örneği ile nasıl çalıştığı açıklanmaktadır. Azure SQL Veritabanı ile ilgili olarak CDC ve Azure SQL Veritabanı'e bakın.

Genel bakış

Değişiklik veri yakalaması SQL Server Aracısını kullanarak bir tabloda gerçekleşen eklemeleri, güncelleştirmeleri ve silmeleri kaydetmek için kullanır. Bu nedenle, bu veri değişikliklerinin ilişkisel bir biçim kullanılarak kolayca kullanılabilmesini sağlar. Hedef ortama bu değişiklik verilerini uygulamak için gereken sütun verileri ve temel meta veriler, değiştirilen satırlar için yakalanır ve izlenen kaynak tabloların sütun yapısını yansıtan değişiklik tablolarında depolanır. Ayrıca, bu değişiklik verilerine sistematik erişim için tüketicilere tablo değerli fonksiyonlar sunulmaktadır.

Bu teknolojinin hedefledikleri veri tüketicisine iyi bir örnek, ayıklama, dönüştürme ve yükleme (ETL) uygulamasıdır. ETL uygulaması, değişiklik verilerini SQL Server kaynak tablolarından bir veri ambarı veya veri reyonuna artımlı olarak yükler. Veri ambarı içindeki kaynak tabloların gösteriminin kaynak tablolardaki değişiklikleri yansıtması gerekse de, kaynağın bir çoğaltmasını yenileyen uçtan uca bir teknoloji uygun değildir. Bunun yerine, tüketicilerin verileri benzer olmayan hedef gösterimlerine uygulayabilmesi için yapılandırılmış güvenilir bir değişiklik veri akışına ihtiyacınız vardır. SQL Server değişiklik verileri yakalama bu teknolojiyi sağlar.

Veri akışı

Aşağıdaki çizimde değişiklik verisi yakalamaya yönelik asıl veri akışı gösterilmektedir.

veri yakalama veri akışı diyagramını değiştirme .

Değişiklik verilerinin yakalanması için değişiklik verilerinin kaynağı SQL Server işlem günlüğüdür. İzlenen kaynak tablolara eklemeler, güncelleştirmeler ve silmeler uygulandığında, bu değişiklikleri açıklayan girdiler günlüğe eklenir. Günlük, yakalama işlemine girdi olarak hizmet eder. Ardından günlüğü okur ve izlenen tablonun ilişkili değişiklik tablosuna değişiklikler hakkında bilgi ekler. Belirtilen aralıktaki değişiklik tablolarında görünen değişiklikleri listelemek ve bilgileri filtrelenmiş sonuç kümesi biçiminde döndürmek için işlevler sağlanır. Filtrelenen sonuç kümesi genellikle bir uygulama işlemi tarafından bazı dış ortamlarda kaynağın gösterimini güncelleştirmek için kullanılır.

Yakalama örneği

Veritabanındaki tek tek tablolarda yapılan değişikliklerin izlenebilmesi için, değişiklik veri yakalamasının veritabanı için açıkça etkinleştirilmesi gerekir. Bu işlem, saklı yordam sys.sp_cdc_enable_dbkullanılarak yapılır. Veritabanı etkinleştirildiğinde, kaynak tablolar sys.sp_cdc_enable_tablesaklı yordamı kullanılarak izlenen tablolar olarak tanımlanabilir. Bir tablo değişiklik verisi yakalama için etkinleştirildiğinde, kaynak tablodaki değişiklik verilerinin dağıtılması için ilişkili bir yakalama örneği oluşturulur. Yakalama örneği bir değişiklik tablosundan ve en fazla iki sorgu işlevinden oluşur. Yakalama örneğinin yapılandırma ayrıntılarını açıklayan meta veriler , cdc.index_columnsve cdc.captured_columnscdc.change_tablesdeğişiklik veri yakalama meta veri tablolarında tutulur. Bu bilgiler, saklı yordam sys.sp_cdc_help_change_data_capturekullanılarak alınabilir.

Yakalama örneğiyle ilişkili tüm nesneler, etkin veritabanının değişiklik verileri yakalama şemasında oluşturulur. Yakalama örneği adının gereksinimleri, geçerli bir nesne adı olması ve veritabanı yakalama örnekleri arasında benzersiz olmasıdır. Varsayılan olarak, ad kaynak tablonun <şema adı_tablo adı> şeklindedir. İlişkili değişiklik tablosu, yakalama örneği adına _CT eklenerek adlandırılır. Tüm değişiklikleri sorgulamak için kullanılan işlev, yakalama örneği adına önceden fn_cdc_get_all_changes_ tarafından adlandırılır. Eğer yakalama örneği net değişiklikleri destekleyecek şekilde yapılandırılmışsa, net_changes sorgu işlevi de oluşturulur ve bu işlev yakalama örneği adına fn_cdc_get_net_changes_ ön eki eklenerek adlandırılır.

Önemli

Tek bir kaynak tabloyla eşzamanlı olarak ilişkilendirilebilen yakalama örneği sayısı üst sınırı ikidir.

Tabloyu değiştir

Değişiklik veri yakalama değişiklik tablosunun ilk beş sütunu meta veri sütunlarıdır. Bunlar, kaydedilen değişiklikle ilgili ek bilgiler sağlar. Kalan sütunlar, kaynak tablodaki tanımlanan yakalanan sütunları ad ve genellikle türünde yansıtır. Bu sütunlar, kaynak tablodan toplanan sütun verilerini tutar.

Kaynak tabloya uygulanan her ekleme veya silme işlemi, değişiklik tablosunda tek bir satır olarak görünür. Bir ekleme işleminden kaynaklanan satırın veri sütunları, ekleme sonrasındaki sütun değerlerini içerir. Silme işleminden kaynaklanan satırın veri sütunları, silme işleminden önceki sütun değerlerini içerir. Güncelleştirme işlemi, güncelleştirmeden önce sütun değerlerini tanımlamak için tek satırlı giriş ve güncelleştirmeden sonra sütun değerlerini tanımlamak için ikinci bir satır girişi gerektirir.

Değişiklik tablosundaki her satır, değişiklik etkinliğinin yorumlanmasını sağlayan başka meta veriler de içerir. __$start_lsn sütunu, değişikliğe atanan işleme günlüğü sıra numarasını (LSN) tanımlar. İşleme LSN'si hem aynı işlem içinde işlenen değişiklikleri tanımlar hem de bu işlemleri sipariş eder. __$seqval sütunu aynı işlemde gerçekleşen daha fazla değişiklik sipariş etmek için kullanılabilir. __$operation sütunu değişiklikle ilişkili işlemi kaydeder: 1 = silme, 2 = ekleme, 3 = güncelleştirme (görüntüden önce) ve 4 = güncelleştirme (görüntüden sonra). __$update_mask sütunu, yakalanan her sütun için bir tanımlı bit içeren değişken bit maskesidir. Ekleme ve silme girdileri için güncelleştirme maskesinin tüm bitleri ayarlanmıştır. Güncellenen satırlar, değiştirilen sütunlara karşılık gelen bitleri ayarlar.

Geçerlilik aralığı

Veritabanı için değişiklik verileri yakalama geçerlilik aralığı, değişiklik verilerinin yakalama örnekleri için kullanılabilir olduğu süredir. Geçerlilik aralığı, veritabanı tablosu için ilk yakalama örneği oluşturulduğunda başlar ve mevcut zamana kadar devam eder.

Veritabanı

Verileri düzenli aralıklarla ve sistematik olarak ayıklamazsanız, değişiklik tablolarına yatırılan veriler yönetilemez şekilde büyür. Değişiklik verilerini yakalama temizleme işlemi, saklama esasına dayalı temizleme ilkesini uygular. İlk olarak, zaman kısıtlamasını karşılamak için geçerlilik aralığının düşük uç noktasını taşır. Ardından süresi dolan değişiklik tablosu girdilerini kaldırır. Varsayılan olarak, üç günlük veriler korunur.

Üst düzeyde, yakalama süreci her yeni değişiklik verisi grubunu işlerken, değişiklik tablosu girişleri olan her işlem için cdc.lsn_time_mapping'e yeni girişler eklenir. Eşleme tablosunda hem işlem Günlüğü Sıra Numarası (LSN) hem de işlem bitiş zamanı (start_lsn ve tran_end_time sütunları sırasıyla) korunur. cdc.lsn_time_mapping içinde bulunan maksimum LSN değeri, veritabanı geçerlilik penceresinin üst sınırını temsil eder. Buna karşılık gelen işleme süresi, bekletme tabanlı temizlemenin yeni bir düşük su işaretini hesapladığı temel olarak kullanılır.

Yakalama işlemi değişiklik verilerini işlem günlüğünden ayıkladığı için, bir değişikliğin kaynak tabloya işlenme zamanı ile değişikliğin ilişkili değişiklik tablosunda görünmesi arasında yerleşik bir gecikme süresi vardır. Bu gecikme süresi genelde küçük olduğundan, yakalama işlemi ilgili günlük girişlerini işleyene kadar değişiklik verilerinin mevcut olmadığını hatırlamak yine de önemlidir.

Yakalama örneği

Veritabanı geçerlilik aralığı ve tek tek yakalama örneğinin geçerlilik aralığının çakışması yaygın olsa da, her zaman doğru değildir. Yakalama örneğinin geçerlilik aralığı, yakalama işlemi örneği tanıyıp değişiklik tablosuna ilişkili değişiklikleri kaydetmeye başladığında başlar. Sonuç olarak, yakalama örnekleri farklı zamanlarda oluşturulursa, her birinin farklı bir düşük uç noktası olur. sys.sp_cdc_help_change_data_capture tarafından döndürülen sonuç kümesinin start_lsn sütunu, tanımlanan her yakalama örneği için geçerli düşük uç noktayı gösterir. Temizleme işlemi değişiklik tablosu girdilerini temizlediğinde, tüm yakalama örneklerinin start_lsn değerlerini, kullanılabilir değişiklik verileri için yeni eşik değerini yansıtacak şekilde ayarlar. Yalnızca şu anda yeni düşük su işaretinden küçük start_lsn değerleri olan yakalama örneklemeleri ayarlanır. Zaman içinde, yeni yakalama örneği oluşturulmazsa tüm tek tek örneklerin geçerlilik aralıkları veritabanı geçerlilik aralığıyla aynı olur.

Geçerlilik aralığı, değişiklik verisi tüketicileri için önemlidir çünkü bir isteğin ayıklama aralığı, yakalama örneği için geçerli olan mevcut değişiklik verisi yakalama geçerlilik aralığı ile tamamen örtüşmelidir. Ayıklama aralığının düşük uç noktası geçerlilik aralığının düşük uç noktasının solundaysa, agresif temizleme nedeniyle değişiklik verileri eksik olabilir. Eğer ayıklama aralığının yüksek uç noktası, geçerlilik aralığının yüksek uç noktasının sağındaysa, bu durum yakalama işleminin henüz ayıklama aralığıyla belirtilen süre boyunca işlenmediğini ve değişiklik verilerinin eksik olabileceğini gösterir.

sys.fn_cdc_get_min_lsn işlevi, yakalama örneği için geçerli en düşük LSN'yi almak için kullanılırken, geçerli en yüksek LSN değerini almak için sys.fn_cdc_get_max_lsn kullanılır. Değişiklik verilerini sorguladığınızda, belirtilen LSN aralığı bu iki LSN değeri içinde yer almazsa değişiklik verileri yakalama sorgu işlevleri başarısız olur.

Kaynak tablodaki değişiklikleri işleme

İzlenen kaynak tablolardaki sütun değişikliklerine uyum sağlamak, sonraki süreç tüketicileri için zor bir sorundur. Kaynak tabloda değişiklik verilerini yakalamayı etkinleştirmek bu tür DDL değişikliklerinin oluşmasını engellemese de, temel alınan kaynak tablonun sütun yapısı değişse bile, değişiklik veri yakalama api aracılığıyla döndürülen teslim edilen sonuç kümelerini koruyarak tüketiciler üzerindeki etkiyi azaltır. Bu sabit sütun yapısı, tanımlanan sorgu işlevlerinin erişeceği temel değişiklik tablosuna da yansıtılır.

Değişiklik tablosunun doldurulmasından sorumlu yakalama işlemi, kaynak tablo değişiklik verisi yakalama için etkinleştirildiğinde yakalama için tanımlanmamış yeni sütunları yoksayarak sabit sütun yapısı değişiklik tablosunu barındırır. İzlenen bir sütun bırakılırsa, sonraki değişiklik girişlerinde sütun için null değerler sağlanır. Ancak, mevcut bir sütunun veri türü değiştirildiğinde, yakalama mekanizmasının izlenen sütunlarda veri kaybına neden olmamasını sağlamak için değişiklik tablosuna yansıtılır. Yakalama işlemi ayrıca izlenen tabloların sütun yapısında algılanan değişiklikleri cdc.ddl_history tablosuna gönderir. Aşağı akış uygulamalarında yapılması gerekebilecek ayarlamalar konusunda uyarı almak isteyen tüketiciler, sys.sp_cdc_get_ddl_historysaklı yordamını kullanır.

Genellikle geçerli yakalama örneği, ilişkili kaynak tablosuna DDL değişiklikleri uygulandığında şeklini korumaya devam eder. Ancak, tablo için yeni sütun yapısını yansıtan ikinci bir yakalama örneği oluşturmak mümkündür. Bu seçenek, yakalama işleminin aynı kaynak tabloda iki farklı sütun yapısına sahip iki ayrı değişiklik tablosuna değişiklik yapmasına olanak tanır. Bu nedenle, bir değişiklik tablosu geçerli işletimsel programları beslemeye devam edebilirken, ikincisi yeni sütun verilerini birleştirmeye çalışan bir geliştirme ortamı oluşturabilir. Yakalama mekanizmasının her iki değişiklik tablosunu da aynı anda doldurmasına izin vermek, değişiklik verileri kaybı olmadan bir geçiş gerçekleştirilebileceği anlamına gelir. Bu, iki değişiklik veri yakalama zaman çizelgesi çakıştığında her an olabilir. Geçiş etkilendiğinde, eski yakalama örneği kaldırılabilir.

Önemli

Tek bir kaynak tabloyla eşzamanlı olarak ilişkilendirilebilen yakalama örneği sayısı üst sınırı ikidir.

Kayıt okuma aracı ile ilişki

Değişiklik veri yakalama işlemi mantığı, sqlservr.exe'nin bir parçası olarak geliştirilen ve işlem çoğaltması tarafından işlem günlüğünden değişiklikleri toplamak için kullanılan dahili sunucu işlevi sp_replcmdssaklı yordamına gömülüdür. SQL Server ve Azure SQL Yönetilen Örneği'nde, bir veritabanı için yalnızca değişiklik verisi yakalama etkinleştirildiğinde, sp_replcmds'yi çağırmak için araç olarak kullanılmak üzere bir değişiklik verisi yakalama SQL Server Agent yakalama işi oluşturursunuz. Çoğaltma da mevcut olduğunda, bu tüketicilerin her ikisi için de değişiklik verisi gereksinimlerini karşılamak için yalnızca işlem günlüğü okuyucusu kullanılır. Bu strateji, aynı veritabanı için hem çoğaltma hem de değişiklik verisi yakalama etkinleştirildiğinde günlük çekişmesini önemli ölçüde azaltır.

Değişiklik verilerini yakalamak için bu iki işlem modu arasındaki geçiş, değişiklik verilerini yakalama özelliği etkin veritabanının çoğaltma durumunda bir değişiklik olduğunda otomatik olarak gerçekleşir.

Not

SQL Server ve Azure SQL Yönetilen Örneği'nde, yakalama mantığının her iki örneği de işlemin yürütülmesi için SQL Server Aracısı'nın çalışmasını gerektirir.

Yakalama işleminin asıl görevi, günlüğü taramak ve değişiklik verileri yakalama değişiklik tablolarına sütun verilerini ve işlemle ilgili bilgileri yazmaktır. Tüm değişiklik verileri yakalama değişiklik tablolarında işlemsel olarak tutarlı bir sınır sağlamak için, yakalama işlemi açılır ve her tarama döngüsünde kendi işlemini işler. Değişikliklerin veri yakalaması için tabloların ne zaman yeni etkinleştirildiğini algılar ve bunları günlükteki değişiklik girdileri için etkin olarak izlenen tablo kümesine otomatik olarak ekler. Benzer şekilde, değişiklik verilerini yakalamayı devre dışı bırakmak da algılanır ve bu da kaynak tablonun değişiklik verileri için etkin olarak izlenen tablo kümesinden kaldırılmasına neden olur. Günlüğün bir bölümü için işleme tamamlandığında, yakalama işlemi sunucu günlüğü kesme mantığına sinyal gönderir ve bu mantık, kesme için uygun günlük girdilerini tanımlamak için bu bilgileri kullanır.

Önemli

Veritabanı değişiklik verilerinin yakalanması için etkinleştirildiğinde, kurtarma modu basit kurtarma olarak ayarlanmış olsa bile, yakalama için işaretlenmiş tüm değişiklikler yakalama işlemi tarafından toplanana kadar kayıt kesme noktası ilerlemez. Yakalama işlemi çalışmıyorsa ve toplanacak değişiklikler varsa, CHECKPOINT komutunun çalıştırılması günlüğü kısaltmaz.

Yakalama işlemi, izlenen tablolardaki DDL değişikliklerinin geçmişini korumak için de kullanılır. Değişiklik verileri yakalama ile ilişkili DDL deyimleri, değişiklik verileri yakalama özellikli bir veritabanı veya tablo bırakıldığında veya değişiklik verileri yakalama özelliği etkinleştirilmiş bir tablonun sütunları eklendiğinde, değiştirildiğinde veya bırakıldığında veritabanı işlem günlüğüne giriş yapar. Bu günlük girişleri yakalama işlemi tarafından işlenir ve ardından ilişkili DDL olaylarını cdc.ddl_history tablosuna iletir. sys.sp_cdc_get_ddl_historysaklı yordamını kullanarak izlenen tablolar üzerinde etkili olan DDL olayları hakkında bilgi edinebilirsiniz.

Uyarı

  • MaxCmdsInTran her zaman açık olacak şekilde tasarlanmamıştır. Bir kişinin yanlışlıkla tek bir işlemde çok sayıda DML işlemi gerçekleştirdiği (işlemin tamamı dağıtım veritabanına gelene, kilitlenene vb. kadar komutların dağıtımında gecikmeye neden olan) durumlara geçici bir çözüm olarak mevcuttur. Düzenli olarak bu duruma düşerseniz işlem boyutunu küçültmenin yollarını bulmak için uygulama mantığınızı gözden geçirin.
  • Verilen yayın veritabanında hem CDC hem de çoğaltma etkinleştirilmişse MaxCmdsInTran desteklenmez. Bu yapılandırmada MaxCmdsInTran kullanılması CDC değişiklik tablolarında veri kaybına neden olabilir. Ayrıca, MaxCmdsInTran parametresi bir İşlem çoğaltılırken eklenip kaldırılırsa PK hatalarına neden olabilir.

Temsilci görevleri

İki SQL Server Aracısı işi genellikle değişiklik verisi yakalama özellikli veritabanıyla ilişkilendirilir: veritabanı değişiklik tablolarını doldurmak için kullanılan ve değişiklik tablosu temizlemeden sorumlu olan veritabanı. Her iki iş de Transact-SQL komutu çalıştıran tek bir adımdan oluşur. Çağrılan Transact-SQL komutu, işin mantığını uygulayan, değişiklik verilerini yakalama amaçlı tanımlanmış bir saklı yordamdır. İşler, veritabanının ilk tablosu değişiklik verisi yakalama için etkinleştirildiğinde oluşturulur. Temizleme İşi her zaman oluşturulur. Yakalama işi yalnızca veritabanı için tanımlı işlem yayınları yoksa oluşturulur. Yakalama görevi, bir veritabanı için hem değişiklik verisi yakalama hem de işlem replikasyonu etkinleştirildiğinde ve veritabanında artık tanımlı yayımcılar olmadığından işlem günlük okuyucu işi kaldırıldığında da oluşturulur.

Hem yakalama hem de temizleme işleri varsayılan parametreler kullanılarak oluşturulur. Yakalama işi hemen başlatılır. Sürekli çalışır ve döngüler arasında 5 saniyelik bir bekleme süresiyle tarama döngüsü başına en fazla 1000 işlem işler. Temizleme işi her gün saat 02:00'de çalışır. Değişiklik tablosu girdilerini 4320 dakika veya 3 gün boyunca korur ve tek bir delete deyimiyle en fazla 5000 girdiyi kaldırır.

Veritabanı için değişiklik veri yakalama devre dışı bırakıldığında, değişiklik veri yakalama aracı işleri kaldırılır. Yakalama işi, veritabanına ilk yayın eklendiğinde ve hem değişiklik verileri yakalama hem de işlem çoğaltması etkinleştirildiğinde de kaldırılabilir.

Dahili olarak, değişiklik veri yakalama aracı görevleri, sys.sp_cdc_add_job ve sys.sp_cdc_drop_jobsaklı yordamları kullanılarak sırasıyla oluşturulur ve bırakılır. Bu saklı yordamlar, yöneticilerin bu işlerin oluşturulmasını ve kaldırılmasını denetleyebilmesi için erişime açılır.

Yöneticinin değişiklik verileri yakalama aracı işlerinin varsayılan yapılandırması üzerinde açık bir denetimi yoktur. Saklı yordam sys.sp_cdc_change_job, varsayılan yapılandırma parametrelerinin değiştirilmesine izin vermek için sağlanır. Buna ek olarak, saklı yordam sys.sp_cdc_help_jobs geçerli yapılandırma parametrelerinin görüntülenmesine izin verir. Hem yakalama işi hem de temizleme işi başlangıçta msdb.dbo.cdc_jobs tablodan yapılandırma parametrelerini ayıklar. sys.sp_cdc_change_job kullanılarak bu değerlerde yapılan değişiklikler, iş durdurulup yeniden başlatılana kadar geçerli olmaz.

Değişiklik verilerini yakalama aracısı işlerinin başlatılması ve durdurulmasına izin vermek için iki saklı yordam daha sağlanır: sys.sp_cdc_start_job ve sys.sp_cdc_stop_job.

Not

Yakalama işinin başlatılması ve durdurulması değişiklik verilerinin kaybolmasına neden olmaz. Yalnızca yakalama işleminin değişiklik tablolarına yüklemek üzere değişiklik girdileri için günlüğü etkin bir şekilde taramasını engeller. Talebin yoğun olduğu dönemlerde günlük taramasının yük eklemesini önlemeye yönelik makul bir strateji, yakalama işini durdurmak ve talep azaldığında yeniden başlatmaktır.

Her iki SQL Server Aracısı işi de değişiklik verisi yakalama ortamlarının temel gereksinimlerini karşılamak için yeterince esnek ve yeterince yapılandırılabilir olacak şekilde tasarlanmıştır. Ancak her iki durumda da, daha fazla özelleştirmenin mümkün olması için temel işlevselliği sağlayan temel saklı yordamlar kullanıma sunuldu.

Veritabanı Altyapısı hizmeti veya SQL Server Aracısı hizmeti AĞ HİzMETİ hesabı altında çalışırken değişiklik veri yakalama düzgün çalışamıyor. Bu, 22832 hatasına neden olabilir.

Diğer özelliklerle birlikte çalışabilirlik

Değişiklik veri yakalama, diğer SQL Server özellikleriyle çalışırken bazı sınırlamalara sahiptir. Daha fazla bilgi edinmek için Birlikte Çalışabilirlik'ni gözden geçirin.

Bilinen sorunlar

Değişiklik verilerini yakalamayla (CDC) ilgili bilinen konular ve hatalar için CDC ile ilgili bilinen sorunları gözden geçirin.

Ayrıca bkz.