SQL Server alt ve üst nesilleri ayrı nesil toplu işlerinde işlerken yakınsama

Bu makale, SQL Server alt ve üst nesilleri ayrı nesil toplu işlerken oluşan Yakınsanmayan sorunu çözmenize yardımcı olur.

Özgün ürün sürümü: SQL Server
Özgün KB numarası: 308266

Belirtiler

Abonedeki alt tablolarda INSERT komutlarının kaybı aşağıdaki koşullar altında oluşabilir:

  • Birleştirme çoğaltma topolojisi, yayımcı, bir veya daha fazla yeniden yayımlayıcı ve bir veya daha fazla abone ile hiyerarşiktir.
  • Birleştirme çoğaltma yayınında bir veya daha fazla üst ve alt makale vardır ve bunlar arasında bir birleştirme filtresi tanımlanmıştır.
  • NOT FOR REPLICATION Bu iki makale arasındaki ilişki için yeniden yayımlayıcıda ve abonede bir yabancı anahtar kısıtlaması vardır.
  • Alt makaledeki INSERT'ler, birleştirme aracısı parametresinde belirtilen değerden daha fazlasıyla ilişkili üst neslinden ayrı bir nesilde -DownloadGenerationsPerBatch gerçekleşir. Bu nedenle, birleştirme aracısı alt nesli ilişkili üst neslinden ayrı bir grup nesil halinde işler.
  • Yayımcı ile yeniden yayımlayıcı arasında ve alt ve üst oluşturma toplu işlemlerinin işlenmesi arasında birleştirme işlemi kesintiye neden olur.

Geçici Çözüm

Birleştirme çoğaltma mimarisi, üst ve alt değişiklikleri nesil toplu iş sınırları arasında birlikte tutmaya yönelik bir mekanizma sağlamaz. Bu sorunu geçici olarak çözmek için şunları yapabilirsiniz:

  • -UploadGenerationsPerBatch ve -DownloadGenerationsPerBatch Birleştirme Aracısı parametrelerini en yüksek değer olan 2000'e yükseltin; bu da bir alt makalenin neslini üst makalenin neslinden ayrı bir toplu işte işleme olasılığını neredeyse ortadan kaldırır.

-VEYA-

  • NOT FOR REPLICATION Yeniden yayımlayıcıda yabancı anahtar kısıtlamaları üzerindeki özelliğini kaldırın. Bu durumda, ilişkili üst makale satırı olmadığından Birleştirme Aracısı alt makaleye satır ekleyemiyor. Ancak, bu değişiklikle ilişkili performans düşüşü olabileceğini unutmayın. Birleştirme Aracısı bu alt satırları ekleyemiyorsa, bu değişiklikler yeniden denenmelidir. Birleştirme Aracısı yeniden deneme işlemi, normal toplu işlem modundan çok daha az verimlidir.

Daha fazla bilgi

Burada, bu sorunun oluşabileceği daha ayrıntılı bir olay dizisi yer alır. ve -DownloadGenerationsPerBatch Birleştirme Aracısı parametreleri için -UploadGenerationsPerBatch varsayılan değerler (bu sorunu büyük ölçüde taşıyan) 100'lerdir. Aşağıdaki örnekte ve -DownloadGenerationsPerBatch parametrelerinin -UploadGenerationsPerBatch değiştirilmediğini varsayalım.

  • INSERT'ler üst düzey yayımcıda bir alt ve üst makale olarak gerçekleşir. Alt makale, bir yayında üst makale olarak adlandırılan başka bir tablo için yabancı anahtar kısıtlaması olan herhangi bir makaledir. Bu iki makale bir birleştirme çoğaltması birleştirme filtresiyle ilişkilidir ve yeniden yayımlayan ve abonedeki gerçek sunucu tarafı yabancı anahtar kısıtlamaları ÇOĞALTMA İÇİN OLMAYAN özelliğiyle işaretlenir. Emin değilseniz, kısıtlamaların çoğaltma için olup olmadığını belirlemek için tablolarda sp_help saklı yordamı yürütebilirsiniz.
  • Alt tablodaki INSERT'ler (örneğin), 110. nesilde gerçekleşir. Üst tablodaki INSERT'ler (örneğin), 250. nesilde gerçekleşir. Bu nesiller arasındaki ayrım parametresinden -DownloadGenerationsPerBatch büyüktür.
  • Yayımcı-yeniden yayımlayıcı Birleştirme Aracısı, 101 ile 200 arası nesilleri içeren nesilleri işler. Bu toplu işlemin başarılı bir şekilde işlenmesi ve bu nesillerdeki ilişkili değişikliklerin yeniden yayımlayıcıya indirilmesinden sonra yayımcı-yeniden yayımlayıcı Birleştirme Aracısı kesintiye uğrar. Birleştirme Aracısı 201 ile 300 arası nesilleri (üst makale değişikliklerini içeren) işleyemeden önce kesinti oluşur. Kesintinin nedeni ağ bağlantısı kaybı, sorgu zaman aşımı vb. olabilir. Sunucu tarafı yabancı anahtar kısıtlaması ÇOĞALTMA İÇİN DEĞIL olarak işaretlendiğinden, birleştirme aracısı alt makale satırlarını üst satırlar olmadan işleyebilir, böylece kısıtlama denetimi "askıya alınır".
  • Publisher-republisher Birleştirme Aracısı yeniden işlemeye başlamadan önce, yeniden yayımlayan-abone Birleştirme Aracısı bir birleştirme oturumu başlatır. Değişiklikleri yeniden yayımlayıcıdan indirme işlemine başlar.
  • Yeniden yayımlayan-abone Birleştirme Aracısı 110. nesli (alt makale INSERTs) işlediğinde, alt makale ile üst makale arasında var olan birleştirme filtresini değerlendirir. Üst makale değişiklikleri henüz yeniden yayımlayıcıya ulaşamadığından, Birleştirme Aracısı bu alt INSERT'lerin birleştirme filtresini "nitelemediğini" belirler. Birleştirme Aracısı, 110. nesli temsil eden MSmerge_genhistory satırını indirir, ancak bu nesildeki değişikliklerin hiçbirini indirmez. Bu Birleştirme Aracısı oturumunu başarıyla tamamlar.
  • Yayımcı ve yeniden yayımlayıcı arasında Birleştirme Aracısı'nın sonraki çalıştırması, üst makale INSERTs (nesil 201 ila 300) içeren nesillerin toplu işlemini başarıyla işler ve bu değişiklikleri yeniden yayımlayıcıda işler.
  • Son olarak, yeniden yayımlayan ve abone arasındaki sonraki Birleştirme Aracısı oturumu 250. nesli dikkate alır ve üst makale INSERTs'i aboneye indirir. Ancak abone 110. nesli (alt makalenin nesli) de bildiği için Birleştirme Aracısı alt makalenin bölümünü yeniden değerlendirmez.

Bu, abonede doğru üst makale satırlarının yeniden yayımlayıcıda alt satırlarla mevcut orphaned olmasına neden olur.