Partager via


Comment la réplication par fusion suit et énumère les modifications

Une fois qu’une publication ou un abonnement est initialisé, la réplication par fusion effectue le suivi et énumère toutes les modifications apportées aux données dans les tables publiées. Les modifications sont suivies par le biais de déclencheurs (que la réplication crée pour chaque table publiée) et les tables système dans les bases de données de publication et d’abonnement. Ces tables système de réplication sont remplies de métadonnées qui indiquent quelles modifications doivent être propagées. Lorsque l’Agent de fusion s’exécute pendant la synchronisation, les modifications sont énumérées par l’agent, puis appliquées au serveur de publication et à l’Abonné si nécessaire.

Suivi des modifications

La réplication de fusion utilise les déclencheurs et les tables système suivantes pour suivre les modifications de toutes les tables publiées :

  • MSmerge_ins_<GUID>: insérer un déclencheur (la valeur GUID de ce déclencheur et les autres déclencheurs sont dérivés de sysmergearticles)
  • MSmerge_upd_<GUID>: déclencheur de mise à jour
  • MSmerge_del_<GUID>: supprimer le déclencheur
  • MSmerge_contents
  • MSmerge_tombstone
  • MSmerge_genhistory

La réplication de fusion utilise les tables système supplémentaires suivantes pour suivre les modifications apportées aux tables filtrées :

  • MSmerge_partition_groups
  • MSmerge_current_partition_mappings
  • MSmerge_past_partition_mappings

Remarque

Les tables système répertoriées sont utilisées par toutes les publications et tous les abonnements de fusion dans une base de données. Par exemple, si vous avez plusieurs publications dans une base de données de publication, MSmerge_contents contient des lignes provenant d’articles de toutes les publications.

Suivi des modifications pour les tables non filtrées

Tables système

Les tables système utilisées pour les tables non filtrées et filtrées contiennent les métadonnées suivantes :

  • MSmerge_contents contient une ligne pour chaque ligne insérée ou mise à jour dans une table publiée dans la base de données.

  • MSmerge_tombstone contient une ligne pour chaque ligne supprimée d’une table publiée dans la base de données.

  • MSmerge_genhistory contient une ligne pour chaque génération. Une génération est un ensemble de modifications qui sont fournies à un éditeur ou à un abonné. Les générations sont fermées chaque fois que l’Agent de fusion s’exécute ; les modifications suivantes dans une base de données sont ajoutées à une ou plusieurs générations ouvertes.

Processus de suivi des modifications

Le processus de suivi des modifications suivant est utilisé pour toutes les tables non filtrées :

  • Lorsqu’une insertion ou une mise à jour se produit sur une table publiée, le déclencheur MSmerge_ins_<GUID> ou MSmerge_upd_<GUID> se déclenche, et une ligne est insérée dans la table système MSmerge_contents. La colonne rowguid de MSmerge_contents contient le GUID de la ligne insérée ou mise à jour, indiquant qu'à la prochaine synchronisation, les lignes insérées ou mises à jour correspondantes dans la table utilisateur doivent être envoyées à l'éditeur ou aux abonnés. Si des mises à jour ultérieures se produisent sur une ligne d'une table utilisateur, la ligne dans MSmerge_contents est mise à jour pour refléter cet état.

  • Lorsqu’une suppression se produit sur une table publiée, le MSmerge_del_<GUID> déclencheur se déclenche et une ligne est insérée dans la MSmerge_tombstone table système. La rowguid colonne de MSmerge_tombstone contient le GUID de la ligne supprimée, indiquant que lors de la prochaine synchronisation, une suppression doit être envoyée à Publisher ou aux abonnés pour la ligne supprimée correspondante dans la table utilisateur. Si la ligne supprimée est référencée MSmerge_contents (car elle a été insérée ou mise à jour depuis la dernière synchronisation), la ligne est supprimée de MSmerge_contents.

Suivi des modifications pour les tables filtrées

Tables système

Outre les tables système décrites dans la section précédente, trois tables de la base de données de publication contiennent des métadonnées pour le suivi des modifications apportées aux tables filtrées :

  • MSmerge_partition_groups contient une ligne pour chaque partition définie dans une publication. Les partitions peuvent être les suivantes :

    • Défini explicitement à l’aide sp_addmergepartition ou à la page Partitions de données de la boîte de dialogue Propriétés de la publication.

    • Créé automatiquement lorsqu’un Abonné se synchronise si l’Abonné requiert une partition qui n’a pas encore d’entrée MSmerge_partition_groups.

  • MSmerge_current_partition_mappings contient une ligne pour chaque combinaison unique de lignes dans MSmerge_contents et MSmerge_partition_groups. Par exemple, si une ligne d’une table utilisateur appartient à deux partitions et que la ligne est mise à jour, une ligne est insérée MSmerge_contents pour refléter la mise à jour, et deux lignes sont insérées dans MSmerge_current_partition_mappings, pour indiquer que la ligne mise à jour appartient aux deux partitions.

  • MSmerge_past_partition_mappings contient une ligne pour chaque ligne qui n’appartient plus à une partition donnée. Une ligne sort d'une partition si :

    • La ligne est supprimée. Si une ligne est supprimée d’une table utilisateur, une ligne est insérée MSmerge_tombstone et une ou plusieurs lignes sont insérées dans MSmerge_past_partition_mappings.

    • La valeur d’une colonne utilisée pour le filtrage a changé. Par exemple, si un filtre paramétré est basé sur l'État où une entreprise a son siège social et que l'entreprise déménage, la ligne de l’entreprise (et les lignes associées dans d'autres tables) peut sortir de la partition de données d'un commercial pour aller dans la partition d'un autre commercial. Si une ligne est mise à jour de telle sorte qu’elle n’appartient plus à une partition, une ligne est insérée ou mise à jour MSmerge_contents et une ou plusieurs lignes sont insérées dans MSmerge_past_partition_mappings.

Remarque

Si des partitions disjointes avec un abonnement par partition (une valeur de 3 pour le paramètre @partition_options de sp_addmergearticle) sont utilisées, les tables système MSmerge_current_partition_mappings et MSmerge_past_partition_mappings ne sont pas utilisées pour suivre les mappages de partition des lignes, car chaque ligne appartient à une seule partition et ne peut être modifiée que par un seul abonné.

Processus de suivi des modifications

Le processus décrit précédemment (dans la section Suivi des modifications pour les tables non filtrées) pour les tables non filtrées est également utilisé pour les tables filtrées, avec les ajouts suivants :

  • Lorsqu'une insertion se produit sur une table publiée, les données sont mises à jour ou insérées dans MSmerge_contents, et un mappage de partition est ajouté à MSmerge_current_partition_mappings pour chaque partition à laquelle appartient la ligne.

  • Lorsqu'une mise à jour se produit sur une table publiée, en plus des données mises à jour ou insérées dans MSmerge_contents, s'il n'existe pas de mappage de partition dans MSmerge_current_partition_mappings pour chaque partition à laquelle la ligne appartient, un mappage de partition est ajouté. Si la mise à jour a entraîné le déplacement d’une ligne d’une partition vers une autre, une ligne est mise à jour MSmerge_current_partition_mappings et une ligne est ajoutée à MSmerge_past_partition_mappings.

  • Lorsqu’une suppression se produit sur une table publiée, en plus de l’insertion d’une ligne dans MSmerge_tombstone, une ligne est supprimée de MSmerge_current_partition_mappings et une ligne est ajoutée à MSmerge_past_partition_mappings.

Modifier l’énumération

Tables et procédures système

Lorsque l’Agent de fusion s’exécute, les modifications sont énumérées à l’aide de plusieurs tables système et procédures stockées :

  • MSmerge_genhistory contient une ligne pour chaque génération. Une génération est un ensemble de modifications qui sont fournies à un éditeur ou à un abonné. Les générations sont fermées chaque fois que l’Agent de fusion s’exécute ; les modifications suivantes dans une base de données sont ajoutées à une ou plusieurs générations ouvertes.

  • sysmergesubscriptions contient des informations sur les abonnements, y compris un enregistrement des dernières générations de modifications qu’un nœud a envoyées et reçues. Dans la base de données de publication, cette table contient une ligne pour le serveur de publication et une ligne pour chaque Abonné. Dans une base de données d’abonnement, cette table contient généralement une ligne pour l’Abonné et une ligne pour le serveur de publication.

  • MSmerge_generation_partition_mappings est utilisé uniquement pour les tables filtrées, enregistrant si une génération donnée contient des modifications pertinentes pour une partition donnée. Cette table de la base de données de publication contient une ligne pour chaque combinaison unique de lignes dans MSmerge_genhistory et MSmerge_partition_groups.

  • sp_MSmakegeneration clôture toutes les générations ouvertes au début du processus d’énumération.

  • sp_MSenumchanges énumère les modifications apportées aux tables (plusieurs procédures connexes qui ont des noms commençant sp_MSenumchanges par sont également utilisées dans ce processus).

  • sp_MSgetmetadata détermine si une modification d’un nœud doit être appliquée à un autre nœud en tant qu’insertion, mise à jour ou suppression.

Modifier le processus d’énumération

Le processus suivant se produit pendant l’énumération des modifications :

  1. La procédure système sp_MSmakegeneration est appelée :

    • Pour les tables non filtrées et filtrées, cette procédure ferme toutes les générations ouvertes référencées dans MSmerge_genhistory (les générations fermées ont une valeur de 1 ou de 2 dans la colonne genstatus).

    • Pour les tables filtrées, cette procédure remplit la table système MSmerge_generation_partition_mappings. Si une génération contient une ou plusieurs modifications pertinentes pour une partition, une ligne est insérée dans la table système. Si une génération ne contient aucune modification pertinente pour une partition donnée, une ligne n’est pas insérée MSmerge_generation_partition_mappingset les modifications ne sont pas énumérées pour les Abonnés qui reçoivent cette partition.

  2. La procédure sp_MSenumchanges stockée et les procédures associées sont appelées. Ces procédures énumèrent les modifications qui se sont produites depuis la dernière synchronisation :

    1. Les procédures déterminent d’abord la génération à laquelle l’énumération démarre, en fonction des colonnes sentgen (dernière génération envoyée) et recgen (dernière génération reçue) dans la table sysmergesubscriptions.

      Par exemple, lors de la détermination des modifications des générations à énumérer pour un Abonné donné, l’Abonné sentgen (stocké dans la base de données de publication) et l’Abonné recgen (stocké dans la base de données d’abonnement) sont comparés. Si les valeurs sont identiques (ce qui indique que la dernière génération envoyée par le serveur de publication a été reçue avec succès par l’Abonné), les modifications sont énumérées à partir de la prochaine génération dans MSmerge_genhistory. Si les valeurs ne sont pas identiques, la valeur inférieure des deux valeurs est utilisée pour s’assurer que toutes les modifications requises sont envoyées.

    2. Les procédures énumèrent ensuite les modifications :

      Pour les tables non filtrées, toutes les modifications contenues dans des générations après la génération dans sentgen ou recgen sont énumérées : MSmerge_genhistory est jointe à MSmerge_contents et MSmerge_tombstone pour déterminer les modifications à envoyer.

      Pour les tables filtrées, MSmerge_generation_partition_mappings est joint à : MSmerge_current_partition_mappings et MSmerge_contents; et MSmerge_past_partition_mappingsMSmerge_tombstone pour déterminer quelles modifications sont pertinentes pour la partition que l’Abonné reçoit.

  3. La procédure sp_MSgetmetadata stockée est appelée pour déterminer si une modification doit être appliquée en tant qu’insertion, mise à jour ou suppression. À ce stade, la détection et la résolution des conflits sont effectuées ; pour plus d’informations, consultez Comment la réplication de fusion détecte et résout les conflits.