Database
 sql >> Datenbank >  >> RDS >> Database

Nachverfolgung auf Spalten- und Zeilenebene bei der Mergereplikation

Lassen Sie uns in diesem Artikel die Nachverfolgungsoptionen auf Zeilen- und Spaltenebene bei der Mergereplikation untersuchen und wie diese zur Erkennung von Konflikten während der Mergereplikation verwendet werden.

Mergereplikation: Die Mergereplikation wird verwendet, um Daten auf beide Arten zu replizieren, d. h. vom Herausgeber zum Abonnenten und vom Abonnenten zum Herausgeber.

Der anfängliche Snapshot von Objekten wird erstellt und auf Abonnenten angewendet. Inkrementelle Datenänderungen und Schemaänderungen werden mithilfe von Triggern nachverfolgt und auf Abonnenten angewendet, wenn der Abonnent mit dem Herausgeber synchronisiert wird.

Konflikte:

Bei der Mergereplikation sind Abonnent und Herausgeber unabhängig, und Daten können auf jedem Knoten geändert werden.

Wenn Daten sowohl auf dem Verleger als auch auf dem Abonnenten innerhalb des Replikationszyklus geändert werden und wenn der Abonnent mit dem Verleger synchronisiert wird, tritt ein Konflikt auf. Der Merge-Agent bestimmt den Gewinner auf beiden Seiten abhängig vom Konfliktlöser. Standardmäßig wird der Gewinner durch verschiedene Parameter wie Client- oder Serverabonnement, Pull- oder Push-Abonnement usw. ermittelt.

Konflikterkennung:

Die Konflikterkennung hängt von der Art der Nachverfolgung ab, die wir für den Artikel konfigurieren.

  • Verfolgung auf Zeilenebene: Wenn Datenänderungen an einer Spalte in derselben Zeile an beiden Enden vorgenommen werden, wird dies als Konflikt betrachtet.
  • Verfolgung auf Spaltenebene: Wenn an beiden Enden Datenänderungen an derselben Spalte vorgenommen werden, wird diese Änderung als Konflikt qualifiziert.

Auflöser:

Resolver wenden die Gewinnerdaten an beiden Enden an, wenn ein Konflikt auftritt.

Wenn es einen Konflikt zwischen dem Herausgeber und dem Abonnenten gibt, gewinnt standardmäßig immer der Herausgeber.

Wenn ein Konflikt zwischen zwei Abonnenten auftritt, wird der Gewinner durch den Client/Server-Abonnenten und die Pull/Push-Abonnements ermittelt.

Zusätzlich zum Standard-Resolver gibt es auch einige benutzerdefinierte Resolver. Wir werden benutzerdefinierte Resolver in kommenden Artikeln besprechen.

Mergereplikation mit Verfolgung auf Zeilenebene konfigurieren:

Publisher-Datenbank:pub_db

Abonnentendatenbank:sub_db

Lassen Sie uns die Tabelle „TBL_EMP“ erstellen und zur Merge-Replikation hinzufügen.

CREATE TABLE TBL_EMP
(EmpID INT, Emp_FName varchar(100),Emp_Lname varchar(100))

INSERT INTO TBL_EMP VALUES (1,'Jhon','P')

INSERT INTO TBL_EMP VALUES (2,'Alison','P')

INSERT INTO TBL_EMP VALUES (3,'Angela','P')

Um die Mergereplikation zu konfigurieren, sollte der Herausgeber so konfiguriert werden, dass er die lokale Verteilung oder die Remoteverteilung verwendet.

Navigieren Sie nach der Konfiguration der Verteilung zum Replikationsordner in SSMS und klicken Sie mit der rechten Maustaste auf lokale Veröffentlichungen.

Klicken Sie auf Weiter und wählen Sie die Publikationsdatenbank aus, klicken Sie auf Weiter und wählen Sie die Mergereplikation aus, wählen Sie 2008 oder später aus und fügen Sie die Tabelle zur Replikation hinzu.

Klicken Sie nun auf die Artikeleigenschaften und wählen Sie die Eigenschaften des markierten Artikels aus.

Wählen Sie die Nachverfolgungsebene als Nachverfolgung auf Zeilenebene aus.

Standardmäßig ist dies die Nachverfolgung auf Zeilenebene. Klicken Sie auf OK, Weiter, Weiter . Fügen Sie einen Filter hinzu, wenn Sie bestimmte Daten an den Abonnenten senden möchten, andernfalls ignorieren Sie ihn, aktivieren Sie Erstellen Snapshotsofort , konfigurieren Sie die Agentensicherheit nach Ihren Bedürfnissen, aktivieren Sie Veröffentlichung erstellen , geben Sie den Namen der Veröffentlichung an und klicken Sie auf Fertig stellen .

Sobald der anfängliche Snapshot erstellt ist, fügen Sie den Abonnenten hinzu.

Navigieren Sie zu der Veröffentlichung, die Sie im Replikationsordner auf dem Herausgeber erstellen, klicken Sie mit der rechten Maustaste und wählen Sie Neues Abonnement aus.

Klicken Sie auf Weiter , wählen Sie die Publikation aus, klicken Sie auf Weiter und wählen Sie je nach Bedarf das Pull- oder Push-Abonnement aus. In diesem Fall habe ich ein Push-Abonnement verwendet.

Wählen Sie die Abonnementdatenbank aus und klicken Sie auf Weiter , konfigurieren Sie die Anmeldeinformationen für den Merge-Agent und klicken Sie auf Weiter .

Wählen Sie den Agentenplan nach Ihren Bedürfnissen. In diesem Fall habe ich Nur bei Bedarf ausführen verwendet . Klicken Sie auf Weiter , wählen Sie Sofort initialisieren aus und wählen Sie Client als Abonnementtyp aus, und klicken Sie auf Weiter , aktivieren Sie Abonnement erstellen , klicken Sie auf Weiter und Fertig stellen .

Sobald der anfängliche Snapshot angewendet wurde, führen Sie die unten stehende Anweisung auf dem Publisher aus, um den Datensatz zu aktualisieren.

update TBL_EMP set Emp_Fname = 'Amanda' where empid = 1

Führen Sie nun in der Abonnenten-Datenbank die folgende Anweisung aus, um den Nachnamen zu aktualisieren.

update TBL_EMP set Emp_Lname = 'A' where empid = 1

Jetzt wurde dieselbe Zeile sowohl in der Herausgeberdatenbank als auch in der Abonnentendatenbank innerhalb desselben Replikationszyklus geändert.

Gemäß der von uns eingestellten Nachverfolgungsoption, d. h. Nachverfolgung auf Zeilenebene, wird die Änderung als Konflikt betrachtet und in den Konflikttabellen protokolliert, wenn der Merge-Agent ausgeführt wird.

Navigieren Sie zu der von Ihnen erstellten Veröffentlichung und erweitern Sie die Veröffentlichung, um Abonnements anzuzeigen. Klicken Sie mit der rechten Maustaste auf das Abonnement, wählen Sie Synchronisierungsstatus anzeigen und klicken Sie auf Start.

Wenn der Merge-Agent erfolgreich ausgeführt wurde, gehen Sie zum Abonnenten und überprüfen Sie die Daten anhand der folgenden Anweisung.

use sub_db
select * from TBL_EMP  where empid = 1 

Wir können sehen, dass die Änderung des Herausgebers gewonnen hat und die Änderung des Abonnenten verloren hat.

Die Konfliktinformationen werden in den Konflikttabellen gespeichert und können im Konfliktbetrachter angezeigt werden.

Navigieren Sie zum Herausgeber, klicken Sie mit der rechten Maustaste darauf und wählen Sie Konflikte anzeigen aus.

Wählen Sie die Konflikttabelle aus und klicken Sie auf OK, um Details anzuzeigen.

Ändern des Tracking-Levels

Lassen Sie uns nun die Verfolgungsebene auf die Verfolgung auf Spaltenebene ändern. Navigieren Sie zur Veröffentlichung, klicken Sie mit der rechten Maustaste darauf und wählen Sie Herausgebereigenschaften aus. Klicken Sie auf Artikel, wählen Sie die Tabelle aus, klicken Sie auf Artikeleigenschaften, legen Sie die Eigenschaften des markierten Tabellenartikels fest, wählen Sie Verfolgung auf Spaltenebene aus, klicken Sie auf OK, klicken Sie auf OK und dann auf Zur Neuinitialisierung markieren.

Dadurch werden alle Abonnenten für die Neuinitialisierung markiert, da wir die vorhandene Verfolgungsebene in eine neue ändern.

Navigieren Sie zur Veröffentlichung, klicken Sie mit der rechten Maustaste auf die Veröffentlichung und klicken Sie auf Snapshot-Agent-Status anzeigen , klicken Sie auf Starten um einen neuen Schnappschuss zu erstellen. Es gibt auch andere Möglichkeiten, einen Snapshot zu erstellen.

Führen Sie nun die folgende Anweisung für den Herausgeber aus, um einen Datensatz zu aktualisieren.

update TBL_EMP set Emp_Fname = 'Amanda' where empid = 2

Führen Sie nun die folgende Anweisung für die Abonnenten-Datenbank aus, um den Nachnamen zu aktualisieren.

update TBL_EMP set Emp_Lname = 'A' where empid = 2

Führen Sie den Merge-Agent manuell aus. Ich sehe immer noch den Konflikt im Datensatz, obwohl wir zwei verschiedene Spalten aktualisiert und die Verfolgungsebene auf die Spaltenebene gesetzt haben.

Wir können die Details im Konflikt-Viewer sehen. Das Ändern des vorhandenen Tracking-Levels hat nicht funktioniert. Also habe ich die Veröffentlichung neu konfiguriert und die Nachverfolgungsebene auf die Nachverfolgung auf Spaltenebene festgelegt, bevor ich den ersten Snapshot generiert habe. Es wurde ein Snapshot erstellt und der Veröffentlichung ein Abonnent hinzugefügt.

Sobald der anfängliche Snapshot auf den Abonnenten angewendet wurde, führen Sie die folgenden Anweisungen in der Publisher-Datenbank aus.

update TBL_EMP set Emp_Fname = 'Amanda' where empid = 3

Führen Sie die folgende Anweisung in der Abonnentendatenbank aus.

update TBL_EMP set Emp_Lname = 'A' where empid = 3

Führen Sie den Merge-Agent manuell aus. Fragen Sie nun in der Abonnentendatenbank die Tabelle TBL_EMP ab.

Die Aktualisierung vom Herausgeber und vom Abonnenten wird nicht als Konflikt qualifiziert, da sich beide in unterschiedlichen Spalten befinden und die Nachverfolgungsebene auf die Nachverfolgung auf Spaltenebene festgelegt ist. In den Konflikttabellen wird kein Konflikt protokolliert, die Aktualisierungen sowohl des Herausgebers als auch des Abonnenten in verschiedenen Spalten gehen nicht verloren.

Lassen Sie uns dieselbe Spalte für den Herausgeber und den Abonnenten aktualisieren.

Führen Sie die folgende Anweisung für die Publisher-Datenbank aus.

use pub_db
update TBL_EMP set Emp_Lname = 'B' where empid = 1

Führen Sie die folgende Anweisung für die Abonnentendatenbank aus.

use sub_db
update TBL_EMP set Emp_Lname = 'C' where empid = 1

Führen Sie den Merge-Agent aus, und fragen Sie die TBL_EMP-Tabelle auf dem Abonnenten ab. Das Update auf dem Abonnenten geht verloren und der Konflikt wird protokolliert.

Leistung:

Bei umfangreichen Aktualisierungen kann es bei der Nachverfolgung auf Spaltenebene im Vergleich zur Nachverfolgung auf Zeilenebene zu Leistungseinbußen kommen. Aber in meinem Fall habe ich bei großen Aktualisierungen keinen Unterschied in den Synchronisierungszeiten sowohl für die Verfolgung auf Zeilen- als auch auf Spaltenebene festgestellt, da die Tabelle möglicherweise eine einfache Struktur hat (d. H. Sehr wenige Spalten) und sowohl der Abonnent als auch die Publisher befinden sich auf derselben SQL Server-Instanz.

Hinweise:

  • Standardmäßig erfolgt die Nachverfolgung immer auf Zeilenebene, wenn die Mergereplikation konfiguriert ist.
  • Die Tracking-Level-Option hängt von einer Tabelle ab. Sie können also in einer Tabelle eine Zeilenebene und in einer anderen Tabelle eine Spaltenebene haben.
  • Diese Optionen helfen nur, wenn ein Konflikt aufgrund eines Updates erkannt wird, nicht aber, ihn zu lösen.
  • Konfigurieren Sie die Veröffentlichung neu, wenn das Ändern des vorhandenen Tracking-Levels nicht funktioniert.
  • Stellen Sie das Tracking-Level entsprechend Ihren geschäftlichen Anforderungen ein.