Udostępnij przez


Jak w replikacji scalającej śledzone i wyliczane są zmiany

Po zainicjowaniu publikacji lub subskrypcji scal replikacja śledzi i wylicza wszystkie zmiany danych w opublikowanych tabelach. Zmiany są śledzone za pomocą wyzwalaczy (które replikacja tworzy dla każdej opublikowanej tabeli) i tabel systemowych w bazach danych publikacji i subskrypcji. Te tabele systemu replikacji są wypełniane metadanymi, które wskazują, które zmiany należy propagować. Gdy agent scalania jest uruchamiany podczas synchronizacji, zmiany są wyliczane przez agenta, a następnie stosowane do wydawcy i subskrybenta w razie potrzeby.

Śledzenie zmian

Do śledzenia zmian we wszystkich opublikowanych tabelach, replikacja scalania używa następujących wyzwalaczy i tabel systemowych.

  • MSmerge_ins_<GUID>: wstaw wyzwalacz (wartość GUID dla tego wyzwalacza i innych wyzwalaczy pochodzi z elementu sysmergearticles)
  • MSmerge_upd_<GUID>: wyzwalacz aktualizacji
  • MSmerge_del_<GUID>: wyzwalacz usuwania
  • MSmerge_contents
  • MSmerge_tombstone
  • MSmerge_genhistory

Replikacja scalania używa następujących dodatkowych tabel systemowych do śledzenia zmian w filtrowanych tabelach:

  • MSmerge_partition_groups
  • MSmerge_current_partition_mappings
  • MSmerge_past_partition_mappings

Uwaga / Notatka

Wymienione tabele systemowe są używane przez wszystkie publikacje scalane i subskrypcje w bazie danych; na przykład jeśli masz więcej niż jedną publikację w bazie danych publikacji, MSmerge_contents zawiera wiersze z artykułów we wszystkich publikacjach.

Śledzenie zmian dla niefiltrowanych tabel

Tabele systemowe

Tabele systemowe używane dla tabel niefiltrowanych i filtrowanych zawierają następujące metadane:

  • MSmerge_contents zawiera jeden wiersz dla każdego wiersza wstawionego lub zaktualizowanego w opublikowanej tabeli w bazie danych.

  • MSmerge_tombstone zawiera jeden wiersz dla każdego wiersza usuniętego z opublikowanej tabeli w bazie danych.

  • MSmerge_genhistory zawiera jeden wiersz dla każdej generacji. Generacja to kolekcja zmian dostarczanych do wydawcy lub subskrybenta. Generacje są zamykane przy każdym uruchomieniu agenta scalania; kolejne zmiany w bazie danych są dodawane do co najmniej jednej otwartej generacji.

Proces śledzenia zmian

Następujący proces śledzenia zmian jest używany dla wszystkich niefiltrowanych tabel:

  • Gdy następuje wstawienie lub aktualizacja w opublikowanej tabeli, wyzwalacz MSmerge_ins_<GUID> lub MSmerge_upd_<GUID> jest aktywowany, a wiersz jest wstawiany do tabeli systemowej MSmerge_contents. Kolumna rowguid tabeli MSmerge_contents zawiera identyfikator GUID wstawionego lub zaktualizowanego wiersza, co oznacza, że przy następnej synchronizacji odpowiedni wiersz w tabeli użytkownika powinien zostać wysłany do Wydawcy lub subskrybentów. Jeśli kolejne aktualizacje wystąpią w wierszu w tabeli użytkownika, wiersz w MSmerge_contents tabeli zostanie zaktualizowany, aby odzwierciedlić ten stan.

  • Kiedy nastąpi usunięcie w opublikowanej tabeli, wyzwalany jest wyzwalacz MSmerge_del_<GUID>, a wiersz jest wstawiany do tabeli systemowej MSmerge_tombstone. Kolumna rowguid z MSmerge_tombstone zawiera identyfikator GUID dla usuniętego wiersza, co oznacza, że przy następnej synchronizacji polecenie usunięcia powinno zostać wysłane do Wydawcy lub Subskrybentów dla odpowiedniego usuniętego wiersza w tabeli użytkownika. Jeśli usunięty wiersz jest przywoływany w MSmerge_contents (ponieważ został wstawiony lub zaktualizowany od ostatniej synchronizacji), wiersz zostanie usunięty z MSmerge_contents.

Śledzenie zmian dla filtrowanych tabel

Tabele systemowe

Oprócz tabel systemowych opisanych w poprzedniej sekcji trzy tabele w bazie danych publikacji zawierają metadane do śledzenia zmian w filtrowanych tabelach:

  • MSmerge_partition_groups zawiera jeden wiersz dla każdej partycji zdefiniowanej w publikacji. Partycje mogą być następujące:

    • Jawnie zdefiniowano za pomocą sp_addmergepartition, lub na stronie Partycje danych w oknie dialogowym Właściwości publikacji.

    • Utworzono automatycznie, gdy subskrybent synchronizuje się, jeśli subskrybent wymaga partycji, która nie ma jeszcze wpisu w pliku MSmerge_partition_groups.

  • MSmerge_current_partition_mappings zawiera jeden wiersz dla każdej unikatowej kombinacji wierszy w elementach MSmerge_contents i MSmerge_partition_groups. Jeśli na przykład wiersz w tabeli użytkownika należy do dwóch partycji, a wiersz zostanie zaktualizowany, jeden wiersz zostanie wstawiony w MSmerge_contents celu odzwierciedlenia aktualizacji, a dwa wiersze zostaną wstawione do MSmerge_current_partition_mappingselementu , aby wskazać, że zaktualizowany wiersz należy do dwóch partycji.

  • MSmerge_past_partition_mappings zawiera jeden wiersz dla każdego wiersza, który nie należy już do danej partycji. Wiersz zostanie przeniesiony z partycji, jeśli:

    • Wiersz został usunięty. Jeśli wiersz zostanie usunięty z tabeli użytkownika, wiersz zostanie wstawiony do MSmerge_tombstone elementu , a jeden lub więcej wierszy zostanie wstawionych do MSmerge_past_partition_mappingselementu .

    • Wartość w kolumnie używanej do filtrowania uległa zmianie. Jeśli na przykład filtr sparametryzowany jest oparty na stanie, w którym firma ma swoją siedzibę główną, a firma przenosi się, wiersz dla firmy (i powiązane wiersze w innych tabelach) może zostać przeniesiony z partycji danych jednej osoby sprzedażowej do partycji innej osoby sprzedażowej. Jeśli wiersz zostanie zaktualizowany w taki sposób, że nie należy już do partycji, zostanie wstawiony lub zaktualizowany w MSmerge_contents, a jeden lub więcej wierszy zostanie wstawionych do MSmerge_past_partition_mappings.

Uwaga / Notatka

Jeśli używane są partycje nienakładające się z jedną subskrypcją na partycję (wartość 3 dla parametru @partition_optionssp_addmergearticle), tabele systemowe MSmerge_current_partition_mappings i MSmerge_past_partition_mappings nie są używane do śledzenia mapowań partycji wierszy, ponieważ każdy wiersz należy tylko do jednej partycji i może być zmieniony tylko w jednym subskrybencie.

Proces śledzenia zmian

Opisany wcześniej proces (w sekcji Śledzenie zmian dla niefiltrowanych tabel) dla niefiltrowanych tabel jest również używany do filtrowania tabel z następującymi dodatkami:

  • W przypadku wstawienia do opublikowanej tabeli, oprócz aktualizowania lub wstawiania danych do MSmerge_contents, do MSmerge_current_partition_mappings jest dodawane mapowanie partycji dla każdej partycji, do której należy wiersz.

  • W przypadku aktualizacji w opublikowanej tabeli, oprócz aktualizacji lub wstawiania danych do MSmerge_contents, jeśli nie istnieje mapowanie partycji w MSmerge_current_partition_mappings dla każdej partycji, do której należy wiersz, mapowanie takie zostanie dodane. Jeśli aktualizacja spowodowała przeniesienie wiersza z jednej partycji do innej, wiersz zostanie zaktualizowany MSmerge_current_partition_mappings i zostanie dodany do elementu MSmerge_past_partition_mappings.

  • Gdy usunięcie występuje w opublikowanej tabeli, oprócz wiersza wstawionego do MSmerge_tombstone, wiersz jest usuwany z MSmerge_current_partition_mappings, a wiersz jest dodawany do MSmerge_past_partition_mappings.

Zmiana wyliczenia

Tabele i procedury systemowe

Po uruchomieniu agenta scalania zmiany są wyliczane przy użyciu kilku tabel systemowych i procedur składowanych:

  • MSmerge_genhistory zawiera jeden wiersz dla każdej generacji. Generacja to kolekcja zmian dostarczanych do wydawcy lub subskrybenta. Generacje są zamykane przy każdym uruchomieniu agenta scalania; kolejne zmiany w bazie danych są dodawane do co najmniej jednej otwartej generacji.

  • sysmergesubscriptions Zawiera informacje o subskrypcjach, w tym rekord ostatnich generacji zmian, które węzeł wysłał i odebrał. W bazie danych publikacji ta tabela zawiera wiersz wydawcy i jeden wiersz dla każdego subskrybenta. W bazie danych subskrypcji ta tabela zazwyczaj zawiera wiersz dla subskrybenta i wiersz wydawcy.

  • MSmerge_generation_partition_mappings jest używany tylko w przypadku filtrowanych tabel, rejestrując, czy dana generacja zawiera jakiekolwiek zmiany istotne dla danej partycji. Ta tabela w bazie danych publikacji zawiera jeden wiersz dla każdej unikatowej kombinacji wierszy w MSmerge_genhistory i MSmerge_partition_groups.

  • sp_MSmakegeneration Zamyka wszystkie otwarte generacje na początku procesu wyliczania.

  • sp_MSenumchanges Wylicza zmiany dla tabel (kilka powiązanych procedur, które mają nazwy rozpoczynające się od sp_MSenumchanges, są również używane w tym procesie).

  • sp_MSgetmetadata Określa, czy zmiana z jednego węzła powinna być stosowana w innym węźle jako wstawianie, aktualizowanie lub usuwanie.

Zmienianie procesu wyliczania

Podczas wyliczania zmian następuje następujący proces:

  1. Systemowa procedura sp_MSmakegeneration jest wywoływana:

    • W przypadku tabel niefiltrowanych i filtrowanych ta procedura zamyka wszystkie otwarte generacje, do których się odwołuje MSmerge_genhistory (zamknięte generacje mają wartość 1 lub 2 w kolumnie genstatus).

    • W przypadku filtrowanych tabel ta procedura wypełnia tabelę MSmerge_generation_partition_mappingssystemowa . Jeśli generacja zawiera co najmniej jedną zmianę odpowiednią dla partycji, wiersz zostanie wstawiony do tabeli systemowej. Jeśli generacja nie zawiera żadnych zmian istotnych dla danej partycji, wiersz nie zostanie wstawiony do MSmerge_generation_partition_mappingselementu , a zmiany nie będą wyliczane dla żadnych subskrybentów, którzy otrzymają daną partycję.

  2. Wywoływana jest składowana procedura sp_MSenumchanges i powiązane procedury. Te procedury wyliczają zmiany, które wystąpiły od czasu ostatniej synchronizacji:

    1. Procedury najpierw określają generację, w której rozpoczyna się wyliczenie, na podstawie kolumn sentgen (wysłana ostatnia generacja) i recgen (odebrana ostatnia generacja) w tabeli sysmergesubscriptions.

      Na przykład podczas określania, które zmiany pokoleń muszą być wyliczane dla danego subskrybenta, sentgen dla subskrybenta (przechowywanego w bazie danych publikacji) i recgen dla subskrybenta (przechowywanego w bazie danych subskrypcji) są porównywane. Jeśli wartości są takie same (co oznacza, że ostatnia generacja wysłana z wydawcy została pomyślnie odebrana przez subskrybenta), zmiany są wyliczane począwszy od następnej generacji w elemencie MSmerge_genhistory. Jeśli wartości nie są takie same, dolna z tych dwóch wartości jest używana do zapewnienia wysyłania wszystkich wymaganych zmian.

    2. Następnie procedury wyliczają zmiany:

      W przypadku niefiltrowanych tabel wszystkie zmiany zawarte w generacjach po wygenerowaniu w sentgen lub recgen są wyliczane: MSmerge_genhistory jest przyłączone do MSmerge_contents i MSmerge_tombstone w celu określenia, które zmiany muszą zostać wysłane.

      Dla filtrowanych tabel, MSmerge_generation_partition_mappings jest połączony z: MSmerge_current_partition_mappings i MSmerge_contents oraz MSmerge_past_partition_mappings i MSmerge_tombstone w celu określenia, które zmiany są istotne dla partycji odbieranej przez subskrybenta.

  3. Procedura przechowywana sp_MSgetmetadata jest wywoływana w celu określenia, czy zmiana powinna zostać zastosowana jako wstawianie, aktualizacja lub usunięcie. W tym momencie wykonywane są wykrywanie konfliktów i ich rozwiązywanie; Aby uzyskać więcej informacji, zobacz Jak replikacja scalająca wykrywa i rozwiązuje konflikty.