Non-convergence lorsque SQL Server traite les générations enfants et parentes dans des lots de génération distincts

Cet article vous aide à résoudre le problème de non-convergence qui se produit lorsque SQL Server traite les générations enfants et parentes dans des lots de génération distincts.

Version du produit d’origine : SQL Server
Numéro de la base de connaissances d’origine : 308266

Symptômes

Une perte de commandes INSERT dans des tables enfants sur un abonné peut se produire dans les conditions suivantes :

  • La topologie de réplication de fusion est hiérarchique, avec un serveur de publication, un ou plusieurs republiers et un ou plusieurs abonnés.
  • Un ou plusieurs articles parents et enfants existent dans une publication de réplication de fusion, avec un filtre de jointure défini entre eux.
  • Une NOT FOR REPLICATION contrainte de clé étrangère existe au niveau du rééditeur et de l’abonné pour la relation entre ces deux articles.
  • Les INSERT dans un article enfant se produisent dans une génération distincte de la génération parente associée par plus que la valeur spécifiée dans le paramètre de l’agent -DownloadGenerationsPerBatch de fusion. Par conséquent, l’agent de fusion traite la génération enfant dans un lot de générations distinctes de la génération parente associée.
  • Il y a une interruption du traitement de fusion entre le serveur de publication et le republier et entre le traitement des lots de génération enfant et parent.

Solution de contournement

L’architecture de réplication de fusion ne fournit pas de mécanisme permettant de conserver ensemble les modifications parent et enfant au-delà des limites de traitement par lots de génération. Pour contourner ce problème, vous pouvez :

  • Augmentez les -UploadGenerationsPerBatch paramètres et -DownloadGenerationsPerBatch Agent de fusion à leur valeur maximale de 2000, ce qui élimine pratiquement la possibilité de traiter la génération d’un article enfant dans un lot distinct de la génération de l’article parent.

- OU -

  • Supprimez la NOT FOR REPLICATION propriété sur les contraintes de clé étrangère au niveau du republier. Dans ce cas, le Agent de fusion n’est pas en mesure d’insérer des lignes dans l’article enfant, car aucune ligne d’article parent n’est associée. Gardez à l’esprit, toutefois, qu’il peut y avoir une dégradation des performances associée à cette modification. Si le Agent de fusion ne parvient pas à insérer ces lignes enfants, ces modifications doivent faire l’objet d’une nouvelle tentative. Le processus de nouvelle tentative Agent de fusion est beaucoup moins efficace que son mode normal de traitement par lots.

Plus d’informations

Voici une séquence d’événements plus détaillée sous laquelle ce problème peut se produire. Les valeurs par défaut pour les -UploadGenerationsPerBatch paramètres et -DownloadGenerationsPerBatch Agent de fusion (qui portent lourdement sur ce problème) sont 100. Dans l’exemple suivant, supposons que les paramètres et -DownloadGenerationsPerBatch n’ont -UploadGenerationsPerBatch pas été modifiés.

  • Les INSERT se produisent au niveau de l’éditeur de niveau supérieur dans un article enfant et un article parent. Un article enfant est un article d’une composition qui a une contrainte de clé étrangère à une autre table, appelée article parent. Ces deux articles sont liés par un filtre de jointure de réplication de fusion et les contraintes de clé étrangère côté serveur réelles au niveau du rééditeur et de l’abonné sont marquées avec la propriété NOT FOR REPLICATION. Vous pouvez exécuter la procédure stockée sp_help sur les tables pour déterminer si les contraintes ne sont pas destinées à la réplication, si vous n’êtes pas sûr.
  • Les valeurs INSERT dans la table enfant se produisent (par exemple) dans la génération 110. Les INSERT dans la table parente se produisent (par exemple) dans la génération 250. La séparation entre ces générations est supérieure au -DownloadGenerationsPerBatch paramètre .
  • L’éditeur-republisher Agent de fusion traite le lot de générations qui contiennent les générations 101 à 200. Après un traitement réussi de ce lot et un téléchargement des modifications associées dans ces générations vers le republier, le Agent de fusion publisher-republisher est interrompu. L’interruption se produit avant que le Agent de fusion puisse traiter les générations 201 à 300 (contenant les modifications de l’article parent). L’interruption peut être due à une perte de connectivité réseau, à un délai d’expiration de requête, etc. Le Agent de fusion peut valider les lignes d’article enfant sans les lignes parentes, car la contrainte de clé étrangère côté serveur est marquée comme NOT FOR REPLICATION, ce qui « suspend » la case activée de la contrainte.
  • Avant que le Agent de fusion publisher-republisher recommence le traitement, le Agent de fusion republisher-subscriber commence une session de fusion. Il commence le processus de téléchargement des modifications à partir du republier.
  • Lorsque le Agent de fusion de republisher-subscriber traite la génération 110 (l’article enfant INSERTs), il évalue le filtre de jointure présent entre l’article enfant et l’article parent. Étant donné que les modifications apportées à l’article parent n’ont pas encore été apportées au republier, le Agent de fusion détermine que ces INSERT enfants ne « qualifient » pas le filtre de jointure. Le Agent de fusion télécharge la ligne MSmerge_genhistory qui représente la génération 110, mais aucune des modifications apportées à cette génération. Cette Agent de fusion termine correctement sa session.
  • Une exécution ultérieure du Agent de fusion entre l’éditeur et le republier traite correctement le lot de générations qui contiennent les INSERT de l’article parent (générations 201 à 300) et valide ces modifications au niveau du republier.
  • Enfin, une session de Agent de fusion ultérieure entre le republier et l’abonné prend en compte la génération 250 et télécharge les INSERT de l’article parent sur l’abonné. Toutefois, étant donné que l’abonné connaît également la génération 110 (la génération de l’article enfant), le Agent de fusion ne réévalue pas la partition de l’article enfant.

Il en résulte que les lignes d’article parent correctes sont présentes sur l’abonné avec orphaned des lignes enfants au niveau du republier.