Database
 sql >> Baza danych >  >> RDS >> Database

Śledzenie na poziomie kolumn i wierszy w replikacji scalającej

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.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wzorce projektowe interfejsu użytkownika, które nie skalują się

  2. Migracja baz danych do Azure SQL Database

  3. Projektowanie modelu danych dla systemu rezerwacji pokoi hotelowych

  4. Zatrzymywanie błędów serwera połączonego

  5. Znajdowanie korzyści związanych z wydajnością dzięki partycjonowaniu