sql >> Databáze >  >> RDS >> Database

Sledování na úrovni sloupců a řádků při slučovací replikaci

V tomto článku se podíváme na možnosti sledování na úrovni řádků a sloupců při slučovací replikaci a jak se tyto možnosti používají při zjišťování konfliktů během slučovací replikace.

Sloučit replikaci: Slučovací replikace se používá k replikaci dat oběma způsoby, tj. od vydavatele k odběrateli a od odběratele k vydavateli.

Pořídí se počáteční snímek objektů a použije se na předplatitele. Přírůstkové změny dat a změny schémat jsou sledovány pomocí spouštěčů a aplikovány na odběratele, když se odběratel synchronizuje s vydavatelem.

Konflikty:

Při slučovací replikaci jsou odběratel i vydavatel nezávislí a data lze upravit na libovolném uzlu.

Při změně dat na vydavatele a odběratele v rámci replikačního cyklu a při synchronizaci odběratele s vydavatelem dojde ke konfliktu. Slučovací agent určí vítěze na obou stranách v závislosti na řešení konfliktu. Ve výchozím nastavení je vítěz určen různými parametry, jako je předplatné klienta nebo serveru, předplatné pull nebo push atd.

Detekce konfliktů:

Detekce konfliktu závisí na typu sledování, které pro článek nakonfigurujeme.

  • Sledování na úrovni řádků: Pokud jsou provedeny změny dat v libovolném sloupci na stejném řádku na obou koncích, je to považováno za konflikt.
  • Sledování na úrovni sloupců: Pokud jsou změny dat provedeny ve stejném sloupci na obou koncích, je tato změna kvalifikována jako konflikt.

Řešitelé:

Řešitelé použijí data vítěze na obou koncích, když dojde ke konfliktu.

Ve výchozím nastavení, pokud dojde ke konfliktu mezi vydavatelem a odběratelem, vydavatel vždy vyhraje.

Pokud dojde ke konfliktu mezi dvěma předplatiteli, o vítězi rozhoduje předplatitel klient/server a předplatné typu pull/push.

Kromě výchozího překladače existuje také několik vlastních překladačů. Vlastní resolvery probereme v nadcházejících článcích.

Konfigurace slučovací replikace se sledováním na úrovni řádků:

Databáze vydavatelů:pub_db

Databáze předplatitelů:sub_db

Vytvořme tabulku „TBL_EMP“ a přidejte ji ke slučovací replikaci.

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

Chcete-li nakonfigurovat slučovací replikaci, vydavatel by měl být nakonfigurován pro použití místní distribuce nebo vzdálené distribuce.

Jakmile je distribuce nakonfigurována, přejděte do složky replikace v SSMS a klikněte pravým tlačítkem na místní publikace.

Klikněte na Další a vyberte publikační databázi, klikněte na Další a vyberte slučovací replikaci, vyberte 2008 nebo novější a přidejte tabulku do replikace.

Nyní klikněte na vlastnosti článku a vyberte vlastnosti zvýrazněného článku.

Vyberte úroveň sledování, která bude sledováním na úrovni řádku.

Ve výchozím nastavení se bude jednat o měření na úrovni řádku. Klikněte na OK, Další, Další . Přidejte filtr, pokud chcete odeslat konkrétní data odběrateli, jinak ignorujte, povolte Vytvořit snímek okamžitě , nakonfigurujte zabezpečení agenta podle svých potřeb, povolte Vytvořit publikaci , zadejte název publikace a klikněte na Dokončit .

Po vygenerování úvodního snímku přidejte odběratele.

Přejděte k publikaci, kterou vytvoříte ve složce replikace na vydavateli, klikněte pravým tlačítkem a vyberte Nové předplatné.

Klikněte na Další , vyberte publikaci, klikněte na Další a vyberte předplatné pull nebo push podle svých potřeb. V tomto případě jsem použil předplatné push.

Vyberte databázi předplatného a klikněte na Další , nakonfigurujte přihlašovací údaje pro agenta sloučení a klikněte na Další .

Vyberte si rozvrh agenta podle svých potřeb. V tomto případě jsem použil Spustit pouze na vyžádání . Klikněte na Další , vyberte možnost Inicializovat ihned a vyberte klienta jako typ předplatného, ​​klikněte na Další , povolte Vytvořit předplatné , klikněte na Další a Dokončit .

Po použití počátečního snímku spusťte níže uvedený příkaz na vydavateli a aktualizujte záznam.

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

Nyní v databázi odběratelů spusťte níže uvedený příkaz a aktualizujte příjmení.

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

Nyní byl stejný řádek změněn jak v databázi vydavatelů, tak v databázi odběratelů v rámci stejného replikačního cyklu.

Podle možnosti sledování, kterou jsme nastavili, tj. sledování na úrovni řádků, je změna považována za konflikt a bude zaznamenána v tabulkách konfliktů při spuštění agenta sloučení.

Přejděte k publikaci, kterou jste vytvořili, a rozbalte publikaci, abyste viděli předplatné. Klikněte pravým tlačítkem na předplatné, vyberte Zobrazit stav synchronizace a klikněte na Start.

Po úspěšném spuštění slučovacího agenta přejděte k předplatiteli a zkontrolujte data pomocí níže uvedeného prohlášení.

use sub_db
select * from TBL_EMP  where empid = 1 

Vidíme, že změna od vydavatele zvítězila a změna od odběratele prohrála.

Informace o konfliktu jsou uloženy v tabulkách konfliktů a lze je zobrazit v prohlížeči konfliktů.

Přejděte na vydavatele, klikněte na něj pravým tlačítkem a vyberte Zobrazit konflikty.

Vyberte tabulku konfliktů a kliknutím na OK zobrazte podrobnosti.

Změna úrovně sledování

Nyní změňme úroveň sledování na sledování na úrovni sloupců. Přejděte na publikaci, klikněte na ni pravým tlačítkem a vyberte Vlastnosti vydavatele. Klikněte na Články, vyberte tabulku, klikněte na Vlastnosti článku, nastavte vlastnosti zvýrazněného článku v tabulce, vyberte Sledování na úrovni sloupců, klikněte na OK, klikněte na OK a poté klikněte na Označit pro reinicializaci.

Tím označíte všechny odběratele k opětovné inicializaci, protože měníme stávající úroveň sledování na novou.

Přejděte na publikaci, klikněte na publikaci pravým tlačítkem a klikněte na Zobrazit stav agenta snímku , klikněte na Start vygenerovat nový snímek. Existují i ​​jiné způsoby, jak vytvořit snímek.

Nyní spusťte níže uvedený příkaz proti vydavateli a aktualizujte záznam.

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

Nyní spusťte níže uvedený příkaz proti db odběratele a aktualizujte příjmení.

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

Spusťte agenta sloučení ručně. Stále vidím konflikt v záznamu, i když jsme aktualizovali dva různé sloupce a nastavili úroveň sledování na úroveň sloupce.

Podrobnosti můžeme vidět v prohlížeči konfliktů. Změna stávající úrovně sledování nefungovala. Před vygenerováním počátečního snímku jsem tedy překonfiguroval publikaci a nastavil úroveň sledování na sledování na úrovni sloupců. Byl vytvořen snímek a do publikace byl přidán odběratel.

Po použití počátečního snímku na odběratele spusťte v databázi vydavatele následující příkazy.

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

Spusťte následující příkaz v databázi odběratelů.

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

Spusťte agenta sloučení ručně. Nyní v databázi odběratelů vyhledejte tabulku TBL_EMP.

Aktualizace od vydavatele a odběratele nejsou kvalifikovány jako konflikt, protože obě jsou v různých sloupcích a úroveň sledování je nastavena na sledování na úrovni sloupců. V tabulkách konfliktů není zaznamenán žádný konflikt, aktualizace na vydavateli a odběrateli v různých sloupcích se neztratí.

Dovolte nám aktualizovat stejný sloupec o vydavateli a odběrateli.

Proveďte následující příkaz proti databázi vydavatele.

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

Proveďte následující příkaz proti databázi odběratelů.

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

Spusťte agenta hromadné korespondence a dotazujte se na tabulku TBL_EMP na odběratele. Aktualizace odběratele je ztracena a konflikt je zaznamenán.

Výkon:

U sledování na úrovni sloupců může dojít k režii výkonu ve srovnání se sledováním na úrovni řádků, když jsou velké aktualizace. Ale v mém případě jsem nezaznamenal žádný rozdíl v časování synchronizace pro sledování na úrovni řádků a na úrovni sloupců v případě velkých aktualizací, protože tabulka může mít jednoduchou strukturu (tj. velmi málo sloupců) a jak předplatitel, tak i vydavatel jsou na stejné instanci serveru SQL.

Poznámky:

  • Při konfiguraci slučovací replikace se ve výchozím nastavení vždy jedná o sledování na úrovni řádku.
  • Možnost úrovně sledování závisí na tabulce. Takže můžete mít úroveň řádku v jedné tabulce a úroveň sloupce v jiné tabulce.
  • Tyto možnosti pomáhají pouze v případě, že je konflikt detekován na základě aktualizace, nikoli jej řeší.
  • Pokud změna stávající úrovně sledování nefunguje, upravte konfiguraci publikace.
  • Nastavte úroveň sledování podle potřeb vaší firmy.

  1. UNIKÁTNÍ omezení vs kontrola před INSERT

  2. <expr> očekáváno, máte '?'

  3. Jak přidat řetězec k hodnotě sloupce v MySQL?

  4. Jak LPAD() funguje v MariaDB