sql >> Databasteknik >  >> RDS >> Database

Spårning på kolumnnivå och radnivå i sammanslagningsreplikering

Låt oss i den här artikeln granska spårningsalternativ på rad- och kolumnnivå i sammanslagningsreplikering och hur dessa används för att upptäcka konflikter under sammanslagningsreplikering.

Slå samman replikering: Sammanfogad replikering används för att replikera data på båda sätt, dvs. från utgivaren till prenumeranten och från prenumeranten till utgivaren.

Den första ögonblicksbilden av objekt tas och tillämpas på abonnenter. Inkrementella dataändringar och schemaändringar spåras med hjälp av utlösare och tillämpas på prenumeranter när prenumeranten synkroniserar med utgivaren.

Konflikter:

Vid sammanslagningsreplikering är både abonnenten och utgivaren oberoende, och data kan modifieras på vilken nod som helst.

När data modifieras på både utgivaren och abonnenten inom replikeringscykeln, och när abonnenten synkroniserar med utgivaren, uppstår en konflikt. Sammanslagningsagenten bestämmer vinnaren på båda sidor beroende på konfliktlösaren. Som standard bestäms vinnaren av olika parametrar som en klient- eller serverprenumeration, pull- eller push-prenumeration, etc.

Konfliktidentifiering:

Konfliktdetekteringen beror på vilken typ av spårning vi konfigurerar för artikeln.

  • Spårning på radnivå: Om dataändringar görs i någon kolumn på samma rad i båda ändarna anses det vara en konflikt.
  • Spårning på kolumnnivå: Om dataändringar görs i samma kolumn i båda ändar, kvalificeras denna ändring som en konflikt.

Resolvers:

Upplösare tillämpar vinnardata i båda ändarna när en konflikt uppstår.

Som standard, om det finns en konflikt mellan utgivaren och prenumeranten, vinner utgivaren alltid.

Om en konflikt uppstår mellan två prenumeranter, avgörs vinnaren av klient/server-abonnenten och pull/push-prenumerationer.

Förutom standardupplösaren finns det få anpassade upplösare också. Vi kommer att diskutera anpassade lösare i kommande artiklar.

Konfigurera sammanslagningsreplikering med spårning på radnivå:

Utgivardatabas:pub_db

Prenumerantdatabas:sub_db

Låt oss skapa tabellen "TBL_EMP" och lägga till den för att slå samman replikering.

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')

För att konfigurera sammanslagningsreplikeringen bör utgivaren konfigureras för att använda lokal distribution eller fjärrdistribution.

När distributionen är konfigurerad, navigera till replikeringsmappen i SSMS och högerklicka på lokala publikationer.

Klicka på Nästa och välj publikationsdatabasen, klicka på Nästa och välj sammanslagningsreplikeringen, välj 2008 eller senare och lägg till tabellen i replikeringen.

Klicka nu på artikelegenskaperna och välj egenskaperna för den markerade artikeln.

Välj spårningsnivån för spårning på radnivå.

Som standard kommer det att vara spårning på radnivå. Klicka på OK, Nästa, Nästa . Lägg till ett filter om du vill skicka specifik data till abonnenten, annars ignorera, aktivera Skapa ögonblicksbild omedelbart , konfigurera agentsäkerheten enligt dina behov, aktivera Skapa publicering , ange namnet på publikationen och klicka på Slutför .

När den första ögonblicksbilden har skapats lägger du till prenumeranten.

Navigera till publikationen du skapar i replikeringsmappen på utgivaren, högerklicka och välj Ny prenumeration.

Klicka på Nästa , välj publikationen, klicka på Nästa och välj pull- eller push-prenumerationen enligt dina behov. I det här fallet använde jag push-prenumeration.

Välj prenumerationsdatabasen och klicka på Nästa , konfigurera inloggningsuppgifterna för sammanslagningsagenten och klicka på Nästa .

Välj agentschema enligt dina behov. I det här fallet använde jag Kör endast på begäran . Klicka på Nästa , välj Initiera omedelbart och välj klient som prenumerationstyp, klicka på Nästa , aktivera Skapa prenumeration klickar du på Nästa och Slutför .

När den första ögonblicksbilden har tillämpats kör du uttalandet nedan på utgivaren för att uppdatera posten.

update TBL_EMP set Emp_Fname = 'Amanda' where empid = 1

Kör nu uttalandet nedan på prenumerantens databas för att uppdatera efternamnet.

update TBL_EMP set Emp_Lname = 'A' where empid = 1

Nu har samma rad ändrats både i utgivardatabasen och prenumerantdatabasen inom samma replikeringscykel.

Enligt spårningsalternativet vi ställer in, dvs spårning på radnivå, anses ändringen vara en konflikt och kommer att loggas i konflikttabellerna när sammanslagningsagenten körs.

Navigera till publikationen du skapade och expandera publikationen för att se prenumerationer. Högerklicka på prenumerationen, välj Visa synkroniseringsstatus och klicka på Start.

När sammanslagningsagenten har körts, gå till abonnenten och kontrollera data med hjälp av uttalandet nedan.

use sub_db
select * from TBL_EMP  where empid = 1 

Vi kan se att förändringen från förlaget har vunnit och förändringen från prenumeranten har förlorat.

Konfliktinformationen lagras i konflikttabellerna och kan ses i konfliktvisaren.

Navigera till utgivaren, högerklicka på den och välj Visa konflikter.

Välj konflikttabellen och klicka på OK för att visa detaljer.

Ändra spårningsnivån

Låt oss nu ändra spårningsnivån till spårning på kolumnnivå. Navigera till publikationen, högerklicka på den och välj Utgivaregenskaper. Klicka på Artiklar, välj tabellen, klicka på Artikelegenskaper, ange egenskaper för den markerade tabellartikeln, välj Spårning på kolumnnivå, klicka på OK, klicka på OK och klicka sedan på Markera för ominitiering.

Detta kommer att markera alla prenumeranter för ominitiering eftersom vi ändrar den befintliga spårningsnivån till en ny.

Navigera till publikationen, högerklicka på publikationen och klicka på Visa status för ögonblicksbildagent klickar du på Start för att generera en ny ögonblicksbild. Det finns andra sätt att skapa en ögonblicksbild också.

Kör nu uttalandet nedan mot utgivaren för att uppdatera en post.

update TBL_EMP set Emp_Fname = 'Amanda' where empid = 2

Kör nu uttalandet nedan mot abonnentens db för att uppdatera efternamnet.

update TBL_EMP set Emp_Lname = 'A' where empid = 2

Kör sammanslagningsagenten manuellt. Jag ser fortfarande konflikten på posten även om vi uppdaterade två olika kolumner och ställde in spårningsnivån till kolumnnivån.

Vi kan se detaljerna i konfliktvisaren. Att ändra den befintliga spårningsnivån fungerade inte. Så jag konfigurerade om publikationen, ställde in spårningsnivån till spårning på kolumnnivå innan jag genererade den första ögonblicksbilden. En ögonblicksbild skapades och en prenumerant lades till i publikationen.

När den första ögonblicksbilden har tillämpats på prenumeranten kör du följande satser i utgivarens databas.

update TBL_EMP set Emp_Fname = 'Amanda' where empid = 3

Kör följande sats i prenumerantdatabasen.

update TBL_EMP set Emp_Lname = 'A' where empid = 3

Kör sammanslagningsagenten manuellt. Fråga nu tabellen TBL_EMP i abonnentdatabasen.

Uppdateringen från utgivaren och prenumeranten kvalificeras inte som en konflikt eftersom båda finns på olika kolumner, och spårningsnivån är inställd på spårning på kolumnnivå. Ingen konflikt loggas i konflikttabellerna, uppdateringarna på både utgivaren och prenumeranten på olika kolumner går inte förlorade.

Låt oss uppdatera samma kolumn om utgivaren och prenumeranten.

Kör följande sats mot utgivardatabasen.

use pub_db
update TBL_EMP set Emp_Lname = 'B' where empid = 1

Kör följande sats mot abonnentdatabasen.

use sub_db
update TBL_EMP set Emp_Lname = 'C' where empid = 1

Kör sammanslagningsagenten och fråga tabellen TBL_EMP på abonnenten. Uppdateringen av abonnenten går förlorad och konflikten loggas.

Prestanda:

Det kan finnas prestandakostnader med spårning på kolumnnivå jämfört med spårning på radnivå när det finns stora uppdateringar. Men i mitt fall märkte jag ingen skillnad i synkroniseringstidpunkter för spårning på både radnivå och kolumnnivå vid stora uppdateringar eftersom tabellen kan vara enkel i strukturen (dvs väldigt få kolumner) och både abonnenten och utgivare är på samma SQL-serverinstans.

Anmärkningar:

  • Som standard är det alltid spårning på radnivå när sammanslagningsreplikering är konfigurerad.
  • Alternativet för spårningsnivå beror på en tabell. Så du kan ha en radnivå på en tabell och en kolumnnivå på en annan tabell.
  • Dessa alternativ hjälper bara när en konflikt upptäcks baserat på en uppdatering, inte löser den.
  • Konfigurera om publikationen om det inte fungerar att ändra den befintliga spårningsnivån.
  • Ställ in spårningsnivån efter dina affärsbehov.

  1. Hur får jag en lista över alla tabeller i en databas med TSQL?

  2. Hur DevOps ska använda DBaaS (Database-as-a-Service) för att optimera sin applikationsutveckling​

  3. Gruppera mysql-fråga med 15 minuters intervall

  4. Hur kan jag importera en JSON-fil till PostgreSQL?