Funktionsweise der Nachverfolgung und der Enumeration bei der Mergereplikation
Nachdem eine Veröffentlichung initialisiert wurde, führt die Mergereplikation die Nachverfolgung und Enumeration (Aufzählung) aller Änderungen in den veröffentlichten Tabellen durch. Änderungen werden über Trigger, die die Replikation in jeder veröffentlichten Tabelle erstellt, sowie Systemtabellen in der Veröffentlichungs- und Abonnentendatenbank nachverfolgt. Diese Systemreplikationstabellen werden mit Metadaten gefüllt, die die weiterzugebenden Änderungen angeben. Wenn der Merge-Agent während der Synchronisierung ausgeführt wird, werden die Änderungen durch den Agenten aufgezählt und ggf. auf dem Verleger und dem Abonnenten angewendet.
Änderungsnachverfolgung
Die Mergereplikation verwendet folgende Trigger und Systemtabellen, um Änderungen an veröffentlichten Tabellen nachzuverfolgen:
MSmerge_ins_<GUID>: INSERT-Trigger (der GUID-Wert für diesen und für die anderen Trigger ist aus sysmergearticles abgeleitet)
MSmerge_upd_<GUID>: UPDATE-Trigger
MSmerge_del_<GUID>: DELETE-Trigger
MSmerge_contents
MSmerge_tombstone
MSmerge_genhistory
Die Mergereplikation verwendet folgende zusätzliche Systemtabellen, um Änderungen an gefilterten Tabellen nachzuverfolgen:
MSmerge_partition_groups
MSmerge_current_partition_mappings
MSmerge_past_partition_mappings
Hinweis |
---|
Die hier aufgeführten Systemtabellen werden von allen Mergeveröffentlichungen und Abonnements in einer Datenbank verwendet. Wenn sich z. B. mehr als eine Veröffentlichung in einer Veröffentlichungsdatenbank befindet, enthält MSmerge_contents Zeilen über Artikel in allen Veröffentlichungen. |
Änderungsnachverfolgung in ungefilterten Tabellen
Systemtabellen
Die Systemtabellen für gefilterte und ungefilterte Tabellen enthalten folgende Metadaten:
MSmerge_contents enthält eine Zeile für jede Zeile, die in einer veröffentlichten Tabelle der Datenbank hinzugefügt oder aktualisiert wurde.
MSmerge_tombstone enthält eine Zeile für jede Zeile, die in einer veröffentlichten Tabelle der Datenbank gelöscht wurde.
MSmerge_genhistory enthält eine Zeile für jede Generierung. Eine Generierung ist eine Auflistung von Änderungen, die an einen Verleger oder Abonnenten übermittelt wird. Generierungen werden bei jedem Ausführen des Merge-Agents geschlossen; anschließende Änderungen in einer Datenbank werden einer oder mehreren geöffneten Generierungen hinzugefügt.
Änderungsnachverfolgungsprozess
Der folgende Änderungsnachverfolgungsprozess wird für alle ungefilterten Tabellen verwendet:
Wenn ein INSERT oder ein UPDATE in einer veröffentlichten Tabelle auftritt, wird der MSmerge_ins_<GUID>- bzw. MSmerge_upd_<GUID>-Trigger ausgelöst und eine Zeile in die MSmerge_contents-Systemtabelle eingefügt. Die rowguid-Spalte der MSmerge_contents-Tabelle enthält die GUID der eingefügten bzw. aktualisierten Zeile und zeigt an, dass die entsprechende eingefügte bzw. aktualisierte Zeile in der Benutzertabelle bei der nächsten Synchronisierung an den Verleger oder die Abonnenten gesendet werden muss. Bei späteren Aktualisierungen derselben Zeile in der Benutzertabelle wird auch die Zeile in der MSmerge_contents-Tabelle entsprechend aktualisiert.
Wenn ein DELETE in einer veröffentlichten Tabelle auftritt, wird der MSmerge_del_<GUID>-Trigger ausgelöst und eine Zeile in die MSmerge_tombstone-Systemtabelle eingefügt. Die rowguid-Spalte der MSmerge_tombstone-Tabelle enthält die GUID der gelöschten Zeile und zeigt an, dass bei der nächsten Synchronisierung eine DELETE-Anweisung für die entsprechende gelöschte Zeile in der Benutzertabelle an den Verleger oder die Abonnenten gesendet werden muss. Wenn in der MSmerge_contents-Tabelle auf die gelöschte Zeile verwiesen wird (weil sie seit der letzten Synchronisierung eingefügt oder aktualisiert wurde), wird sie aus der MSmerge_contents-Tabelle gelöscht.
Änderungsnachverfolgung in gefilterten Tabellen
Systemtabellen
Außer den im vorherigen Abschnitt beschriebenen Systemtabellen enthalten drei weitere Tabellen in der Veröffentlichungsdatenbank Metadaten zum Nachverfolgen von Änderungen in gefilterten Tabellen:
MSmerge_partition_groups enthält eine Zeile für jede Partition, die in einer Veröffentlichung definiert ist. Auf Partitionen kann Folgendes zutreffen:
Sie können im über die gespeicherte Prozedur sp_addmergepartition oder die Seite Datenpartitionen im Dialogfeld Veröffentlichungseigenschaften explizit definiert werden.
Sie können bei der Synchronisierung eines Abonnenten automatisch erstellt werden, wenn für den Abonnenten eine Partition erforderlich ist, für die die MSmerge_partition_groups-Tabelle noch keinen Eintrag enthält.
MSmerge_current_partition_mappings enthält für jede eindeutige Zeilenkombination in MSmerge_contents und MSmerge_partition_groups eine Zeile. Wenn beispielsweise eine Zeile in einer Benutzertabelle zwei Partitionen zugehörig ist und diese Zeile aktualisiert wird, wird eine Zeile in MSmerge_contents eingefügt, um die Aktualisierung widerzuspiegeln, und zwei Zeilen in MSmerge_current_partition_mappings, um anzuzeigen, dass die aktualisierte Zeile den beiden Partitionen zugehörig ist.
MSmerge_past_partition_mappings enthält eine Zeile für jede Zeile, die keiner bestimmten Partition mehr zugehörig ist. In folgenden Fällen wird eine Zeile aus einer Partition verschoben:
Die Zeile wird gelöscht. Wenn eine Zeile aus einer Benutzertabelle gelöscht wird, wird eine Zeile in die MSmerge_tombstone-Tabelle eingefügt und eine oder mehrere Zeilen in die MSmerge_past_partition_mappings-Tabelle.
Der Wert in einer Spalte, die zum Filtern verwendet wird, hat sich geändert. Wenn beispielsweise ein parametrisierter Filter auf dem Bundesland basiert, in dem sich der Hauptsitz eines Unternehmens befindet, und das Unternehmen umzieht, wird die Zeile für das Unternehmen (und die zugehörigen Zeilen in anderen Tabellen) möglicherweise aus der Datenpartition eines Vertriebsmitarbeiters in die Partition eines anderen Vertriebsmitarbeiters verschoben. Wenn eine Zeile dahin gehend aktualisiert wird, dass sie keiner Partition mehr zugehörig ist, wird eine Zeile in die MSmerge_contents-Tabelle eingefügt oder aktualisiert und eine oder mehrere Zeilen in MSmerge_past_partition_mappings eingefügt.
Hinweis |
---|
Bei der Verwendung nicht überlappender Partitionen mit einem Abonnement pro Partition (Wert 3 für den @partition_options-Parameter von sp_addmergearticle) werden die Systemtabellen MSmerge_current_partition_mappings und MSmerge_past_partition_mappings nicht zur Nachverfolgung der Partitionszuordnungen der Zeilen verwendet, da jede Zeile nur einer Partition zugehörig ist und nur auf einem einzigen Abonnenten geändert werden kann. |
Änderungsnachverfolgungsprozess
Der im Abschnitt zur Änderungsnachverfolgung in ungefilterten Tabellen weiter oben beschriebene Prozess für ungefilterte Tabellen wird auch mit folgenden Zusätzen für gefilterte Tabellen verwendet:
Wenn ein INSERT in einer veröffentlichten Tabelle auftritt, werden Daten in der MSmerge_contents-Tabelle aktualisiert bzw. eingefügt und zusätzlich eine Partitionszuordnung zu der MSmerge_current_partition_mappings-Tabelle für jede Partition hinzugefügt, der die Zeile zugehörig ist.
Wenn ein UPDATE in einer veröffentlichten Tabelle auftritt, werden Daten in der MSmerge_contents-Tabelle aktualisiert bzw. eingefügt und zusätzlich eine Partitionszuordnung zu der MSmerge_current_partition_mappings-Tabelle für jede Partition hinzugefügt, der die Zeile zugehörig ist und für die noch keine Partitionszuordnung vorhanden ist. Wenn das UPDATE dazu führt, dass eine Zeile von einer Partition in eine andere verschoben wird, wird eine Zeile in der MSmerge_current_partition_mappings-Tabelle aktualisiert und eine Zeile in der MSmerge_past_partition_mappings-Tabelle hinzugefügt.
Wenn ein DELETE in einer veröffentlichten Tabelle auftritt, wird eine Zeile in der MSmerge_tombstone-Tabelle hinzugefügt und zusätzlich eine Zeile aus der MSmerge_current_partition_mappings-Tabelle gelöscht und schließlich eine Zeile in der MSmerge_past_partition_mappings hinzugefügt.
Änderungsenumeration
Systemtabellen und -prozeduren
Beim Ausführen des Merge-Agent werden die Änderungen mithilfe verschiedener Systemtabellen und gespeicherter Prozeduren aufgezählt:
MSmerge_genhistory enthält eine Zeile für jede Generierung. Eine Generierung ist eine Auflistung von Änderungen, die an einen Verleger oder Abonnenten übermittelt wird. Generierungen werden bei jedem Ausführen des Merge-Agents geschlossen; anschließende Änderungen in einer Datenbank werden einer oder mehreren geöffneten Generierungen hinzugefügt.
sysmergesubscriptions enthält Informationen zu Abonnements einschließlich eines Datensatzes zu den letzten von einem Knoten gesendeten und empfangenen Änderungsgenerierungen. In der Veröffentlichungsdatenbank enthält diese Tabelle eine Zeile für den Verleger und eine für jeden Abonnenten. In einer Abonnementdatenbank enthält diese Tabelle in der Regel eine Zeile für den Abonnenten und eine für den Verleger.
MSmerge_generation_partition_mappings wird nur für gefilterte Tabellen verwendet und zeichnet auf, ob eine bestimmte Generierung Änderungen enthält, die für eine bestimmte Partition relevant sind. Diese Tabelle der Veröffentlichungsdatenbank enthält für jede eindeutige Zeilenkombination in MSmerge_genhistory und MSmerge_partition_groups eine Zeile.
sp_MSmakegeneration schließt am Anfang des Enumerationsprozesses alle offenen Generierungen.
sp_MSenumchanges zählt Änderungen in Tabellen auf (weitere Prozeduren, deren Namen mit sp_MSenumchanges beginnen, werden ebenfalls in diesem Prozess verwendet).
sp_MSgetmetadata bestimmt, ob eine von einem Knoten stammende Änderung auf einen anderen Knoten als INSERT, UPDATE oder DELETE angewendet werden soll.
Änderungsenumerationsprozess
Folgender Prozess findet während der Änderungsenumeration statt:
Die sp_MSmakegeneration-Systemprozedur wird aufgerufen:
Diese Prozedur schließt alle offenen Generierungen, auf die in der MSmerge_genhistory-Tabelle verwiesen wird, in gefilterten und ungefilterten Tabellen (geschlossene Generierungen weisen in der genstatus-Spalte den Wert 1 oder 2 auf).
Bei gefilterten Tabellen füllt diese Prozedur die MSmerge_generation_partition_mappings-Systemtabelle. Wenn eine Generierung eine oder mehrere für eine Partition relevante Änderungen enthält, wird eine Zeile in die Systemtabelle eingefügt. Wenn eine Generierung keine für eine bestimmte Partition relevante Änderungen enthält, wird keine Zeile in die MSmerge_generation_partition_mappings-Tabelle eingefügt, und die Änderungen werden nicht für die die Partition empfangenden Abonnenten aufgezählt.
Die gespeicherte Prozedur sp_MSenumchanges und damit verbundene Prozeduren werden aufgerufen. Diese Prozeduren zählen die Änderungen auf, die seit der letzten Synchronisierung aufgetreten sind:
Die Prozeduren bestimmen zunächst mithilfe der Spalten sentgen (zuletzt gesendete Generierung) und recgen (zuletzt empfangene Generierung) in der sysmergesubscriptions-Tabelle die Generierung, bei der die Enumeration beginnen soll.
Wenn beispielsweise die Änderungen der Generierungen bestimmt werden sollen, die für einen bestimmten Abonnenten aufgezählt werden müssen, werden die Spalten sentgen des Abonnenten (in der Veröffentlichungsdatenbank gespeichert) und recgen des Abonnenten (in der Abonnementdatenbank gespeichert) verglichen. Wenn die Werte identisch sind (was bedeutet, dass die letzte vom Verleger gesendete Generierung erfolgreich vom Abonnenten empfangen wurde), werden die Änderungen ab der nächsten Generierung in der MSmerge_genhistory-Tabelle aufgezählt. Sind die Werte nicht identisch, wird der niedrigere der beiden Werte verwendet, um sicherzustellen, dass alle erforderlichen Änderungen gesendet werden.
Anschließend zählen die Prozeduren die Änderungen auf:
Bei ungefilterten Tabellen werden alle in Generierungen nach der Generierung in den Spalten sentgen oder recgen enthaltenen Änderungen aufgezählt: 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 verknüpft und MSmerge_past_partition_mappings mit MSmerge_tombstone, um zu bestimmen, welche Änderungen für die Partition relevant sind, die der Abonnent empfängt.
Die gespeicherte Prozedur sp_MSgetmetadata wird aufgerufen, um zu bestimmen, ob eine Änderung als INSERT, UPDATE oder DELETE angewendet werden soll. Nun werden die Konflikterkennung und -lösung ausgeführt. Weitere Informationen dazu finden Sie unter Konflikterkennung und -lösung bei der Mergereplikation.
Siehe auch