sql >> Database >  >> RDS >> Database

Bijhouden op kolom- en rijniveau bij samenvoegreplicatie

In dit artikel bekijken we de trackingopties op rij- en kolomniveau bij samenvoegreplicatie en hoe deze worden gebruikt bij het detecteren van conflicten tijdens samenvoegreplicatie.

Replicatie samenvoegen: Samenvoegreplicatie wordt gebruikt om gegevens op beide manieren te repliceren, namelijk van de uitgever naar de abonnee en van de abonnee naar de uitgever.

De eerste momentopname van objecten wordt gemaakt en toegepast op abonnees. Incrementele gegevenswijzigingen en schemawijzigingen worden bijgehouden met behulp van triggers en toegepast op abonnees wanneer de abonnee synchroniseert met de uitgever.

Conflicten:

Bij samenvoegreplicatie zijn zowel de abonnee als de uitgever onafhankelijk en kunnen gegevens op elk knooppunt worden gewijzigd.

Wanneer gegevens worden gewijzigd op zowel de uitgever als de abonnee binnen de replicatiecyclus, en wanneer de abonnee synchroniseert met de uitgever, treedt er een conflict op. De fusieagent bepaalt de winnaar aan beide kanten, afhankelijk van de conflictoplosser. Standaard wordt de winnaar bepaald door verschillende parameters zoals een client- of serverabonnement, pull- of push-abonnement, enz.

Conflictdetectie:

De conflictdetectie hangt af van het type tracking dat we voor het artikel configureren.

  • Bijhouden op rijniveau: Als er gegevenswijzigingen worden aangebracht in een kolom op dezelfde rij aan beide uiteinden, wordt dit als een conflict beschouwd.
  • Bijhouden op kolomniveau: Als gegevenswijzigingen aan beide uiteinden in dezelfde kolom worden aangebracht, wordt deze wijziging als een conflict gekwalificeerd.

Oplossers:

Oplossers passen de winnaargegevens aan beide kanten toe wanneer zich een conflict voordoet.

Als er een conflict is tussen de uitgever en de abonnee, wint de uitgever standaard altijd.

Als er een conflict optreedt tussen twee abonnees, wordt de winnaar bepaald door de client/server-abonnee en pull/push-abonnementen.

Naast de standaardresolver zijn er ook weinig aangepaste resolvers. We zullen aangepaste resolvers bespreken in komende artikelen.

Samenvoegreplicatie configureren met tracking op rijniveau:

Uitgeversdatabase:pub_db

Abonneedatabase:sub_db

Laten we de tabel "TBL_EMP" maken en deze toevoegen om replicatie samen te voegen.

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

Om de samenvoegreplicatie te configureren, moet de uitgever worden geconfigureerd om lokale distributie of externe distributie te gebruiken.

Nadat de distributie is geconfigureerd, navigeert u naar de replicatiemap in SSMS en klikt u met de rechtermuisknop op lokale publicaties.

Klik op Volgende en selecteer de publicatiedatabase, klik op Volgende en selecteer de samenvoegreplicatie, selecteer 2008 of later en voeg de tabel toe aan de replicatie.

Klik nu op de artikeleigenschappen en selecteer de eigenschappen van het gemarkeerde artikel.

Selecteer het trackingniveau als tracking op rijniveau.

Standaard is dit het bijhouden op rijniveau. Klik op OK, Volgende, Volgende . Voeg een filter toe als u specifieke gegevens naar de abonnee wilt verzenden, anders negeer, schakel Maken in snapshot onmiddellijk , configureer de agentbeveiliging volgens uw behoeften, schakel Maak publicatie in , geef de naam van de publicatie op en klik op Voltooien .

Zodra de eerste momentopname is gegenereerd, voegt u de abonnee toe.

Navigeer naar de publicatie die u maakt in de replicatiemap op de uitgever, klik met de rechtermuisknop en selecteer Nieuw abonnement.

Klik op Volgende , selecteer de publicatie, klik op Volgende en selecteer het pull- of push-abonnement volgens uw behoeften. In dit geval heb ik een push-abonnement gebruikt.

Selecteer de abonnementsdatabase en klik op Volgende , configureer de inloggegevens voor de samenvoegagent en klik op Volgende .

Kies het agentschema volgens uw behoeften. In dit geval gebruikte ik Alleen uitvoeren op aanvraag . Klik op Volgende , selecteer Direct initialiseren en selecteer klant als het abonnementstype, klik op Volgende , schakel Abonnement maken in , klik op Volgende en Voltooien .

Nadat de eerste momentopname is toegepast, voert u de onderstaande instructie uit op de uitgever om het record bij te werken.

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

Voer nu op de abonnee-database de onderstaande instructie uit om de achternaam bij te werken.

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

Nu is dezelfde rij gewijzigd, zowel in de uitgeversdatabase als in de abonneedatabase binnen dezelfde replicatiecyclus.

Volgens de trackingoptie die we hebben ingesteld, d.w.z. tracking op rijniveau, wordt de wijziging als een conflict beschouwd en wordt deze in de conflicttabellen vastgelegd wanneer de merge-agent wordt uitgevoerd.

Navigeer naar de publicatie die je hebt gemaakt en vouw de publicatie uit om abonnementen te zien. Klik met de rechtermuisknop op het abonnement, selecteer Synchronisatiestatus bekijken en klik op Start.

Zodra de merge-agent succesvol is uitgevoerd, gaat u naar de abonnee en controleert u de gegevens met behulp van de onderstaande verklaring.

use sub_db
select * from TBL_EMP  where empid = 1 

We kunnen zien dat de verandering van de uitgever heeft gewonnen en de verandering van de abonnee heeft verloren.

De conflictinformatie wordt opgeslagen in de conflicttabellen en kan worden bekeken in de conflictviewer.

Navigeer naar de uitgever, klik er met de rechtermuisknop op en selecteer Conflicten bekijken.

Selecteer de conflicttabel en klik op OK om details te bekijken.

Het trackingniveau wijzigen

Laten we nu het trackingniveau wijzigen in tracking op kolomniveau. Navigeer naar de publicatie, klik er met de rechtermuisknop op en selecteer Publisher-eigenschappen. Klik op Artikelen, selecteer de tabel, klik op Artikeleigenschappen, stel de eigenschappen van het gemarkeerde tabelartikel in, selecteer Bijhouden op kolomniveau, klik op OK, klik op OK en klik vervolgens op Markeren voor herinitialisatie.

Hiermee worden alle abonnees gemarkeerd voor herinitialisatie, aangezien we het bestaande trackingniveau naar een nieuw niveau wijzigen.

Navigeer naar de publicatie, klik met de rechtermuisknop op de publicatie en klik op Status momentopname agent bekijken , klik op Start om een ​​nieuwe momentopname te maken. Er zijn ook andere manieren om een ​​momentopname te maken.

Voer nu de onderstaande verklaring uit tegen de uitgever om een ​​record bij te werken.

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

Voer nu de onderstaande verklaring uit tegen de abonnee-db om de achternaam bij te werken.

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

Voer de samenvoegagent handmatig uit. Ik zie het conflict nog steeds, ook al hebben we twee verschillende kolommen bijgewerkt en het trackingniveau op kolomniveau ingesteld.

We kunnen de details zien in de conflictviewer. Het wijzigen van het bestaande trackingniveau werkte niet. Dus ik heb de publicatie opnieuw geconfigureerd, het volgniveau ingesteld op het volgen op kolomniveau voordat ik de eerste momentopname heb gegenereerd. Er is een momentopname gemaakt en er is een abonnee aan de publicatie toegevoegd.

Zodra de eerste momentopname is toegepast op de abonnee, voert u de volgende instructies uit in de uitgeversdatabase.

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

Voer de volgende instructie uit in de abonneedatabase.

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

Voer de samenvoegagent handmatig uit. Zoek nu in de abonneedatabase naar de tabel TBL_EMP.

De update van de uitgever en de abonnee worden niet gekwalificeerd als een conflict, aangezien beide zich op verschillende kolommen bevinden en het trackingniveau is ingesteld op tracking op kolomniveau. Er wordt geen conflict vastgelegd in de conflicttabellen, de updates van zowel de uitgever als de abonnee op verschillende kolommen gaan niet verloren.

Laten we dezelfde kolom bijwerken over de uitgever en de abonnee.

Voer de volgende instructie uit tegen de uitgeversdatabase.

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

Voer de volgende instructie uit voor de abonneedatabase.

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

Voer de merge-agent uit en doorzoek de TBL_EMP-tabel op de abonnee. De update van de abonnee is verloren gegaan en het conflict is gelogd.

Prestaties:

Er kan sprake zijn van prestatieoverhead bij tracking op kolomniveau in vergelijking met tracking op rijniveau wanneer er enorme updates zijn. Maar in mijn geval merkte ik geen verschil in synchronisatietiming voor zowel het volgen op rij- als kolomniveau in het geval van enorme updates, aangezien de tabel eenvoudig van structuur kan zijn (d.w.z. heel weinig kolommen) en zowel de abonnee als de uitgever bevinden zich op dezelfde SQL-serverinstantie.

Opmerkingen:

  • Standaard is het altijd tracking op rijniveau wanneer samenvoegreplicatie is geconfigureerd.
  • De optie voor het trackingniveau is afhankelijk van een tabel. U kunt dus een rijniveau hebben op de ene tabel en een kolomniveau op een andere tabel.
  • Deze opties helpen alleen wanneer een conflict wordt gedetecteerd op basis van een update, niet om het op te lossen.
  • Configureer de publicatie opnieuw als het wijzigen van het bestaande trackingniveau niet werkt.
  • Stel het trackingniveau in op basis van uw zakelijke behoeften.

  1. Hoe top 1 en gesorteerd op datum selecteren in Oracle SQL?

  2. Is de puntkomma nodig in SQL?

  3. DSN-bestanden en IRI-software

  4. PostgreSQL 12:Implementatie van K-Nearest Neighbor Space gepartitioneerde algemene zoekboomindexen