W tym artykule przyjrzyjmy się opcjom śledzenia na poziomie wiersza i kolumny w replikacji scalającej oraz w jaki sposób są one używane do wykrywania konfliktów podczas replikacji scalającej.
Replikacja scalająca: Replikacja scalająca służy do replikacji danych w obie strony, tj. od wydawcy do subskrybenta i od subskrybenta do wydawcy.
Początkowa migawka obiektów jest pobierana i stosowana do subskrybentów. Przyrostowe zmiany danych i zmiany schematu są śledzone za pomocą wyzwalaczy i stosowane do subskrybentów, gdy subskrybent synchronizuje się z wydawcą.
Konflikty:
W replikacji scalającej zarówno subskrybent, jak i wydawca są niezależni, a dane można modyfikować w dowolnym węźle.
Gdy dane są modyfikowane zarówno po stronie wydawcy, jak i subskrybenta w cyklu replikacji, a subskrybent synchronizuje się z wydawcą, występuje konflikt. Agent łączenia określa zwycięzcę po obu stronach w zależności od tego, kto rozwiązuje konflikt. Domyślnie zwycięzca jest określany na podstawie różnych parametrów, takich jak subskrypcja klienta lub serwera, subskrypcja typu pull lub push itp.
Wykrywanie konfliktów:
Wykrywanie konfliktu zależy od typu śledzenia, jaki konfigurujemy dla artykułu.
- Śledzenie na poziomie wiersza: Jeśli zmiany danych zostaną wprowadzone w dowolnej kolumnie w tym samym wierszu na obu końcach, zostanie to uznane za konflikt.
- Śledzenie na poziomie kolumny: Jeśli zmiany danych zostaną wprowadzone w tej samej kolumnie na obu końcach, zmiana ta zostanie zakwalifikowana jako konflikt.
Resolwery:
Rozwiązujący stosują dane zwycięzcy na obu końcach, gdy wystąpi konflikt.
Domyślnie w przypadku konfliktu między wydawcą a subskrybentem wydawca zawsze wygrywa.
Jeśli wystąpi konflikt między dwoma subskrybentami, zwycięzca jest określany przez subskrybenta klienta/serwera oraz subskrypcje typu pull/push.
Oprócz domyślnego przelicznika istnieje również kilka niestandardowych przeliczników. W nadchodzących artykułach omówimy niestandardowe przeliczniki.
Skonfiguruj replikację scalającą ze śledzeniem na poziomie wiersza:
Baza wydawców:pub_db
Baza danych subskrybentów:sub_db
Stwórzmy tabelę „TBL_EMP” i dodajmy ją do scalania replikacji.
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')
Aby skonfigurować replikację scalającą, wydawca powinien być skonfigurowany do korzystania z dystrybucji lokalnej lub dystrybucji zdalnej.
Po skonfigurowaniu dystrybucji przejdź do folderu replikacji w SSMS i kliknij prawym przyciskiem myszy publikacje lokalne.
Kliknij Dalej i wybierz bazę danych publikacji, kliknij Dalej i wybierz replikację scalania, wybierz 2008 lub nowszy i dodaj tabelę do replikacji.
Teraz kliknij właściwości artykułu i wybierz właściwości podświetlonego artykułu.
Wybierz poziom śledzenia, który ma być śledzeniem na poziomie wiersza.
Domyślnie będzie to śledzenie na poziomie wiersza. Kliknij OK, Dalej, Dalej . Dodaj filtr, jeśli chcesz wysłać określone dane do subskrybenta, w przeciwnym razie zignoruj, włącz Utwórz migawka natychmiast , skonfiguruj zabezpieczenia agenta zgodnie ze swoimi potrzebami, włącz Utwórz publikację , podaj nazwę publikacji i kliknij Zakończ .
Po wygenerowaniu początkowej migawki dodaj subskrybenta.
Przejdź do publikacji utworzonej w folderze replikacji wydawcy, kliknij prawym przyciskiem myszy i wybierz Nowa subskrypcja.
Kliknij Dalej , wybierz publikację, kliknij przycisk Dalej i wybierz subskrypcję typu pull lub push zgodnie z potrzebami. W tym przypadku skorzystałem z subskrypcji push.
Wybierz bazę danych subskrypcji i kliknij Dalej , skonfiguruj dane logowania dla agenta scalania i kliknij Dalej .
Wybierz harmonogram agenta zgodnie ze swoimi potrzebami. W tym przypadku użyłem Uruchom tylko na żądanie . Kliknij Dalej , wybierz Zainicjuj natychmiast i wybierz klienta jako typ subskrypcji, kliknij Dalej , włącz Utwórz subskrypcję , kliknij Dalej i Zakończ .
Po zastosowaniu początkowego zrzutu, uruchom poniższą instrukcję u wydawcy, aby zaktualizować rekord.
update TBL_EMP set Emp_Fname = 'Amanda' where empid = 1
Teraz w bazie danych subskrybenta uruchom poniższe oświadczenie, aby zaktualizować nazwisko.
update TBL_EMP set Emp_Lname = 'A' where empid = 1
Teraz ten sam wiersz został zmodyfikowany zarówno w bazie danych wydawcy, jak i bazy danych subskrybentów w tym samym cyklu replikacji.
Zgodnie z wybraną przez nas opcją śledzenia, np. śledzenie na poziomie wiersza, zmiana jest uważana za konflikt i zostanie zarejestrowana w tabelach konfliktów po uruchomieniu agenta scalania.
Przejdź do utworzonej publikacji i rozwiń publikację, aby wyświetlić subskrypcje. Kliknij subskrypcję prawym przyciskiem myszy, wybierz Wyświetl stan synchronizacji i kliknij Start.
Po pomyślnym uruchomieniu agenta łączenia przejdź do subskrybenta i sprawdź dane, korzystając z poniższego oświadczenia.
use sub_db select * from TBL_EMP where empid = 1
Widzimy, że zmiana od wydawcy wygrała, a zmiana od subskrybenta przegrała.
Informacje o konfliktach są przechowywane w tabelach konfliktów i można je przeglądać w przeglądarce konfliktów.
Przejdź do wydawcy, kliknij go prawym przyciskiem myszy i wybierz Wyświetl konflikty.
Wybierz tabelę konfliktów i kliknij OK, aby wyświetlić szczegóły.
Zmiana poziomu śledzenia
Teraz zmieńmy poziom śledzenia na śledzenie na poziomie kolumny. Przejdź do publikacji, kliknij ją prawym przyciskiem myszy i wybierz Właściwości wydawcy. Kliknij Artykuły, wybierz tabelę, kliknij Właściwości artykułu, ustaw właściwości podświetlonego artykułu w tabeli, wybierz Śledzenie na poziomie kolumn, kliknij OK, kliknij OK, a następnie kliknij Oznacz do ponownej inicjalizacji.
Spowoduje to oznaczenie wszystkich subskrybentów do ponownej inicjalizacji, ponieważ zmieniamy istniejący poziom śledzenia na nowy.
Przejdź do publikacji, kliknij ją prawym przyciskiem myszy i kliknij Wyświetl stan agenta migawki , kliknij Rozpocznij aby wygenerować nową migawkę. Istnieją również inne sposoby generowania zrzutów.
Teraz uruchom poniższe oświadczenie przeciwko wydawcy, aby zaktualizować rekord.
update TBL_EMP set Emp_Fname = 'Amanda' where empid = 2
Teraz uruchom poniższe oświadczenie względem bazy danych subskrybenta, aby zaktualizować nazwisko.
update TBL_EMP set Emp_Lname = 'A' where empid = 2
Uruchom agenta scalania ręcznie. Nadal widzę konflikt w rekordzie, mimo że zaktualizowaliśmy dwie różne kolumny i ustawiliśmy poziom śledzenia na poziomie kolumny.
Szczegóły widzimy w przeglądarce konfliktów. Zmiana istniejącego poziomu śledzenia nie zadziałała. Tak więc ponownie skonfigurowałem publikację, ustaw poziom śledzenia na śledzenie na poziomie kolumny przed wygenerowaniem początkowej migawki. Utworzono migawkę i dodano subskrybenta do publikacji.
Po zastosowaniu początkowego zrzutu do subskrybenta uruchom następujące instrukcje w bazie danych wydawcy.
update TBL_EMP set Emp_Fname = 'Amanda' where empid = 3
Uruchom następujące oświadczenie w bazie danych subskrybentów.
update TBL_EMP set Emp_Lname = 'A' where empid = 3
Uruchom agenta scalania ręcznie. Teraz w bazie danych abonentów zapytaj tabelę TBL_EMP.
Aktualizacja od wydawcy i subskrybenta nie jest kwalifikowana jako konflikt, ponieważ obaj znajdują się w różnych kolumnach, a poziom śledzenia jest ustawiony na śledzenie na poziomie kolumny. Żaden konflikt nie jest rejestrowany w tabelach konfliktów, aktualizacje zarówno wydawcy, jak i subskrybenta w różnych kolumnach nie są tracone.
Zaktualizujmy tę samą kolumnę wydawcy i subskrybenta.
Wykonaj następującą instrukcję w bazie danych wydawcy.
use pub_db update TBL_EMP set Emp_Lname = 'B' where empid = 1
Wykonaj następujące oświadczenie w bazie danych subskrybentów.
use sub_db update TBL_EMP set Emp_Lname = 'C' where empid = 1
Uruchom agenta scalania i przeprowadź zapytanie subskrybenta w tabeli TBL_EMP. Aktualizacja subskrybenta zostaje utracona, a konflikt zostaje zarejestrowany.
Wydajność:
W przypadku dużych aktualizacji może wystąpić obciążenie wydajności ze śledzeniem na poziomie kolumny w porównaniu ze śledzeniem na poziomie wiersza. Ale w moim przypadku nie zauważyłem żadnej różnicy w czasie synchronizacji zarówno śledzenia na poziomie wierszy, jak i na poziomie kolumn w przypadku dużych aktualizacji, ponieważ tabela może mieć prostą strukturę (tj. bardzo mało kolumn) i zarówno subskrybenta, jak i wydawcy znajdują się na tej samej instancji serwera SQL.
Uwagi:
- Domyślnie, gdy skonfigurowana jest replikacja scalająca, zawsze jest to śledzenie na poziomie wiersza.
- Opcja poziomu śledzenia zależy od tabeli. Możesz więc mieć poziom wiersza w jednej tabeli i poziom kolumny w innej tabeli.
- Te opcje pomagają tylko w przypadku wykrycia konfliktu na podstawie aktualizacji, a nie rozwiązania go.
- Ponownie skonfiguruj publikację, jeśli zmiana istniejącego poziomu śledzenia nie działa.
- Ustaw poziom śledzenia zgodnie z potrzebami swojej firmy.