sql >> Databáze >  >> RDS >> Sqlserver

Konfigurace transakční replikace SQL Server

Transakční replikace na serveru SQL Server je jednou z nejčastěji používaných technik replikace ke kopírování nebo distribuci dat mezi více cíli. V předchozích článcích jsme diskutovali o replikaci serveru SQL a o tom, jak replikace interně funguje. Nyní je naším cílem zjistit, jak nakonfigurovat transakční replikaci na serveru SQL Server pomocí přístupu zálohování a jak správně přidávat nebo odebírat články do replikace. Bez náležitých opatření riskujeme zneplatnění snímku a čelíme nutnosti překonfigurovat Replikaci.

Správa transakční replikace

V mých předchozích článcích jsme prošli pokyny krok za krokem k níže uvedeným položkám:

  • Konfigurace distribuce
  • Konfigurovat publikaci pomocí možnosti Snímek
  • Nakonfigurujte předplatné pomocí možnosti Snímek

Při konfiguraci replikace jsme nejprve nakonfigurovali distributora. Poté jsme přistoupili k vytvoření publikace a předplatného. Chcete-li replikaci vypustit nebo vyčistit, musíme provést opačný proces. Nejprve bychom museli smazat předplatné, poté publikaci a nakonec zrušit distributora nebo distribuční databázi.

V tomto článku se pokusíme vypustit transakční replikaci na SQL Server, kterou jsme dříve nakonfigurovali. Použijeme přístup zálohování a přidáme nebo odebereme články z Replikace následujícím způsobem:

  • Zrušit odběr
  • Zrušit publikaci
  • Drop Distributor nebo distribuční databáze
  • Pokud některý z výše uvedených kroků nepracuje správně, vyčistěte replikaci úplně
  • Konfigurace replikace pomocí zálohování databáze
  • Odstraňte články z replikace pomocí přístupu Wizard i T-SQL
  • Přidávejte nové články do replikace pomocí přístupu Wizard i T-SQL
  • Přidejte článek o uložených procedurách a prostudujte si rozdíl mezi článkem Tabulka a článkem o uložených procedurách

Zrušit odběr

Chcete-li zrušit jakoukoli nakonfigurovanou replikaci, musíme nejprve zrušit předplatné.

V SSMS se připojte k instanci Publisher> Replikace > Místní publikace . Klikněte pravým tlačítkem na Předplatné> Smazat nebo Drop Předplatné:

SQL Server vás požádá o potvrzení vaší akce:

Klikněte na Ano pro zrušení předplatného. Tím se předplatné úplně zruší.

V mém aktuálním nastavení jsou Publisher i Subscriber ve stejné instanci. Nebyly tedy odeslány žádné požadavky na připojení k instanci odběratele za účelem ověření. V případě, že bychom jej měli na jiné instanci SQL Serveru, požádal by o připojení k instanci odběratele, aby před smazáním odběratele ověřil.

Vypuštění publikace interně používá sp_droppublication a tento postup můžeme použít k ručnímu odstranění publikace prostřednictvím přístupu T-SQL

Zrušit publikaci

Jakmile je předplatné smazáno, můžeme pokračovat a zahodit publikaci . Klikněte pravým tlačítkem na AdventureWorks_Pub a vyberte Smazat z nabídky:

Zobrazí se zpráva s výzvou k potvrzení této akce. Všimněte si, že se chystáte smazat publikaci. Všechny záznamy, které byly replikovány do databáze odběratelů, však nebudou odstraněny. K vyčištění těchto replikovaných záznamů budeme muset databázi zrušit ručně. Klikněte na Ano .

Vypuštěním publikace se interně použije sp_droppublication postup.

Zrušte distributora nebo distribuční databázi

Již dříve jsme zmínili, že distribuční databáze je systémovou databází. Nemůžeme jej tedy zrušit kliknutím pravým tlačítkem myši na databázi a výběrem možnosti odstranění jako u uživatelských databází. Pokud klikneme pravým tlačítkem na distribuční databázi, dostaneme pouze níže uvedené možnosti:

Když potřebujeme odstranit distribuční databázi, musíme nejprve kliknout pravým tlačítkem myši na Replikaci uzel> Zakázat Publikování a distribuce .

Otevře se průvodce.

Ve výchozím nastavení je druhá možnost (Ne, nadále používat tento server jako vydavatel ) je vybráno, aby se zabránilo náhodnému vypuštění všech publikací na server.

V našem případě máme pouze jednu publikaci a rádi bychom uklidili. Vybíráme tedy první možnost – Ano, zakázat publikování na tomto serveru . Zruší všechny publikace spolu s předplatnými, pokud nebyly zrušeny již spolu s deaktivací distributora.

Pokud má náš server nakonfigurovanou pouze jednu replikaci, můžeme použít tohoto průvodce samotného k vyčištění všeho. Pokud je však nakonfigurováno více replikací, zrušíme transakční replikaci na serveru SQL podle standardních kroků sdílených výše.

Nyní musíme vybrat první možnost Ano, zakázat publikování na tomto serveru a klikněte na Další .

V novém okně zaškrtněte obě možnosti:Zakázat publikování a distribuci a Vygenerujte soubor skriptu s kroky…

Pro vygenerování souboru skriptu budete muset zadat cestu, kam jej uložit.

Klikněte na Další a zobrazit možnosti vybrané v průvodci. Zkontrolujte a ujistěte se, že jste vše vybrali správně.

Klikněte na Dokončit .

Interní zrušení distribuční databáze používá sp_dropdistributor postup.

Jakmile je Distributor deaktivován, můžeme vidět, že distribuční databáze je vynechána ze systémových databází.

Úplně vyčistěte replikaci, pokud některý z výše uvedených kroků nefunguje správně

Pokud je předplatné nebo publikace zrušeno prostřednictvím jakéhokoli jiného přístupu, dostaneme se do nekonzistentního odstraňování transakční replikace na serveru SQL Server a dochází k mnoha chybám. K vyčištění všech zbytků předplatného nebo publikace můžeme použít systémový postup sp_removedbreplication .

exec_spremovedbreplication

Tento postup proveďte pouze v případě, že po vyzkoušení všech ostatních zmíněných přístupů přetrvávají nějaké problémy s replikací. Uložená procedura sp_removedbreplication by měl být spuštěn v databázi vydavatelů nebo z hlavní databáze a pomocí níže uvedeného příkazu po nahrazení @dbname názvem databáze vydavatelů.

exec_spremovedbreplication @dbname

Konfigurace replikace pomocí přístupu zálohování

Po úplném odstranění replikace překonfigurujte transakční replikaci na serveru SQL pomocí přístupu zálohování. Zahrnuje následující kroky:

  • Nakonfigurujte distributora
  • Vytvořte publikaci
  • Upravte vlastnosti publikace, aby bylo možné vytvořit předplatné z úplné nebo rozdílové zálohy.
  • Vezměte si úplnou zálohu vydavatele a obnovte ji jako odběratel.
  • Nakonfigurujte předplatné a spusťte inicializaci ze zálohy.

Většinu kroků jsme již provedli dříve při konfiguraci replikace. Proto se zde nebudeme podrobně zabývat těmito kroky.

Konfigurace distributora a publikace

Informace o tom, jak nakonfigurovat distribuci i publikaci pomocí průvodce vytvořením publikace, naleznete v pokynech Krok za krokem z předchozího článku. Chcete-li se naučit skripty T-SQL používané průvodcem k vytvoření distribuce a publikace, vygenerujte skripty do souboru během posledního kroku průvodce a nespouštějte skripty zrušením zaškrtnutí možnosti „Vytvořit publikaci“, jak je uvedeno níže. .

Nyní otevřete soubor skriptu uložený v novém okně dotazu a vytvořte distributora a publikaci pomocí těchto skriptů:

Všimněte si prosím druhého komentovaného řádku – uvádí, že všechny hodnoty hesla, které jsme zadali v průvodci, byly z bezpečnostních důvodů převedeny na NULL nebo prázdný řetězec. Podívejte se na zvýrazněný řádek s @password =prázdné hodnoty. Nahraďte je správnými hodnotami hesla, proveďte totéž pro další sekce s hesly a spusťte skript.

Skript byl úspěšně proveden. Vidíme, že prováděním skriptů byla vytvořena distribuční databáze a všechny systémové tabulky v ní. Na konci zprávy můžeme vidět, že byla vytvořena a spuštěna také úloha Log Reader Agent.

V případě potřeby můžete uložit výsledky, abyste se dozvěděli o všech tabulkách, pohledech a kritických procedurách v distribuční databázi. Tyto informace vám pomohou při dalším odstraňování problémů.

Po úspěšném provedení skriptů můžeme vidět úspěšně vytvořenou distribuční databázi a publikaci.

Upravte vlastnosti publikace, abyste povolili vytváření předplatného z úplné nebo rozdílové zálohy

Pokud je velikost databáze velmi malá, čas potřebný k odeslání počátečního snímku bude rychlejší.

Na druhou stranu vytváření transakční replikace v SQL Server pomocí Snapshot není efektivní v následujících případech:

  1. Pokud je databáze obrovská (300 GB nebo více). Doba potřebná k odeslání počátečního snímku bude příliš dlouhá.
  2. Pokud se odběratel nachází na různých místech s nízkou šířkou pásma sítě. Poté bude proces počátečního snímku probíhat několik dní.

Vytvoření úplné zálohy, její přenos přes FTP nebo fyzicky na jiné místo, obnovení této zálohy a inicializace odběratele bude tedy výrazně rychlejší ve srovnání s přístupem Snapshot.

Aby publikace podporovala inicializaci ze záloh, musíme upravit jednu z vlastností publikace. To lze provést buď pomocí SSMS nebo T-SQL.

Přístup SSMS

Klikněte pravým tlačítkem na AdventureWorks_pub publikaci a vyberte Vlastnosti :

Klikněte na Možnosti předplatného :

Nastavte True pro Povolit inicializaci ze záložních souborů a klikněte na OK . To nám umožní inicializovat z úplné i rozdílové zálohy.

Přístup T-SQL

V T-SQL můžeme proceduru nazvat sp_changepublication tuto vlastnost upravit.

Skript pro změnu této vlastnosti je níže:

USE AdventureWorks
GO
exec sp_changepublication @publication = 'AdventureWorks_pub', @property = 'allow_initialize_from_backup', @value = 'true'

Vezměte si úplnou zálohu vydavatele a obnovte ji jako odběratel

Klíčovým faktorem je, že po implementaci výše uvedené vlastnosti publikace musíme provést úplnou zálohu. Pokud je velikost databáze obrovská, můžeme provést úplnou zálohu a obnovit ji v režimu RECOVERY v instanci odběratele a po provedení výše uvedené změny konfigurace provést rozdílovou zálohu a obnovit ji v databázi odběratele v režimu NORECOVERY.

Nakonfigurujte předplatné a spusťte inicializaci ze zálohy

Znovu se podívejte na pokyny Krok za krokem. Potřebujeme vygenerovat potřebné skripty, ale nespouštět je. Jde o to, že Inicializujeme předplatné z úplné nebo rozdílové zálohy pouze pomocí T-SQL skriptů. Tyto skripty jsem vytvořil při vytváření předplatného minule. Viz otevřený soubor níže.

Poznámka :Skripty pro vytvoření předplatného musí být spuštěny z databáze Publisher. Otevřete tedy okno Query, které se připojuje k instanci Publisher.

Potřebujeme provést několik změn, aby se předplatné inicializovalo ze zálohy:

  • Změňte @sync_type hodnotu z automatického k inicializaci pomocí zálohy
  • Zadejte správná hesla pro hesla nahrazená NULL nebo prázdnými řetězci. Vzhledem k tomu, že jsem na serveru používal účet Agent Service, nemusím měnit hesla.
  • Přidejte parametry @backupdevicetype a @název zálohovacího zařízení a zadejte cestu k úplné nebo rozdílové záloze na serveru vydavatele (skript se na něm spustí).

Po dokončení bude náš skript vypadat takto:

Spuštěním skriptu dokončete konfiguraci předplatného a my obdržíme úspěšné dokončení skriptu, jak je uvedeno níže.

Jak ukazuje stav, úloha agenta distribuce SQL Server Agent byla vytvořena a spuštěna při vytváření předplatného.

Proto jsme úspěšně vytvořili naši replikaci pomocí přístupu Backup. Nyní můžeme ověřit dostupné předplatné.

Spusťte Replication Monitor a klepněte pravým tlačítkem myši na Subscriber. Zobrazí se stav replikace:

Jak vidíme, všechna data byla úspěšně inicializována ze zálohy, aniž by bylo nutné spouštět úlohu Snapshot Agent. Vzhledem k tomu, že v databázi neprobíhají žádné aktivní transakce, dostáváme v tuto chvíli v Monitoru replikace zprávu „Žádné replikované transakce nejsou dostupné“.

Vypustit články z replikace

Poté, co jsme se naučili konfigurovat transakční replikaci na serveru SQL pomocí průvodce replikací nebo skriptů T-SQL, nyní můžeme zkontrolovat, jak vypustit článek z replikace pomocí obou těchto metod.

Použití průvodce

Klikněte pravým tlačítkem na AdventureWorks_pub Publikace> Vlastnosti . Klikněte na Článek pro zobrazení seznamu článků obsažených v Replikaci.

Ve výchozím nastavení vypíše databázové objekty ve formátu OBJECT_NAME (SCHEMA_NAME). Pro účely testování vynecháme tabulku Person.ContactType z Replikace.

Chcete-li to provést, jednoduše zrušte zaškrtnutí políčka před ContactType (Osoba). SQL Server zobrazí upozornění nebo potvrzovací zprávu:

Jak vysvětluje, pokud jsou aktuálně k dispozici nějaké snímky, zneplatní tyto snímky kvůli změnám v článcích.

Protože jsme inicializovali pomocí přístupu zálohování a nepoužili jsme snímky, můžeme tuto zprávu bezpečně ignorovat a kliknout na Ano k odstranění tohoto článku tabulky z replikace. Klikněte na OK dokončete odstranění článku z replikace.

Nyní Person.ContactType tabulka je odstraněna z replikace. Jakékoli změny, ke kterým dojde u vydavatele, nebudou odeslány do databáze odběratelů. Můžeme to otestovat pomocí INSERT/UPDATE/DELETE záznamů na Person.ContactType tabulka.

Použití T-SQL

Dalším způsobem je vypustit článek z replikace pomocí sp_droparticle postup.

USE [AdventureWorks]
GO
EXEC sp_droparticle 
  @publication = N'AdventureWorks_pub', 
  @article = N'ContactType',
  @force_invalidate_snapshot = 1;
GO

Přidat nové články do replikace pomocí průvodce nebo TSQL přístupu

V některých případech (jako je údržba tabulek) může být potřeba odstranit několik článků a po dokončení údržby je přidat zpět do replikace.

Úspěšně jsme se naučili, jak odstranit články z Replikace. Podívejme se, jak přidat nové články do Replikace. Přidáme Person.ContactType tabulka které jsme dříve odstranili zpět do Replikace.

Použití průvodce

Chcete-li přidat článek tabulky zpět do replikace, klikněte pravým tlačítkem na Publikace > Vlastnosti > Články . Zobrazí se seznam článků dostupných v publikaci.

Nepodařilo se nám najít Person.ContactType tabulka – na obrazovce se zobrazí pouze ty tabulky, které byly součástí Replikace. Chcete-li zobrazit všechny tabulky dostupné v databázi Publisher, zrušte zaškrtnutí Zobrazit v seznamu pouze vybrané články pro zobrazení všech tabulek.

Nyní vidíme Person.ContactType uvedena tabulka.

Jak jsme uvedli dříve, všechny tabulky bez primárních klíčů budou mít červený kruh ikona, která označuje, že tyto tabulky nelze zahrnout do replikace pomocí průvodce ani přístupu T-SQL.

Zkontrolujte ContactType (Person) tabulku přidejte zpět do replikace a klikněte na OK .

Tabulka je znovu přidána do replikace. Musíme však vymyslet způsob, jak odeslat počáteční snímek tohoto nově přidaného článku o tabulce.

Pokud jste prošli článek až sem, uhodli byste to správně – stačí spustit Snapshot Agent Job a odeslat počáteční snímek pro tuto tabulku.

Udělejme to nyní – klikněte pravým tlačítkem na Publikace > zobrazit Agenta snímku stav.

Klikněte na Start odeslat snímek vhodných článků. Odešlete tato data do distribuční databáze a nakonec do databáze předplatitelů.

Přístup T-SQL

Podobné akce můžeme provést pomocí sp_addarticle postup.

Níže uvedený skript přidá články do replikace.

use [AdventureWorks]
GO
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'ContactType', @source_owner = N'Person', @source_object = N'ContactType'
, @type = N'logbased', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509F
, @identityrangemanagementoption = N'manual', @destination_table = N'ContactType', @destination_owner = N'Person', @vertical_partition = N'false'
, @ins_cmd = N'CALL sp_MSins_PersonContactType'
, @del_cmd = N'CALL sp_MSdel_PersonContactType'
, @upd_cmd = N'SCALL sp_MSupd_PersonContactType'
GO

Již dříve jsme si všimli, jak Replikace funguje u článku tabulky použitím 3 procedur vytvořených v databázi Subscriber pro zpracování operací INSERT/UPDATE a DELETE.

Pomocí přístupu T-SQL víme, jak jsou tyto procedury odkazovány. V případě potřeby můžeme přejmenovat objekty, názvy cílových tabulek nebo výchozí procedury. Za tímto účelem provedeme změny v sp_addarticle postup.

POZNÁMKA :Pokud provedeme nějaké úpravy replikace, měli bychom je všechny řádně zdokumentovat. Jinak by to mohlo později vést ke katastrofě.

Přidejte článek s uloženou procedurou a prostudujte si rozdíl mezi článkem v tabulce a článkem s uloženou procedurou

Chcete-li do replikace přidat uloženou proceduru, musíme přejít na Články stránku a zkontrolujte požadovanou uloženou proceduru, abyste ji mohli replikovat. Totéž můžeme udělat pro Zobrazení , Indexovaná zobrazení nebo Uživatelem definované funkce také.

Chcete-li se dozvědět více o rozdílu mezi články tabulky vs pohledy / uložená procedura / indexovaná zobrazení / funkce definované uživatelem, můžeme přidat jeden z každého článku pro každou kategorii pomocí T-SQL:

Přidání nového článku uložené procedury do replikace

use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'uspGetBillOfMaterials', @source_owner = N'dbo'
, @source_object = N'uspGetBillOfMaterials', @type = N'proc schema only', @description = null, @creation_script = null
, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001, @force_invalidate_snapshot = 1
, @destination_table = N'uspGetBillOfMaterials', @destination_owner = N'dbo'

Přidání nového článku zobrazení do replikace

use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'vVendorWithContacts', @source_owner = N'Purchasing'
, @source_object = N'vVendorWithContacts', @type = N'view schema only', @description = null, @creation_script = null, @pre_creation_cmd = N'drop'
, @schema_option = 0x0000000008000001, @destination_table = N'vVendorWithContacts', @destination_owner = N'Purchasing'
GO

Přidání nového článku indexovaného zobrazení do replikace

use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'vStateProvinceCountryRegion', @source_owner = N'Person'
, @source_object = N'vStateProvinceCountryRegion', @type = N'indexed view schema only', @description = null, @creation_script = null
, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001, @force_invalidate_snapshot = 1
, @destination_table = N'vStateProvinceCountryRegion', @destination_owner = N'Person'

Přidání nového článku funkce definované uživatelem do replikace

use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'ufnGetStock', @source_owner = N'dbo', @source_object = N'ufnGetStock'
, @type = N'func schema only', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001
, @force_invalidate_snapshot = 1, @destination_table = N'ufnGetStock', @destination_owner = N'dbo'

Používáme sp_addarticle postup pro přidání libovolného typu článku do replikace s nezbytnými vstupními parametry a možnostmi, které změní zahrnutý @type parametr.

Tyto články můžeme také přidat do publikace kliknutím pravým tlačítkem na Publikace > Vlastnosti > Články a jejich přidání do publikace.

Vlastnosti článku tabulky

Nyní změňme vlastnosti článku prostřednictvím Článků v nabídce Publikace vlastnosti:

Klikněte na náš oblíbený Person.ContactType tabulka> Vlastnosti článku . Bude zde možnost buď změnit Vlastnosti článku pouze pro tuto tabulku nebo pro všechny tabulky zahrnuté v replikaci. Pro test vybereme Nastavit vlastnosti článku zvýrazněné tabulky zobrazíte vlastnosti Person.ContactType tabulka.

Zobrazit všechny možnosti dostupné pro tento tabulkový článek:

Kopírovat objekty a nastavení na odběratele a Doručování výpisů jsou nejdůležitější nastavení pro replikaci. Při změně jakéhokoli z těchto parametrů musíme být velmi opatrní.

Kliknutím na INSERT\UPDATE\DELETE formát doručení získáte níže uvedené možnosti.

  • Nereplikovat příkazy INSERT\UPDATE\DELETE – přizpůsobení replikace tak, aby neodesílala konkrétní příkazy do databáze odběratelů
  • Výpis INSERT\UPDATE\DELETE – k odeslání příkazu INSERT\UPDATE\DELETE přímo odběrateli namísto rekonstrukce dat z transakčních protokolů
  • VOLAT – Proveďte vestavěnou uloženou proceduru uvedenou výše v sp_addarticle replikovat data.
  • XCALL – Provede rozšířenou uloženou proceduru k replikaci změn.

Vlastnosti článku uložené procedury

Klikněte na Vlastnosti článku na kterékoli z uložených procedur, abyste viděli Vlastnosti

Jednou z klíčových vlastností uložené procedury je možnost replikace – viz dostupné možnosti níže:

  • Pouze definice uložené procedury – replikuje pouze změny struktury DDL uložené procedury. Toto je výchozí možnost pro jakoukoli uloženou proceduru.
  • Provedení uložené procedury – použijte tuto volbu ke snížení zatížení replikace. Všechny změny provádí prostřednictvím Provedení uložené procedury na Účastníkovi bez odesílání jednotlivých příkazů. O této funkci, která řeší problémy s výkonem při replikaci velkých změn dat, se můžeme podívat v mém dalším článku.
  • Provedení v serializované transakci poskytovatele služeb – hybridní možnost výběru Provedení uložené procedury pouze pokud je postup prováděn v rámci serializované transakce. Jinak by to bylo replikováno jako jednotlivé příkazy DML.

Zobrazit vlastnosti článku

Klikněte na Vlastnosti článku pro jakýkoli pohled získáte Vlastnosti :

Vlastnosti článku indexovaného zobrazení

Klikněte na Vlastnosti článku pro kterékoli z indexovaných zobrazení pro vlastnosti :

Vlastnosti článku funkcí definovaných uživatelem

Klikněte na Vlastnosti článku u jakékoli Uživatelem definované funkce pro její Vlastnosti

Vlastnosti pohledů, indexovaných pohledů a uživatelsky definovaných funkcí jsou v podstatě stejné. Nemůžeme je tedy moc upravovat.

Závěr

Děkujeme, že jste si prošli další nabitý článek související s replikací. Dnes jsme objasnili podrobnosti o zrušení předplatného, ​​publikace, distribuční databáze a úplném vyčištění replikace, i když narazíme na nějaké problémy.

Nakonfigurovali jsme Replikaci nově inicializovanou ze zálohy a otestovali, jak přidat nové články do Replikace nebo je z ní odebrat. Při další práci s databázemi a zejména při hledání nesrovnalostí mezi nimi se vám profesionální nástroje velmi zúročí. dbForge Compare Bundle pro SQL Server identifikuje a analyzuje všechny takové rozdíly a hlásí je.

V našem dalším článku se podíváme na časté problémy s replikací a na to, jak je profesionálně vyřešit.


  1. Co je MySQL ekvivalentem PostgreSQL EXPLAIN ANALYZE

  2. Pomocí FILE_NAME() vrátíte název logického souboru pro dané ID souboru na serveru SQL Server

  3. String -> java.util.Date -> java.sql.Date (s časovým razítkem)

  4. Jak pgBouncer pomáhá urychlit Django