Jak slučovací replikace sleduje a vyčísluje změny

Po inicializaci publikace nebo odběru sloučená replikace sleduje a vyčíslí všechny změny dat v publikovaných tabulkách. Změny se sledují prostřednictvím triggerů (které replikace vytvoří pro každou publikovanou tabulku) a systémových tabulek v databázích publikace a předplatného. Tyto systémové tabulky replikace jsou naplněny metadaty, které označují, které změny se mají rozšířit. Při spuštění agenta sloučení během synchronizace se změny vyčíslí agentem a podle potřeby se použijí na vydavatele a odběratele.

Sledování změn

Replikace metodou slučování používá ke sledování změn pro všechny publikované tabulky následující triggery a systémové tabulky:

  • MSmerge_ins_<GUID>: insert trigger (hodnota GUID pro tento trigger a ostatní triggery je odvozena z sysmergearticles)
  • MSmerge_upd_<GUID>: aktualizační spouštěč
  • MSmerge_del_<GUID>: odstranit spoušť
  • MSmerge_contents
  • MSmerge_tombstone
  • MSmerge_genhistory

Sloučení replikace používá následující dodatečné systémové tabulky ke sledování změn ve filtrovaných tabulkách:

  • MSmerge_partition_groups
  • MSmerge_current_partition_mappings
  • MSmerge_past_partition_mappings

Poznámka:

Systémové tabulky uvedené jsou používány všemi sloučenými publikacemi a předplatnými v databázi; Pokud máte například v databázi publikace více než jednu publikaci, MSmerge_contents obsahuje řádky z článků ve všech publikacích.

Sledování změn pro nefiltrované tabulky

Systémové tabulky

Systémové tabulky používané pro nefiltrované a filtrované tabulky obsahují následující metadata:

  • MSmerge_contents obsahuje jeden řádek pro každý řádek vložený nebo aktualizovaný v publikované tabulce v databázi.

  • MSmerge_tombstone obsahuje jeden řádek pro každý řádek odstraněný z publikované tabulky v databázi.

  • MSmerge_genhistory obsahuje jeden řádek pro každou generaci. Generace je soubor změn, které se odesílají vydavateli nebo odběrateli. Generace jsou uzavřeny při každém spuštění agenta sloučení; následné změny v databázi se přidají do jedné nebo více otevřených generací.

Proces sledování změn

Následující proces sledování změn se používá pro všechny nefiltrované tabulky:

  • Když v publikované tabulce dojde k vložení nebo aktualizaci, MSmerge_ins_<GUID> nebo MSmerge_upd_<GUID> se aktivuje a řádek MSmerge_contents se vloží do systémové tabulky. Sloupec rowguidMSmerge_contents obsahuje identifikátor GUID pro vložený nebo aktualizovaný řádek, který označuje, že při příští synchronizaci se má ten samý vložený nebo aktualizovaný řádek v tabulce uživatele odeslat na vydavatele nebo odběratele. Pokud dojde k následným aktualizacím řádku v tabulce uživatele, řádek v MSmerge_contents se aktualizuje, aby odrážel tento stav.

  • Když v publikované tabulce dojde k odstranění, aktivuje se MSmerge_del_<GUID> trigger a do systémové tabulky se vloží řádek MSmerge_tombstone. Sloupec rowguidMSmerge_tombstone obsahuje identifikátor GUID odstraněného řádku, který označuje, že při příští synchronizaci by se mělo odeslat odstranění vydavateli nebo odběratelům odpovídajícího odstraněného řádku v tabulce uživatele. Pokud se na odstraněný řádek odkazuje MSmerge_contents (protože byl vložen nebo aktualizován od poslední synchronizace), řádek se odstraní z MSmerge_contents.

Sledování změn pro filtrované tabulky

Systémové tabulky

Kromě systémových tabulek popsaných v předchozí části obsahují tři tabulky v databázi publikace metadata pro sledování změn filtrovaných tabulek:

  • MSmerge_partition_groups obsahuje jeden řádek pro každý oddíl definovaný v publikaci. Oddíly můžou být:

    • Definováno explicitně pomocí sp_addmergepartition nebo na stránce Datové oddíly dialogového okna Vlastnosti publikace.

    • Vytvoří se automaticky, když odběratel synchronizuje, pokud odběratel vyžaduje oddíl, který ještě nemá položku v MSmerge_partition_groups.

  • MSmerge_current_partition_mappings obsahuje jeden řádek pro každou jedinečnou kombinaci řádků v MSmerge_contents a MSmerge_partition_groups. Pokud například řádek v tabulce uživatele patří do dvou oddílů a řádek se aktualizuje, jeden řádek se vloží tak MSmerge_contents , aby odrážel aktualizaci, a dva řádky se vloží do MSmerge_current_partition_mappings, což znamená, že aktualizovaný řádek patří do dvou oddílů.

  • MSmerge_past_partition_mappings obsahuje jeden řádek pro každý, který již nepatří do dané partice. Řádek se přesune mimo oddíl, pokud:

    • Řádek se odstraní. Pokud je řádek odstraněn z tabulky uživatele, řádek se vloží do MSmerge_tombstone a jeden nebo více řádků se vloží do MSmerge_past_partition_mappings.

    • Hodnota ve sloupci použitém pro filtrování se změnila. Pokud je například parametrizovaný filtr založený na státě, ve kterém má společnost sídlo, a společnost se přesune, mohou se řádky společnosti (a související řádky v jiných tabulkách) přesunout z oddílu dat jednoho obchodního zástupce do oddílu jiného obchodního zástupce. Pokud je řádek aktualizován tak, že již nepatří do oddílu, řádek je vložen nebo aktualizován v MSmerge_contents a jeden nebo více řádků je vloženo do MSmerge_past_partition_mappings.

Poznámka:

Pokud se použijí nepřekryvné oddíly s jedním předplatným na oddíl (hodnota 3 pro parametr @partition_optionssp_addmergearticle), systémové tabulky MSmerge_current_partition_mappings a MSmerge_past_partition_mappings se nepoužívají ke sledování mapování oddílů řádků, protože každý řádek patří pouze do jednoho oddílu a může být změněn pouze u jednoho Odběratele.

Proces sledování změn

Dříve popsaný postup (v části Change Tracking pro nefiltrované tabulky) pro nefiltrované tabulky se používá také pro filtrované tabulky s následujícími dodatky:

  • Když dojde k vložení dat v publikované tabulce, kromě aktualizace nebo vložení dat do MSmerge_contents se pro každý oddíl, do kterého řádek patří, přidá mapování oddílu do MSmerge_current_partition_mappings.

  • Když dojde k aktualizaci publikované tabulky, kromě aktualizace nebo vložení dat do MSmerge_contents, přidá se mapování oddílů do MSmerge_current_partition_mappings pro každý oddíl, do kterého řádek patří, pokud takové mapování neexistuje. Pokud aktualizace způsobila přesun řádku z jednoho oddílu do druhého, řádek se aktualizuje MSmerge_current_partition_mappings a druhý se přidá do MSmerge_past_partition_mappings.

  • Když se v publikované tabulce provede odstranění, kromě vložení řádku do MSmerge_tombstone je řádek odstraněn z MSmerge_current_partition_mappings a přidán do MSmerge_past_partition_mappings.

Změna výčtu

Systémové tabulky a procedury

Při spuštění agenta sloučení se změny vyčíslí pomocí několika systémových tabulek a uložených procedur:

  • MSmerge_genhistory obsahuje jeden řádek pro každou generaci. Generace je soubor změn, které se odesílají vydavateli nebo odběrateli. Generace jsou uzavřeny při každém spuštění agenta sloučení; následné změny v databázi se přidají do jedné nebo více otevřených generací.

  • sysmergesubscriptions obsahuje informace o předplatných, včetně záznamu o posledních generacích změn, které uzel odeslal a přijal. V databázi publikace obsahuje tato tabulka řádek pro vydavatele a jeden řádek pro každého odběratele. V databázi předplatného tato tabulka obvykle obsahuje řádek pro odběratele a řádek pro Publisher.

  • MSmerge_generation_partition_mappings slouží pouze pro filtrované tabulky a zaznamenává, zda daná generace obsahuje jakékoli změny relevantní pro daný oddíl. Tato tabulka v databázi publikace obsahuje jeden řádek pro každou jedinečnou kombinaci řádků v MSmerge_genhistory a MSmerge_partition_groups.

  • sp_MSmakegeneration zavře všechny otevřené generace na začátku procesu enumerace.

  • sp_MSenumchanges vyjmenovává změny pro tabulky (několik souvisejících postupů, které mají názvy začínající sp_MSenumchanges, je také používáno v tomto procesu).

  • sp_MSgetmetadata určuje, zda má být změna z jednoho uzlu použita na jiném uzlu jako vložení, aktualizace nebo odstranění.

Proces výčtu změn

Během výčtu změn dochází k následujícímu procesu:

  1. Systémová procedura sp_MSmakegeneration se nazývá:

    • U nefiltrovaných a filtrovaných tabulek tento postup zavře všechny otevřené generace, na MSmerge_genhistory které odkazuje (uzavřené generace mají hodnotu 1 nebo 2 ve sloupci genstatus).

    • U filtrovaných tabulek tento postup naplní systémovou tabulku MSmerge_generation_partition_mappings. Pokud generace obsahuje jednu nebo více změn relevantních pro oddíl, je do systémové tabulky vložen řádek. Pokud generování neobsahuje žádné změny relevantní pro daný oddíl, řádek se nevloží do MSmerge_generation_partition_mappingsa změny se nevyčtou pro žádné odběratele, kteří tento oddíl obdrží.

  2. Volá se uložená procedura sp_MSenumchanges a související procedury. Tyto postupy popisují změny, ke kterým došlo od poslední synchronizace:

    1. Postupy nejprve určují generování, při kterém se spustí výčet, na základě sloupců sentgen (poslední generace odesláno) a recgen (poslední generace přijato) v tabulce sysmergesubscriptions.

      Například při určování, které změny v generacích musí být vyjmenovány pro daného odběratele, se porovnává sentgen pro odběratele (uložené v databázi publikace) a recgen pro odběratele (uložené v databázi odběru). Pokud jsou hodnoty stejné (což značí, že poslední generace odeslaná z Publisheru byla úspěšně přijata odběratelem), změny se zobrazí od další generace v MSmerge_genhistory. Pokud hodnoty nejsou stejné, použije se nižší ze dvou hodnot k zajištění odesílání všech požadovaných změn.

    2. Postupy pak vytvoří výčet změn:

      U nefiltrovaných tabulek jsou všechny změny obsažené v generacích po generaci sentgen nebo recgen vyjmenovány: MSmerge_genhistory je připojeno k MSmerge_contents a MSmerge_tombstone k určení, které změny musí být odeslány.

      U filtrovaných tabulek je MSmerge_generation_partition_mappings připojen k: MSmerge_current_partition_mappings a MSmerge_contents, a zároveň k MSmerge_past_partition_mappings a MSmerge_tombstone pro určení, které změny jsou relevantní pro oddíl, který odběratel obdrží.

  3. Uložená procedura sp_MSgetmetadata je volána k určení, zda se má změna použít jako vložení, aktualizace nebo odstranění. V tomto okamžiku se provádí detekce konfliktů a řešení; Další informace naleznete v tématu Jak slučovací replikace detekuje a řeší konflikty.