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.