Dela via


Hur sammanslagningsreplikering spårar och räknar upp ändringar

När en publikation eller prenumeration har initierats, spårar och räknar sammanslagsreplikeringen upp alla ändringar i data i publicerade tabeller. Ändringar spåras via utlösare (som replikering skapar för varje publicerad tabell) och systemtabeller i publikations- och prenumerationsdatabaserna. Dessa replikeringssystemtabeller fylls med metadata som anger vilka ändringar som ska spridas. När sammanslagningsagenten körs under synkroniseringen räknas ändringarna upp av agenten och tillämpas sedan på utgivaren och prenumeranten efter behov.

Spårning av ändringar

Sammanslagningsreplikering använder följande utlösare och systemtabeller för att spåra ändringar för alla publicerade tabeller:

  • MSmerge_ins_<GUID>: insert trigger (GUID-värdet för den här utlösaren och de andra utlösarna härleds från sysmergearticles)
  • MSmerge_upd_<GUID>: uppdateringsutlösare
  • MSmerge_del_<GUID>: ta bort utlösare
  • MSmerge_contents
  • MSmerge_tombstone
  • MSmerge_genhistory

Sammanslagningsreplikering använder följande extra systemtabeller för att spåra ändringar för filtrerade tabeller:

  • MSmerge_partition_groups
  • MSmerge_current_partition_mappings
  • MSmerge_past_partition_mappings

Anmärkning

De systemtabeller som anges används av alla sammanslagningspublikationer och prenumerationer i en databas. Om du till exempel har fler än en publikation i en publikationsdatabas, MSmerge_contents innehåller rader från artiklar i alla publikationer.

Ändringsspårning för ofiltrerade tabeller

Systemtabeller

Systemtabellerna som används för ofiltrerade och filtrerade tabeller innehåller följande metadata:

  • MSmerge_contents innehåller en rad för varje rad som infogas eller uppdateras i en publicerad tabell i databasen.

  • MSmerge_tombstone innehåller en rad för varje rad som tas bort från en publicerad tabell i databasen.

  • MSmerge_genhistory innehåller en rad för varje generation. En generation är en samling ändringar som levereras till en utgivare eller prenumerant. Generationer stängs varje gång sammanslagningsagenten körs. efterföljande ändringar i en databas läggs till i en eller flera öppna generationer.

Ändringsspårningsprocess

Följande ändringsspårningsprocess används för alla ofiltrerade tabeller:

  • När en infogning eller uppdatering sker i en publicerad tabell, utlöses MSmerge_ins_<GUID> eller MSmerge_upd_<GUID> och en rad infogas i systemtabellen MSmerge_contents. Kolumnen rowguidMSmerge_contents innehåller GUID för den infogade eller uppdaterade raden, vilket indikerar att nästa gång synkroniseringen sker ska motsvarande infogade eller uppdaterade rad i användartabellen skickas till utgivaren eller prenumeranterna. Om efterföljande uppdateringar inträffar på en rad i en användartabell uppdateras raden i MSmerge_contents för att återspegla det här tillståndet.

  • När en borttagning sker i en publicerad tabell utlöses utlösaren MSmerge_del_<GUID> och en rad infogas i systemtabellen MSmerge_tombstone . Kolumnen rowguidMSmerge_tombstone innehåller GUID för den borttagna raden, vilket anger att nästa gång synkroniseringen sker ska en borttagning skickas till utgivaren eller prenumeranterna för motsvarande borttagna rad i användartabellen. Om den borttagna raden refereras till i MSmerge_contents (eftersom den har infogats eller uppdaterats sedan den senaste synkroniseringen) tas raden bort från MSmerge_contents.

Ändringsspårning för filtrerade tabeller

Systemtabeller

Förutom de systemtabeller som beskrivs i föregående avsnitt innehåller tre tabeller i publikationsdatabasen metadata för att spåra ändringar i filtrerade tabeller:

  • MSmerge_partition_groups innehåller en rad för varje partition som definieras i en publikation. Partitioner kan vara:

    • Definieras explicit med hjälp av sp_addmergepartition eller sidan Datapartitioner i dialogrutan Publikationsegenskaper .

    • Skapas automatiskt när en prenumerant synkroniseras om prenumeranten kräver en partition som ännu inte har en post i MSmerge_partition_groups.

  • MSmerge_current_partition_mappings innehåller en rad för varje unik kombination av rader i MSmerge_contents och MSmerge_partition_groups. Om till exempel en rad i en användartabell tillhör två partitioner och raden uppdateras infogas en rad i MSmerge_contents för att återspegla uppdateringen och två rader infogas i MSmerge_current_partition_mappingsför att indikera att den uppdaterade raden tillhör de två partitionerna.

  • MSmerge_past_partition_mappings innehåller en rad för varje rad som inte längre hör hemma i en viss partition. En rad flyttas från en partition om:

    • Raden tas bort. Om en rad tas bort från en användartabell infogas en rad i MSmerge_tombstone och en eller flera rader infogas i MSmerge_past_partition_mappings.

    • Värdet i en kolumn som används för filtrering har ändrats. Om till exempel ett parameteriserat filter baseras på tillståndet där ett företag har sitt huvudkontor och företaget flyttas, kan raden för företaget (och relaterade rader i andra tabeller) flytta ut från en säljares partition av data till partitionen för en annan säljare. Om en rad uppdateras så att den inte längre hör hemma i en partition infogas eller uppdateras en rad i MSmerge_contents och en eller flera rader infogas i MSmerge_past_partition_mappings.

Anmärkning

Om icke-överlappande partitioner med en prenumeration per partition (värdet 3 för för parametern @partition_optionssp_addmergearticle) används, används systemtabellerna MSmerge_current_partition_mappings och MSmerge_past_partition_mappings används inte för att spåra radernas partitionsmappningar, eftersom varje rad bara tillhör en partition och bara kan ändras med en prenumerant.

Ändringsspårningsprocess

Processen som beskrevs tidigare (i avsnittet Ändringsspårning för ofiltrerade tabeller) för ofiltrerade tabeller används också för filtrerade tabeller, med följande tillägg:

  • När en infogning sker i en publicerad tabell läggs en partitionsmappning, förutom att data uppdateras eller infogas i MSmerge_contents, till MSmerge_current_partition_mappings för varje partition som raden tillhör.

  • När en uppdatering sker i en publicerad tabell, förutom att data uppdateras eller infogas i MSmerge_contents, läggs en partitionsmappning till i MSmerge_current_partition_mappings om det inte finns någon partitionsmappning för varje partition som raden tillhör. Om uppdateringen resulterade i att en rad flyttades från en partition till en annan, uppdateras en rad i MSmerge_current_partition_mappings och en läggs till i MSmerge_past_partition_mappings.

  • När en borttagning sker i en publicerad tabell, förutom att en rad infogas i MSmerge_tombstone, tas en rad bort från MSmerge_current_partition_mappings och en läggs till MSmerge_past_partition_mappingsi .

Ändra uppräkning

Systemtabeller och procedurer

När sammanslagningsagenten körs räknas ändringarna upp med hjälp av flera systemtabeller och lagrade procedurer:

  • MSmerge_genhistory innehåller en rad för varje generation. En generation är en samling ändringar som levereras till en utgivare eller prenumerant. Generationer stängs varje gång sammanslagningsagenten körs. efterföljande ändringar i en databas läggs till i en eller flera öppna generationer.

  • sysmergesubscriptions innehåller information om prenumerationer, inklusive en registrering av de senaste generationerna av ändringar som en nod har skickat och tagit emot. I publikationsdatabasen innehåller den här tabellen en rad för Publisher och en rad för varje Prenumerant. I en prenumerationsdatabas innehåller den här tabellen vanligtvis en rad för Prenumeranten och en rad för Utgivaren.

  • MSmerge_generation_partition_mappings används endast för filtrerade tabeller och registrerar om en viss generation innehåller ändringar som är relevanta för en viss partition. Den här tabellen i publikationsdatabasen innehåller en rad för varje unik kombination av rader i MSmerge_genhistory och MSmerge_partition_groups.

  • sp_MSmakegeneration stänger alla öppna generationer i början av uppräkningsprocessen.

  • sp_MSenumchanges räknar upp ändringar för tabeller (flera relaterade procedurer som har namn som börjar med sp_MSenumchanges används också i den här processen).

  • sp_MSgetmetadata avgör om en ändring från en nod ska tillämpas på en annan nod som en infogning, uppdatering eller borttagning.

Ändra uppräkningsprocess

Följande process inträffar under ändringsuppräkning:

  1. Systemproceduren sp_MSmakegeneration kallas:

    • För ofiltrerade och filtrerade tabeller stänger den här proceduren alla öppna generationer som refereras i MSmerge_genhistory (stängda generationer har värdet 1 eller 2 i kolumnen genstatus).

    • För filtrerade tabeller fyller den här proceduren i systemtabellen MSmerge_generation_partition_mappings. Om en generation innehåller en eller flera ändringar som är relevanta för en partition infogas en rad i systemtabellen. Om en generation inte innehåller några ändringar som är relevanta för en viss partition infogas inte en rad i MSmerge_generation_partition_mappingsoch ändringarna räknas inte upp för prenumeranter som tar emot partitionen.

  2. Den lagrade proceduren sp_MSenumchanges och relaterade procedurer anropas. De här procedurerna räknar upp de ändringar som har inträffat sedan synkroniseringen senast inträffade:

    1. Procedurerna bestämmer först den generation där uppräkningen startar, baserat på kolumnerna sentgen (senaste generationen skickades) och recgen (senaste generationen togs emot) i tabellen sysmergesubscriptions.

      När du till exempel fastställer vilka generationers ändringar som måste räknas upp för en viss Prenumerant jämförs sentgen för prenumeranten (lagras i publikationsdatabasen) och recgen för Prenumeranten (lagras i prenumerationsdatabasen). Om värdena är desamma (vilket anger att den senaste generationen som skickades från utgivaren togs emot av prenumeranten) räknas ändringarna upp från och med nästa generation i MSmerge_genhistory. Om värdena inte är desamma används det lägre av de två värdena för att säkerställa att alla nödvändiga ändringar skickas.

    2. Procedurerna räknar sedan upp ändringar:

      För ofiltrerade tabeller är alla ändringar som finns i generationer efter genereringen i sentgen eller recgen uppräknade: MSmerge_genhistory anslutna till MSmerge_contents och MSmerge_tombstone för att avgöra vilka ändringar som måste skickas.

      För filtrerade tabeller har MSmerge_generation_partition_mappings anslutits till: MSmerge_current_partition_mappings och MSmerge_contents; och MSmerge_past_partition_mappings och MSmerge_tombstone för att avgöra vilka ändringar som är relevanta för den partition som prenumeranten tar emot.

  3. Den lagrade proceduren sp_MSgetmetadata anropas för att avgöra om en ändring ska tillämpas som en infogning, uppdatering eller borttagning. Nu utförs konfliktidentifiering och lösning. Mer information finns i Så här identifierar och löser sammanslagningsreplikering konflikter.