Freigeben über


Wie die Mergereplikation Änderungen nachverfolgt und aufzählt

Nachdem eine Publikation oder ein Abonnement initialisiert wurde, verfolgt und zählt die Mergereplikation alle Änderungen an den Daten in veröffentlichten Tabellen auf. Änderungen werden durch Trigger nachverfolgt (die die Replikation für jede veröffentlichte Tabelle erstellt) und durch Systemtabellen in den Publikations- und Abonnementdatenbanken. Diese Replikationssystemtabellen werden mit Metadaten aufgefüllt, die angibt, welche Änderungen weitergegeben werden sollen. Wenn der Zusammenführungs-Agent während der Synchronisierung ausgeführt wird, werden Änderungen vom Agent aufgezählt und dann nach Bedarf auf den Herausgeber und den Abonnenten angewendet.

Änderungsnachverfolgung

Die Mergereplikation verwendet die folgenden Auslöser und Systemtabellen, um Änderungen für alle veröffentlichten Tabellen nachzuverfolgen:

  • MSmerge_ins_<GUID>: Auslöser einfügen (der GUID-Wert für diesen und die anderen Auslöser wird aus sysmergearticles abgeleitet)
  • MSmerge_upd_<GUID>: Auslöser aktualisieren
  • MSmerge_del_<GUID>: Auslöser löschen
  • MSmerge_contents
  • MSmerge_tombstone
  • MSmerge_genhistory

Die Merge-Replikation verwendet die folgenden zusätzlichen Systemtabellen, um Änderungen für gefilterte Tabellen nachzuverfolgen.

  • MSmerge_partition_groups
  • MSmerge_current_partition_mappings
  • MSmerge_past_partition_mappings

Hinweis

Die aufgelisteten Systemtabellen werden von allen Zusammenführungspublikationen und Abonnements in einer Datenbank verwendet; Wenn Sie beispielsweise mehr als eine Publikation in einer Publikationsdatenbank haben, MSmerge_contents enthält sie Zeilen aus Artikeln in allen Publikationen.

Änderungsnachverfolgung für nicht gefilterte Tabellen

Systemtabellen

Die Systemtabellen, die für ungefilterte und gefilterte Tabellen verwendet werden, enthalten die folgenden Metadaten:

  • MSmerge_contents enthält eine Zeile für jede Zeile, die in einer veröffentlichten Tabelle in der Datenbank eingefügt oder aktualisiert wird.

  • MSmerge_tombstone enthält eine Zeile für jede Zeile, die aus einer veröffentlichten Tabelle in der Datenbank gelöscht wird.

  • MSmerge_genhistory enthält eine Zeile für jede Generation. Eine Generation ist eine Sammlung von Änderungen, die an einen Herausgeber oder Abonnenten übermittelt werden. Generationen werden jedes Mal geschlossen , wenn der Merge-Agent ausgeführt wird; Nachfolgende Änderungen in einer Datenbank werden einer oder mehreren offenen Generationen hinzugefügt.

Änderungsverfolgungsprozess

Der folgende Änderungsnachverfolgungsprozess wird für alle nicht gefilterten Tabellen verwendet:

  • Wenn in einer veröffentlichten Tabelle ein Einfügen oder Aktualisieren erfolgt, wird der MSmerge_ins_<GUID>- oder MSmerge_upd_<GUID>-Trigger ausgelöst, und eine Zeile wird in die MSmerge_contents-Systemtabelle eingefügt. Die Spalte rowguid von MSmerge_contents enthält die GUID für die eingefügte oder aktualisierte Zeile, die angibt, dass die entsprechend eingegebene oder aktualisierte Zeile in der Benutzertabelle bei der nächsten Synchronisierung an die Verleger oder Abonnenten gesendet werden soll. Wenn nachfolgende Aktualisierungen in einer Zeile in einer Benutzertabelle auftreten, wird die Zeile in MSmerge_contents aktualisiert, um diesen Zustand zu widerspiegeln.

  • Wenn ein Löschvorgang in einer veröffentlichten Tabelle auftritt, wird der MSmerge_del_<GUID> Auslöser ausgelöst, und eine Zeile wird in die MSmerge_tombstone Systemtabelle eingefügt. Die rowguid Spalte von MSmerge_tombstone enthält die GUID für die gelöschte Zeile und deutet darauf hin, dass bei der nächsten Synchronisierung ein Löschvorgang für die entsprechende gelöschte Zeile in der Benutzertabelle an den Herausgeber oder die Abonnenten gesendet werden soll. Wenn auf die gelöschte Zeile verwiesen MSmerge_contents wird (da sie seit der letzten Synchronisierung eingefügt oder aktualisiert wurde), wird die Zeile aus gelöscht MSmerge_contents.

Änderungsnachverfolgung für gefilterte Tabellen

Systemtabellen

Zusätzlich zu den im vorherigen Abschnitt beschriebenen Systemtabellen enthalten drei Tabellen in der Publikationsdatenbank Metadaten zum Nachverfolgen von Änderungen an gefilterten Tabellen:

  • MSmerge_partition_groups enthält eine Zeile für jede Partition, die in einer Publikation definiert ist. Partitionen können folgendes sein:

    • Explizit mithilfe von sp_addmergepartition oder der Seite "Datenpartitionen" des Dialogfelds "Publikationseigenschaften" definiert.

    • Wird automatisch erstellt, wenn ein Abonnent synchronisiert wird und der Abonnent eine Partition benötigt, die noch keinen Eintrag in MSmerge_partition_groups hat.

  • MSmerge_current_partition_mappings enthält eine Zeile für jede eindeutige Kombination aus Zeilen in MSmerge_contents und MSmerge_partition_groups. Wenn beispielsweise eine Zeile in einer Benutzertabelle zu zwei Partitionen gehört und die Zeile aktualisiert wird, wird eine Zeile in MSmerge_contents eingefügt, um das Update zu reflektieren, und zwei Zeilen werden in MSmerge_current_partition_mappings eingefügt, um anzugeben, dass die aktualisierte Zeile zu den beiden Partitionen gehört.

  • MSmerge_past_partition_mappings enthält eine Zeile für jede Zeile, die nicht mehr zu einer bestimmten Partition gehört. Eine Zeile wird aus einer Partition verschoben, wenn:

    • Die Zeile wird gelöscht. Wenn eine Zeile aus einer Benutzertabelle gelöscht wird, wird eine Zeile in MSmerge_tombstone eingefügt, und eine oder mehrere Zeilen werden in MSmerge_past_partition_mappings eingefügt.

    • Der Wert in einer Spalte, die zum Filtern verwendet wird, wurde geändert. Wenn beispielsweise ein parametrisierter Filter auf dem Bundesland basiert, in dem ein Unternehmen seinen Hauptsitz hat, und das Unternehmen umzieht, kann die Zeile für das Unternehmen (und verwandte Zeilen in anderen Tabellen) aus der Datenpartition eines Vertriebsmitarbeiters in die Partition eines anderen Vertriebsmitarbeiters verschoben werden. Wenn eine Zeile so aktualisiert wird, dass sie nicht mehr zu einer Partition gehört, wird eine Zeile in MSmerge_contents eingefügt oder aktualisiert, und eine oder mehrere Zeilen werden in MSmerge_past_partition_mappings eingefügt.

Hinweis

Wenn nicht-überlappende Partitionen mit einem Abonnement pro Partition (ein Wert von 3 für den Parameter @partition_options von sp_addmergearticle) verwendet werden, werden die Systemtabellen MSmerge_current_partition_mappings und MSmerge_past_partition_mappings nicht verwendet, um die Partitionszuordnungen der Zeilen nachzuverfolgen, da jede Zeile nur zu einer Partition gehört und nur bei einem Abonnenten geändert werden kann.

Änderungsverfolgungsprozess

Der zuvor beschriebene Prozess (im Abschnitt "Änderungsnachverfolgung für ungefilterte Tabellen") für nicht gefilterte Tabellen wird auch für gefilterte Tabellen mit den folgenden Ergänzungen verwendet:

  • Wenn ein Einfügevorgang in einer veröffentlichten Tabelle erfolgt, werden zusätzlich zu den Daten, die in MSmerge_contents aktualisiert oder eingefügt werden, für jede Partition, zu der die Zeile gehört, eine Partitionszuordnung zu MSmerge_current_partition_mappings hinzugefügt.

  • Wenn in einer veröffentlichten Tabelle eine Aktualisierung erfolgt, werden zusätzlich zu den Daten, die aktualisiert oder in MSmerge_contents eingefügt werden dürfen, für jede Partition, zu der die Zeile gehört und für die in MSmerge_current_partition_mappings keine Partitionszuordnung existiert, eine hinzugefügt. Wenn das Update dazu führte, dass eine Zeile von einer Partition in eine andere verschoben wurde, wird eine Zeile aktualisiert MSmerge_current_partition_mappings und einer hinzugefügt MSmerge_past_partition_mappings.

  • Wenn ein Löschvorgang in einer veröffentlichten Tabelle erfolgt, wird eine Zeile in MSmerge_tombstone eingefügt, eine Zeile aus MSmerge_current_partition_mappings gelöscht und eine in MSmerge_past_partition_mappings hinzugefügt.

Enumeration ändern

Systemtabellen und -verfahren

Wenn der Zusammenführungs-Agent ausgeführt wird, werden Änderungen mithilfe mehrerer Systemtabellen und gespeicherter Prozeduren aufgezählt:

  • MSmerge_genhistory enthält eine Zeile für jede Generation. Eine Generation ist eine Sammlung von Änderungen, die an einen Herausgeber oder Abonnenten übermittelt werden. Generationen werden jedes Mal geschlossen , wenn der Merge-Agent ausgeführt wird; Nachfolgende Änderungen in einer Datenbank werden einer oder mehreren offenen Generationen hinzugefügt.

  • sysmergesubscriptions enthält Informationen zu Abonnements, einschließlich eines Datensatzes der letzten Generationen von Änderungen, die ein Knoten gesendet und empfangen hat. In der Publikationsdatenbank enthält diese Tabelle eine Zeile für den Herausgeber und eine Zeile für jeden Abonnenten. In einer Abonnementdatenbank enthält diese Tabelle in der Regel eine Zeile für den Abonnenten und eine Zeile für den Publisher.

  • MSmerge_generation_partition_mappings wird nur für gefilterte Tabellen verwendet, wobei aufgezeichnet wird, ob eine bestimmte Generation änderungen enthält, die für eine bestimmte Partition relevant sind. Diese Tabelle in der Publikationsdatenbank enthält eine Zeile für jede eindeutige Kombination aus Zeilen in MSmerge_genhistory und MSmerge_partition_groups.

  • sp_MSmakegeneration schließt alle offenen Generierungen am Anfang des Enumerationsprozesses.

  • sp_MSenumchanges Listet Änderungen für Tabellen auf (mehrere verwandte Prozeduren, die sp_MSenumchanges mit Namen beginnen, werden ebenfalls in diesem Prozess verwendet).

  • sp_MSgetmetadata bestimmt, ob eine Änderung von einem Knoten auf einen anderen Knoten als Einfüge-, Aktualisierungs- oder Löschvorgang angewendet werden soll.

Prozess zur Änderung der Enumeration

Der folgende Prozess tritt während der Änderungsenumeration auf:

  1. Die Systemprozedur sp_MSmakegeneration wird aufgerufen:

    • Bei ungefilterten und gefilterten Tabellen schließt dieses Verfahren alle offenen Generationen, auf die in MSmerge_genhistory verwiesen wird (geschlossene Generationen haben in der Spalte genstatus einen Wert von 1 oder 2).

    • Bei gefilterten Tabellen füllt diese Prozedur die Systemtabelle MSmerge_generation_partition_mappingsauf. Wenn eine Generation eine oder mehrere Änderungen enthält, die für eine Partition relevant sind, wird eine Zeile in die Systemtabelle eingefügt. Wenn eine Generation keine Änderungen enthält, die für eine bestimmte Partition relevant sind, wird eine Zeile nicht in MSmerge_generation_partition_mappings eingefügt, und Änderungen werden für Abonnenten, die diese Partition empfangen, nicht aufgezählt.

  2. Die gespeicherte Prozedur sp_MSenumchanges und zugehörige Prozeduren werden aufgerufen. In diesen Verfahren werden die Seit der letzten Synchronisierung aufgetretenen Änderungen aufgelistet:

    1. Die Prozeduren bestimmen zuerst die Generation, an der die Aufzählung beginnt, basierend auf den Spalten sentgen (zuletzt gesendete Generation) und recgen (zuletzt empfangene Generation) in der Tabelle sysmergesubscriptions.

      Wenn Sie z. B. bestimmen, welche Generationenänderungen für einen bestimmten Abonnenten aufgelistet werden müssen, werden der sentgen Abonnenten (in der Publikationsdatenbank gespeichert) und der recgen Abonnenten (in der Abonnementdatenbank gespeichert) verglichen. Wenn die Werte identisch sind (was angibt, dass die letzte Generation, die vom Publisher gesendet wurde, erfolgreich vom Abonnenten empfangen wurde), werden Änderungen beginnend mit der nächsten Generation in MSmerge_genhistoryaufgelistet. Wenn die Werte nicht identisch sind, wird die untere der beiden Werte verwendet, um sicherzustellen, dass alle erforderlichen Änderungen gesendet werden.

    2. Die Prozeduren führen dann Änderungen auf:

      Bei ungefilterten Tabellen werden alle Änderungen aufgezählt, die in Generationen nach der Generation sentgen oder recgen enthalten sind: MSmerge_genhistory wird mit MSmerge_contents und MSmerge_tombstone verknüpft, um zu bestimmen, welche Änderungen gesendet werden müssen.

      Bei gefilterten Tabellen wird MSmerge_generation_partition_mappings mit MSmerge_current_partition_mappings und MSmerge_contents sowie MSmerge_past_partition_mappings und MSmerge_tombstone verbunden, um festzustellen, welche Änderungen für die Partition relevant sind, die der Abonnent erhält.

  3. Die gespeicherte Prozedur sp_MSgetmetadata wird aufgerufen, um zu bestimmen, ob eine Änderung als Einfüge-, Aktualisierungs- oder Löschvorgang angewendet werden soll. Zu diesem Zeitpunkt werden Konflikterkennung und -lösung durchgeführt; weitere Informationen finden Sie unter "Erkennen und Beheben von Konflikten durch die Zusammenführungsreplikation".