Niet-convergentie wanneer SQL Server onderliggende en bovenliggende generaties in afzonderlijke generatiebatches verwerkt

Dit artikel helpt u bij het oplossen van het probleem zonder convergentie dat optreedt wanneer SQL Server onderliggende en bovenliggende generaties in afzonderlijke generatiebatches verwerkt.

Originele productversie: SQL Server
Origineel KB-nummer: 308266

Symptomen

Een verlies van INSERT-opdrachten in onderliggende tabellen bij een abonnee kan optreden onder de volgende omstandigheden:

  • De samenvoegingsreplicatietopologie is hiërarchisch, met een uitgever, een of meer herpubliceerders en een of meer abonnees.
  • Een of meer bovenliggende en onderliggende artikelen bestaan in een samenvoegingsreplicatiepublicatie, met een joinfilter dat ertussen is gedefinieerd.
  • Er NOT FOR REPLICATION bestaat een beperking voor een refererende sleutel bij de herpublicatie en abonnee voor de relatie tussen deze twee artikelen.
  • INSERT's in een onderliggend artikel vinden plaats in een generatie die is gescheiden van de bijbehorende bovenliggende generatie door meer dan de waarde die is opgegeven in de parameter van de -DownloadGenerationsPerBatch samenvoegagent. De samenvoegagent verwerkt de onderliggende generatie dus in een batch van generaties, gescheiden van de bijbehorende bovenliggende generatie.
  • Er is een onderbreking van de samenvoegverwerking tussen de uitgever en de herpublicatie en tussen de verwerking van de onderliggende en bovenliggende generatiebatches.

Tijdelijke oplossing

De architectuur voor samenvoegingsreplicatie biedt geen mechanisme om bovenliggende en onderliggende wijzigingen bij elkaar te houden over de grenzen van de generatiebatch. U kunt dit probleem omzeilen door het volgende te doen:

  • Verhoog de parameters van de -UploadGenerationsPerBatch agent en -DownloadGenerationsPerBatch samenvoegen tot hun maximumwaarde van 2000, waardoor de mogelijkheid om de generatie van een onderliggend artikel te verwerken in een batch die losstaat van de generatie van het bovenliggende artikel vrijwel niet wordt verwerkt.

-OF-

  • Verwijder de NOT FOR REPLICATION eigenschap voor de beperkingen voor refererende sleutels bij de herpublicatie. In dit geval kan de samenvoegagent geen rijen invoegen in het onderliggende artikel omdat er geen bovenliggende artikelrijen zijn gekoppeld. Houd er echter rekening mee dat er prestatievermindering kan zijn gekoppeld aan deze wijziging. Als de samenvoegagent deze onderliggende rijen niet kan invoegen, moeten deze wijzigingen opnieuw worden uitgevoerd. Het proces voor opnieuw proberen van de samenvoegagent is veel minder efficiënt dan de normale modus voor batchverwerking.

Meer informatie

Hier volgt een gedetailleerdere reeks gebeurtenissen waaronder dit probleem kan optreden. De standaardwaarden voor de -UploadGenerationsPerBatch parameters en -DownloadGenerationsPerBatch Samenvoegagent (die veel te maken hebben met dit probleem) zijn 100. In het volgende voorbeeld wordt ervan uitgegaan dat de -UploadGenerationsPerBatch parameters en -DownloadGenerationsPerBatch niet zijn gewijzigd.

  • INSERT's worden weergegeven bij de uitgever op het hoogste niveau in een onderliggend en bovenliggend artikel. Een onderliggend artikel is een artikel in een publicatie met een refererende sleutelbeperking ten opzichte van een andere tabel, een bovenliggend artikel genoemd. Deze twee artikelen zijn gerelateerd door een filter voor samenvoeging van replicatie en de werkelijke externe sleutelbeperkingen aan de serverzijde bij de herpublicer en abonnee worden gemarkeerd met de eigenschap NIET VOOR REPLICATIE. U kunt de sp_help opgeslagen procedure in de tabellen uitvoeren om te bepalen of de beperkingen niet voor replicatie gelden, als u niet zeker bent.
  • De INSERT's in de onderliggende tabel komen (bijvoorbeeld) voor in generatie 110. De INSERT's in de bovenliggende tabel komen (bijvoorbeeld) voor in generatie 250. De scheiding tussen deze generaties is groter dan de -DownloadGenerationsPerBatch parameter.
  • De samenvoegagent uitgever/herpublicatie verwerkt de batch van generaties die de generaties 101 tot 200 bevatten. Na een geslaagde verwerking van deze batch en een download van de bijbehorende wijzigingen in die generaties naar de herpublicatie, wordt de samenvoegagent voor uitgever-herpublicatie onderbroken. De onderbreking treedt op voordat de samenvoegagent de generaties 201 tot en met 300 kan verwerken (met wijzigingen in het bovenliggende artikel). De onderbreking kan worden veroorzaakt door verlies van netwerkverbinding, een time-out voor query's, enzovoort. De samenvoegagent kan de onderliggende artikelrijen zonder de bovenliggende rijen doorvoeren, omdat de beperking voor refererende sleutel aan de serverzijde is gemarkeerd als NIET VOOR REPLICATIE, waardoor de controle van de beperking wordt 'onderbroken'.
  • Voordat de samenvoegagent uitgever-herpublicatie opnieuw begint te verwerken, begint de samenvoegagent voor opnieuw publicerende abonnee een samenvoegsessie. Hiermee begint het proces voor het downloaden van wijzigingen van de herpublicatie.
  • Wanneer de samenvoegagent voor herpublicatie/abonnee generatie 110 (het onderliggende artikel INSERTs) verwerkt, wordt het joinfilter tussen het onderliggende artikel en het bovenliggende artikel geëvalueerd. Omdat de wijzigingen in het bovenliggende artikel nog niet zijn aangekomen bij de herpublicatie, bepaalt de samenvoegagent dat deze onderliggende INSERT's het joinfilter niet 'kwalificeren'. De samenvoegagent downloadt de MSmerge_genhistory rij die generatie 110 vertegenwoordigt, maar geen van de wijzigingen in die generatie. Deze samenvoegagent voltooit de sessie.
  • Bij een volgende uitvoering van de samenvoegagent tussen de uitgever en de herpublicatie wordt de batch van generaties met de INSERT's van het bovenliggende artikel (generaties 201 tot en met 300) verwerkt en worden deze wijzigingen doorgevoerd bij de herpublicatie.
  • Ten slotte houdt een volgende sessie van de samenvoegagent tussen de herpublicer en abonnee rekening met generatie 250 en downloadt het bovenliggende artikel INSERTs naar de abonnee. Omdat de abonnee echter ook generatie 110 kent (de generatie van het onderliggende artikel), evalueert de samenvoegagent de partitie van het onderliggende artikel niet opnieuw.

Dit resulteert in de juiste bovenliggende artikelrijen die aanwezig zijn bij de abonnee met orphaned onderliggende rijen bij de herpublicatie.