sql >> Database teknologi >  >> RDS >> Database

Sporing på kolonneniveau og rækkeniveau i fletningsreplikering

Lad os i denne artikel gennemgå sporingsmuligheder på række- og kolonneniveau i flettereplikering, og hvordan disse bruges til at opdage konflikter under fletreplikering.

Flet replikering: Fletreplikering bruges til at replikere data på begge måder, dvs. fra udgiveren til abonnenten og fra abonnenten til udgiveren.

Det første øjebliksbillede af objekter tages og anvendes på abonnenter. Inkrementelle dataændringer og skemaændringer spores ved hjælp af triggere og anvendes på abonnenter, når abonnenten synkroniserer med udgiveren.

Konflikter:

Ved fletningsreplikering er både abonnenten og udgiveren uafhængige, og data kan ændres på enhver node.

Når data ændres på både udgiveren og abonnenten inden for replikeringscyklussen, og når abonnenten synkroniserer med udgiveren, opstår der en konflikt. Fusionsagenten bestemmer vinderen på begge sider afhængigt af konfliktløseren. Som standard bestemmes vinderen af ​​forskellige parametre såsom et klient- eller serverabonnement, pull- eller push-abonnement osv.

Konfliktregistrering:

Konfliktdetektionen afhænger af den type sporing, vi konfigurerer for artiklen.

  • Sporing på rækkeniveau: Hvis der foretages dataændringer i en kolonne i den samme række i begge ender, betragtes det som en konflikt.
  • Sporing på kolonneniveau: Hvis dataændringer foretages i den samme kolonne i begge ender, kvalificeres denne ændring som en konflikt.

Resolvere:

Opløsere anvender vinderdataene i begge ender, når der opstår en konflikt.

Som standard, hvis der er en konflikt mellem udgiveren og abonnenten, vinder udgiveren altid.

Hvis der opstår en konflikt mellem to abonnenter, bestemmes vinderen af ​​klient/server-abonnenten og pull/push-abonnementer.

Ud over standardresolveren er der også få brugerdefinerede resolvere. Vi vil diskutere brugerdefinerede resolvere i kommende artikler.

Konfigurer flettereplikering med sporing på rækkeniveau:

Udgiverdatabase:pub_db

Abonnentdatabase:sub_db

Lad os oprette "TBL_EMP"-tabellen og tilføje den for at flette 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')

For at konfigurere flettereplikeringen skal udgiveren konfigureres til at bruge lokal distribution eller fjerndistribution.

Når distributionen er konfigureret, skal du navigere til replikeringsmappen i SSMS og højreklikke på lokale publikationer.

Klik på Næste og vælg publikationsdatabasen, klik på Næste og vælg fletningsreplikeringen, vælg 2008 eller nyere og føj tabellen til replikeringen.

Klik nu på artiklens egenskaber og vælg egenskaberne for den fremhævede artikel.

Vælg sporingsniveauet for at være sporing på rækkeniveau.

Som standard vil det være sporing på rækkeniveau. Klik på OK, Næste, Næste . Tilføj et filter, hvis du vil sende specifikke data til abonnenten, ellers ignorer, aktiver Opret øjebliksbilledemed det samme , konfigurer agentsikkerheden efter dine behov, aktiver Opret udgivelse , angiv navnet på publikationen og klik på Udfør .

Når det første øjebliksbillede er genereret, skal du tilføje abonnenten.

Naviger til den publikation, du opretter i replikeringsmappen på udgiveren, højreklik og vælg Nyt abonnement.

Klik på Næste , vælg publikationen, klik på Næste og vælg pull- eller push-abonnementet efter dine behov. I dette tilfælde brugte jeg push-abonnement.

Vælg abonnementsdatabasen, og klik på Næste , konfigurer loginoplysningerne for fletteagenten, og klik på Næste .

Vælg agentplanen efter dine behov. I dette tilfælde brugte jeg Kun kun efter behov . Klik på Næste , vælg Initialiser med det samme og vælg klient som abonnementstype, klik på Næste , aktiver Opret abonnement , klik på Næste og Afslut .

Når det første øjebliksbillede er anvendt, skal du køre erklæringen nedenfor på udgiveren for at opdatere posten.

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

Kør nu erklæringen nedenfor på abonnent-DB for at opdatere efternavnet.

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

Nu er den samme række blevet ændret både i udgiverdatabasen og abonnentdatabasen inden for samme replikeringscyklus.

I henhold til den sporingsindstilling, vi angiver, dvs. sporing på rækkeniveau, betragtes ændringen som en konflikt og vil blive logget i konflikttabellerne, når fletteagenten kører.

Naviger til den publikation, du har oprettet, og udvid publikationen for at se abonnementer. Højreklik på abonnementet, vælg Vis synkroniseringsstatus, og klik på Start.

Når fletteagenten har kørt med succes, skal du gå til abonnenten og kontrollere dataene ved hjælp af erklæringen nedenfor.

use sub_db
select * from TBL_EMP  where empid = 1 

Vi kan se, at ændringen fra udgiveren har vundet, og ændringen fra abonnenten har tabt.

Konfliktoplysningerne gemmes i konflikttabellerne og kan ses i konfliktvisningen.

Naviger til udgiveren, højreklik på den, og vælg Vis konflikter.

Vælg konflikttabellen, og klik på OK for at se detaljer.

Ændring af sporingsniveauet

Lad os nu ændre sporingsniveauet til sporing på kolonneniveau. Naviger til publikationen, højreklik på den, og vælg Publisher-egenskaber. Klik på Artikler, vælg tabellen, klik på Artikelegenskaber, indstil egenskaber for den fremhævede tabelartikel, vælg Sporing på kolonneniveau, klik på OK, klik på OK, og klik derefter på Markér til geninitialisering.

Dette vil markere alle abonnenter til geninitialisering, da vi ændrer det eksisterende sporingsniveau til et nyt.

Naviger til publikationen, højreklik på publikationen, og klik på Se status for øjebliksbilledeagent , klik på Start for at generere et nyt øjebliksbillede. Der er også andre måder at generere et øjebliksbillede på.

Kør nu erklæringen nedenfor mod udgiveren for at opdatere en post.

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

Kør nu sætningen nedenfor mod abonnentens db for at opdatere efternavnet.

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

Kør fletteagenten manuelt. Jeg kan stadig se konflikten på journalen, selvom vi opdaterede to forskellige kolonner og indstillede sporingsniveauet til kolonneniveauet.

Vi kan se detaljerne i konfliktfremviseren. Ændring af det eksisterende sporingsniveau virkede ikke. Så jeg omkonfigurerede publikationen, indstillede sporingsniveauet til sporing på kolonneniveau, før jeg genererede det indledende øjebliksbillede. Et øjebliksbillede blev oprettet, og en abonnent blev tilføjet til publikationen.

Når det første øjebliksbillede er anvendt på abonnenten, skal du køre følgende udsagn i udgiverdatabasen.

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

Kør følgende sætning i abonnentdatabasen.

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

Kør fletteagenten manuelt. Forespørg nu i TBL_EMP-tabellen i abonnentdatabasen.

Opdateringen fra udgiveren og abonnenten er ikke kvalificeret som en konflikt, da begge er på forskellige kolonner, og sporingsniveauet er indstillet til sporing på kolonneniveau. Ingen konflikt er logget i konflikttabellerne, opdateringerne på både udgiveren og abonnenten på forskellige kolonner går ikke tabt.

Lad os opdatere den samme kolonne om udgiveren og abonnenten.

Udfør følgende sætning mod udgiverdatabasen.

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

Udfør følgende sætning mod abonnentdatabasen.

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

Kør fletteagenten og forespørg TBL_EMP-tabellen på abonnenten. Opdateringen på abonnenten går tabt, og konflikten logges.

Ydeevne:

Der kan være præstationsomkostninger med sporing på kolonneniveau sammenlignet med sporing på rækkeniveau, når der er store opdateringer. Men i mit tilfælde bemærkede jeg ingen forskel i synkroniseringstidspunkter for sporing på både række- og kolonneniveau i tilfælde af store opdateringer, da tabellen kan være enkel i strukturen (dvs. meget få kolonner) og både abonnenten og udgiver er på den samme SQL-serverinstans.

Bemærkninger:

  • Som standard er det altid sporing på rækkeniveau, når fletningsreplikering er konfigureret.
  • Muligheden for sporingsniveau afhænger af en tabel. Så du kan have et rækkeniveau på én tabel og et kolonneniveau på en anden tabel.
  • Disse muligheder hjælper kun, når der registreres en konflikt baseret på en opdatering og ikke løser den.
  • Genkonfigurer udgivelsen, hvis ændring af det eksisterende sporingsniveau ikke virker.
  • Indstil sporingsniveau i henhold til dine forretningsbehov.

  1. Hvad er en forespørgselsudligger, og hvordan rettes den

  2. MySQL vælg én kolonne DISTINCT, med tilsvarende andre kolonner

  3. Hvordan kalder man Oracle Function i Python?

  4. Hvad er bedre for din big data-applikation, SQL eller NoSQL?