sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server Transactional Replication Configuration

Transaktionell replikering i SQL Server är en av de mest använda replikeringsteknikerna för att kopiera eller distribuera data över flera destinationer. I tidigare artiklar diskuterade vi SQL Server-replikering och hur replikering internt fungerar. Nu är vårt mål att se hur man konfigurerar transaktionsreplikering i SQL Server med hjälp av säkerhetskopieringsmetoden och hur man lägger till eller tar bort artiklar till replikering på rätt sätt. Utan lämpliga åtgärder riskerar vi att ogiltigförklara ögonblicksbilden och ställs inför nödvändigheten att konfigurera om replikering.

Administration av transaktionsreplikering

I mina tidigare artiklar gick vi igenom steg-för-steg-instruktionerna om nedanstående artiklar:

  • Konfigurera distribution
  • Konfigurera publicering med alternativet Snapshot
  • Konfigurera prenumeration med alternativet Snapshot

När vi konfigurerade replikering har vi först konfigurerat distributören. Sedan fortsatte vi med att skapa en publikation och prenumeration. För att släppa eller rensa replikering måste vi göra den omvända processen. Först måste vi ta bort prenumerationen, sedan publicering och slutligen släppa distributören eller distributionsdatabasen.

I den här artikeln försöker vi ta bort Transaktionsreplikeringen i SQL Server som vi tidigare konfigurerat. Vi använder säkerhetskopieringsmetoden och lägger till eller tar bort artiklar från replikering på följande sätt:

  • Släpp prenumeration
  • Släpp publicering
  • Släpp distributör eller distributionsdatabas
  • Rensa upp replikeringen helt om något av stegen ovan inte fungerar korrekt
  • Konfigurera replikering med databassäkerhetskopiering
  • Släpp artiklar från replikering med både Wizard- och T-SQL-metoden
  • Lägg till nya artiklar i replikering med både Wizard- och T-SQL-metoden
  • Lägg till en artikel med lagrad procedur och studera skillnaden mellan tabellartikeln och artikeln om lagrad procedur

Släpp prenumeration

För att ta bort en konfigurerad replikering måste vi först avbryta prenumerationen.

I SSMS, anslut till Publisher-instansen> replikering > Lokala publikationer . Högerklicka på Prenumeration> Ta bort eller Släpp Prenumeration:

SQL Server kommer att be dig bekräfta din åtgärd:

Klicka på Ja för att avbryta prenumerationen. Detta kommer att ta bort prenumerationen helt.

I min nuvarande konfiguration är både Publisher och Prenumerant på samma instans. Därför skickades inga förfrågningar om att ansluta till abonnentinstansen för validering. Om vi ​​skulle ha den på en annan instans av SQL Server, skulle den be om att få ansluta till abonnentinstansen för att validera innan abonnenten tas bort.

Tappa publicering internt använder sp_droppublication och vi kan använda denna procedur för att manuellt ta bort publicering via T-SQL-metoden

Släpp publicering

När prenumerationen har raderats kan vi gå vidare och släppa publikationen . Högerklicka på AdventureWorks_Pub och välj Ta bort från menyn:

Du kommer att se ett meddelande som ber dig att bekräfta den åtgärden. Observera att du kommer att ta bort publikationen. Alla poster som replikerades till prenumerantdatabasen kommer dock inte att raderas. Vi måste släppa databasen manuellt för att rensa upp dessa replikerade poster. Klicka på Ja .

Om du släpper en publikation internt tillämpas sp_droppublication förfarande.

Släpp distributören eller distributionsdatabasen

Vi nämnde tidigare att distributionsdatabasen är en systemdatabas. Därför kan vi inte släppa det genom att högerklicka på databasen och välja borttagningsalternativet som med användardatabaser. Om vi ​​högerklickar på distributionsdatabasen får vi bara följande alternativ:

När vi behöver ta bort distributionsdatabasen måste vi först högerklicka på replikeringen nod> Inaktivera Publicering och distribution .

Det öppnar guiden.

Som standard är det andra alternativet (Nej, fortsätt att använda den här servern som en utgivare ) väljs för att undvika att alla publikationer tappas av misstag på servern.

I vårt fall har vi bara en publikation och vi skulle vilja städa upp. Därför väljer vi det första alternativet – Ja, inaktivera publicering på den här servern . Det kommer att ta bort alla publikationer tillsammans med prenumerationer om det inte redan har släppts samtidigt som distributören inaktiveras.

Vi kan använda den här guiden själv för att rensa upp allt om vår server bara har en replikering konfigurerad. Men om det finns flera replikeringar konfigurerade, släpper vi transaktionsreplikering i SQL Server genom att följa standardstegen som delas ovan.

Nu måste vi välja det första alternativet Ja, inaktivera publicering på den här servern och klicka på Nästa .

Markera båda alternativen i det nya fönstret:Inaktivera publicering och distribution och Skapa en skriptfil med steg...

För att generera skriptfilen måste du ange sökvägen där den ska lagras.

Klicka på Nästa och visa de alternativ som valts i guiden. Kontrollera och se till att du har valt allt korrekt.

Klicka på Slutför .

Att ta bort distributionsdatabasen internt använder sp_dropdistributor förfarande.

När distributören är inaktiverad kan vi se att distributionsdatabasen har tagits bort från systemdatabaser.

Rensa upp replikeringen helt om något av stegen ovan inte fungerar korrekt

Om prenumerationen eller publikationen avbryts via någon annan metod, hamnar vi i inkonsekvent borttagning av transaktionsreplikering i SQL Server och får många fel. För att rensa upp alla rester av prenumeration eller publicering kan vi använda systemproceduren sp_removedbreplication .

exec_spremovedbreplication

Utför denna procedur endast om det fortfarande finns några replikeringsproblem efter att ha provat alla andra metoder som nämns. Lagrad procedur sp_removedbreplication bör köras på Publisher-databasen eller från huvuddatabasen och med kommandot nedan efter att ha ersatt @dbname med namnet på Publisher-databasen.

exec_spremovedbreplication @dbname

Konfigurera replikering med hjälp av säkerhetskopieringsmetoden

Efter att ha tagit bort replikeringen helt, låt oss konfigurera om transaktionsreplikeringen i SQL Server med hjälp av säkerhetskopieringsmetoden. Det innefattar stegen nedan:

  • Konfigurera distributören
  • Skapa publikationen
  • Ändra publikationsegenskaperna så att det går att skapa prenumeration från den fullständiga eller differentiella säkerhetskopian.
  • Ta en fullständig säkerhetskopia av Publisher och återställ den som prenumerant.
  • Konfigurera prenumeration och börja initiera från Säkerhetskopiering.

Vi har redan utfört de flesta steg tidigare när vi konfigurerade replikeringen. Därför kommer vi inte att gå in i detalj om dessa steg här.

Konfigurera distributör och publicering

Se steg-för-steg-instruktionerna från föregående artikel om hur du konfigurerar både distribution och publicering med hjälp av guiden Skapa publicering. För att lära dig T-SQL-skripten som används av guiden för att skapa distribution och publicering, generera bara skripten till en fil under det sista steget i guiden och kör inte skripten genom att avmarkera alternativet "Skapa publikationen" som visas nedan .

Öppna nu skriptfilen som sparats i ett nytt frågefönster för att skapa distributören och publikationen med dessa skript:

Vänligen notera den andra kommenterade raden - den anger att alla lösenordsvärden som vi angav i guiden konverterades till NULL eller tom sträng av säkerhetsskäl. Ta en titt på den markerade raden med @password =tomma värden. Ersätt det med rätt lösenordsvärden, gör samma sak för andra avsnitt med lösenord och kör skriptet.

Skriptet kördes framgångsrikt. Vi kan se att exekveringen av skript har skapat distributionsdatabasen och alla systemtabeller inuti den. I slutet av meddelandet kan vi se att Log Reader Agent-jobbet har skapats och lanserats också.

Om det behövs kan du lagra resultaten för att lära dig om alla tabeller, vyer och kritiska procedurer i distributionsdatabasen. Denna information kommer att vara användbar för ytterligare felsökning.

Efter framgångsrik exekvering av skripten kan vi se distributionsdatabasen och publikationen som skapats framgångsrikt.

Ändra publikationsegenskaper för att möjliggöra skapande av prenumeration från fullständig eller differentiell säkerhetskopia

Om databasstorleken är mycket liten kommer tiden som krävs för att skicka den första ögonblicksbilden att bli snabbare.

Å andra sidan är det inte effektivt att skapa transaktionsreplikering i SQL Server med Snapshot i följande fall:

  1. Om databasen är enorm (300 GB eller mer). Tiden som krävs för att skicka den första ögonblicksbilden kommer att vara för lång.
  2. Om abonnenten finns på olika platser med låg nätverksbandbredd. Sedan kommer den första ögonblicksbildsprocessen att pågå i flera dagar.

Att göra en fullständig säkerhetskopia, överföra den via FTP eller fysiskt till den andra platsen, återställa den säkerhetskopian och initiera abonnenten kommer att gå betydligt snabbare jämfört med Snapshot-metoden.

För att göra det möjligt för publikationen att stödja initiering från säkerhetskopior måste vi ändra en av publikationsegenskaperna. Det kan göras antingen via SSMS eller T-SQL.

SSMS-metoden

Högerklicka på AdventureWorks_pub publicering och välj Egenskaper :

Klicka på Prenumerationsalternativ :

Ställ in True för Tillåt initiering från säkerhetskopior och klicka på OK . Detta gör att vi kan initiera från både Full och Differential Backup.

T-SQL-metoden

I T-SQL kan vi kalla proceduren sp_changepublication för att ändra den här egenskapen.

Skriptet för att ändra den här egenskapen är nedan:

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

Ta en fullständig säkerhetskopia av Publisher och återställ den som prenumerant

En nyckelfaktor för att lägga märke till att vi måste ta en fullständig säkerhetskopia efter att ha implementerat ovanstående publikationsegenskap. Om databasstorleken är enorm kan vi ta en fullständig säkerhetskopia och återställa den i RECOVERY-läge i Subscriber-instansen, och ta en differentiell säkerhetskopia efter att ha gjort ovanstående konfigurationsändring och återställa den i abonnentdatabasen med NORECOVERY-läget.

Konfigurera prenumeration och börja initiera från säkerhetskopia

Återigen, se steg-för-steg-instruktionerna. Vi måste skapa de nödvändiga skripten men kör dem inte. Saken är den att vi initierar prenumerationen från fullständig eller differentiell säkerhetskopiering använder endast T-SQL-skript. Jag skapade de skripten under prenumerationsskapandet förra gången. Se den öppna filen nedan.

Obs :Skripten för att skapa prenumeration måste köras från Publisher-databasen. Öppna därför frågefönstret som ansluter till Publisher-instansen.

Vi måste göra några ändringar för att prenumerationen ska initieras från säkerhetskopiering:

  • Ändra @sync_type värde från automatisk för att initiera med säkerhetskopiering
  • Ange rätt lösenord för de som ersätts med NULL eller tomma strängar. Eftersom jag har använt Agent Service-kontot på servern behöver jag inte ändra lösenord.
  • Lägg till parametrarna @backupdevicetype och @backupdevicename och ange sökvägen till fullständig eller differentiell säkerhetskopiering på Publisher Server (skriptet kommer att köras på den).

När det är klart kommer vårt skript att se ut så här:

Kör skriptet för att slutföra prenumerationskonfigurationen och vi kommer att få ett framgångsrikt slutförande av skriptet enligt nedan.

Som status indikerar skapades SQL Server Agent-jobbet för distributionsagenten och startade samtidigt som prenumerationen skapades.

Därför har vi skapat vår replikering framgångsrikt med hjälp av säkerhetskopieringsmetoden. Nu kan vi verifiera den tillgängliga prenumerationen.

Starta replikeringsmonitorn och högerklicka på prenumeranten. Det kommer att visa replikeringsstatus:

Som vi kan se har all data framgångsrikt initierats från säkerhetskopieringen utan att behöva köra Snapshot Agent-jobbet. Eftersom det inte finns några aktiva transaktioner på databasen får vi meddelandet "Inga replikerade transaktioner är tillgängliga" i Replication Monitor just nu.

Släpp artiklar från replikering

Efter att ha lärt oss hur man konfigurerar transaktionsreplikering i SQL Server via replikeringsguiden eller T-SQL-skript, kan vi nu kontrollera hur man släpper en artikel från replikeringen via båda dessa metoder.

Använda guiden

Högerklicka på AdventureWorks_pub Publikation> Egenskaper . Klicka på Artikel för att se listan över artiklar som ingår i replikering.

Som standard listar den databasobjekten i formatet OBJECT_NAME (SCHEMA_NAME). För teständamål, låt oss släppa Person.ContactType-tabellen från replikeringen.

För det, avmarkera helt enkelt rutan före ContactType (Person). SQL Server visar varnings- eller bekräftelsemeddelandet:

Som förklaras, om det finns några ögonblicksbilder tillgängliga för närvarande, kommer det att ogiltigförklara dessa ögonblicksbilder på grund av ändringarna i artiklarna.

Eftersom vi har initierat med säkerhetskopieringsmetoden och inte har använt ögonblicksbilder, kan vi säkert ignorera detta meddelande och klicka på Ja för att ta bort denna tabellartikel från replikeringen. Klicka på OK för att slutföra borttagningen av artikeln från replikeringen.

Nu är Person.ContactType tabellen tas bort från replikeringen. Eventuella ändringar som sker på utgivaren kommer inte att skickas till prenumerantdatabasen. Vi kan testa detta genom att INSERT/UPDATE/DELETE-poster på Person.ContactType bord.

Använder T-SQL

Ett annat sätt är att ta bort en artikel från replikeringen med hjälp av sp_droparticle förfarande.

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

Lägg till nya artiklar till replikering via Wizard eller TSQL-metoden

I vissa fall (som tabellunderhåll) kan vi behöva ta bort några artiklar och lägga till dem i replikeringen igen efter att underhållet är klart.

Vi har framgångsrikt lärt oss hur man tar bort artiklar från replikering. Låt oss överväga hur du lägger till nya artiklar till replikering. Vi lägger till Person.ContactType tabell som vi har tagit bort tidigare tillbaka till replikering.

Använda Wizard

För att lägga till en tabellartikel tillbaka till replikeringen, högerklicka på Publikation > Egenskaper > Artiklar . Den kommer att visa listan över artiklar som är tillgängliga i publikationen.

Vi kunde inte hitta Person.ContactType tabell – skärmen visar endast de tabeller som ingick i replikering. För att se alla tillgängliga tabeller i Publisher-databasen, avmarkera Visa endast valda artiklar i listan för att se alla tabeller.

Nu kan vi se Person.ContactType tabell listad.

Som vi diskuterade tidigare kommer alla bord utan primärnycklar att ha en röd cirkel ikon som indikerar att dessa tabeller inte kan inkluderas i replikeringen vare sig via Wizard eller T-SQL-metoden.

Kontrollera ContactType (Person) tabell för att lägga till den tillbaka till replikeringen och klicka på OK .

Tabellen läggs till i replikeringen igen. Vi måste dock utarbeta en metod för att skicka den första ögonblicksbilden för denna nyligen tillagda tabellartikel.

Om du har gått igenom artikeln hittills skulle du ha gissat rätt – kör bara Snapshot Agent Job för att skicka den första ögonblicksbilden för det här bordet.

Låt oss göra det nu – högerklicka på Publicering > visa Snapshot Agent status.

Klicka på Start för att skicka ögonblicksbilden för kvalificerade artiklar. Skicka dessa data till distributionsdatabasen och slutligen till abonnentdatabasen.

T-SQL-metoden

Vi kan utföra liknande åtgärder med sp_addarticle förfarande.

Skriptet nedan kommer att lägga till artiklar till replikeringen.

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

Vi har tidigare märkt hur replikering fungerar för en tabellartikel genom att använda 3 procedurer skapade i abonnentdatabasen för att hantera operationerna INSERT/UPDATE och DELETE.

Genom att använda T-SQL-metoden vet vi hur dessa procedurer refereras. Om det behövs kan vi byta namn på objekt, destinationstabellnamn eller standardprocedurer. För det kommer vi att göra ändringar i sp_addarticle förfarande.

OBS :Om vi ​​gör några ändringar av replikeringen bör vi dokumentera dem alla ordentligt. Annars kan det leda till en katastrof senare.

Lägg till en lagrad procedurartikel och studera skillnaden mellan en tabellartikel och en lagrad procedurartikel

För att lägga till en lagrad procedur till replikeringen måste vi gå till Artiklar sida och kontrollera den nödvändiga lagrade proceduren för att få den replikerad. Vi kan göra samma sak för Visningar , Indexerade vyer , eller Användardefinierade funktioner likaså.

För att lära dig mer om skillnaden mellan tabellartiklar vs vyer/ lagrad procedur/ indexerade vyer/användardefinierade funktioner kan vi lägga till en av varje artikel för varje kategori med hjälp av T-SQL:

Lägga till en ny artikel med lagrad procedur till replikering

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'

Lägga till en ny vyartikel i replikering

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

Lägga till en ny artikel med indexerad vy till replikering

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'

Lägga till en ny användardefinierad funktionsartikel i replikering

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'

Vi använder sp_addarticle procedur för att lägga till vilken typ av artikel som helst till replikeringen med nödvändiga indataparametrar och alternativ för att ändra den inkluderade @type parameter.

Vi kan också lägga till dessa artiklar i publikationen genom att högerklicka på Publikation > Egenskaper > Artiklar och lägga till dem i publikationen.

Tabellartikelegenskaper

Låt oss nu ändra artikelegenskaperna via Artiklar menyn i Publikation egenskaper:

Klicka på vår favorit Person.ContactType tabell> Artikelegenskaper . Det kommer att finnas ett alternativ att antingen ändra Artikelegenskaper endast för denna tabell eller alla tabeller som ingår i replikeringen. För ett test väljer vi Ange egenskaper för markerad tabellartikel för att visa egenskaperna för Person.ContactType bord.

Se alla tillgängliga alternativ för denna tabellartikel:

Kopiera objekt och inställningar till prenumerant och Utdragsleverans är de viktigaste inställningarna för replikeringen. Vi måste vara mycket försiktiga med att ändra någon av dessa parametrar.

Klicka på INSERT\UPPDATERA\DELETE leveransformatet för att få alternativen nedan.

  • Replicera inte INSERT\UPDATE\DELETE-satser – för att anpassa replikering så att de inte skickar specifika kommandon till abonnentdatabasen
  • INSERT\UPDATE\DELETE-sats – för att skicka INSERT\UPDATE\DELETE-satsen direkt till abonnenten istället för att rekonstruera data från transaktionsloggar
  • RING – Kör den inbyggda lagrade proceduren som visas ovan i sp_addarticle för att replikera data.
  • XCALL – Kör utökad lagrad procedur för att replikera ändringarna.

Artikelegenskaper för lagrad procedur

Klicka på Artikelegenskaper på någon av de lagrade procedurerna för att se Egenskaperna

En av nyckelegenskaperna för den lagrade proceduren är Replicate-alternativet – se de tillgängliga alternativen nedan:

  • Endast definition av lagrad procedur – replikerar endast de lagrade procedurens DDL-strukturändringar. Detta är standardalternativet för alla lagrade förfaranden.
  • Utförande av den lagrade proceduren – använd det här alternativet för att minska replikeringsbelastningen. Den utför alla ändringar via exekvering av lagrad procedur på abonnent utan att skicka individuella kommandon. Vi kan se om den här funktionen för att lösa prestandaproblem samtidigt som vi replikerar enorma dataförändringar i min nästa artikel.
  • Utförande i en serialiserad transaktion av SP – ett hybridalternativ för att välja Utförande av lagrad procedur endast om proceduren utförs inom en serialiserad transaktion. Annars skulle det replikeras som individuella DML-kommandon.

Visa artikelegenskaper

Klicka på Artikelegenskaper för alla vyer för att få Egenskaperna :

Artikelegenskaper för indexerad vy

Klicka på Artikelegenskaper för någon av de indexerade vyerna för Egenskaperna :

Användardefinierade funktionsartikelegenskaper

Klicka på Artikelegenskaper på valfri användardefinierad funktion för dess egenskaper

Egenskaper för vyer, indexerade vyer och användardefinierade funktioner är i stort sett desamma. Därför kan vi inte anpassa dem så mycket.

Slutsats

Tack för att du gick igenom ännu en kraftfull artikel relaterad till replikering. Idag har vi förtydligat detaljerna om att ta bort prenumeration, publicering, distributionsdatabasen och städa upp replikeringen helt även om vi stöter på några problem.

Vi har konfigurerat en replikering som nyligen initierats från säkerhetskopian och testat hur man lägger till nya artiklar i replikeringen eller tar bort dem från den. I det fortsatta arbetet med databaser och i synnerhet att hitta avvikelserna mellan dem kommer du att ha stor nytta av de professionella verktygen. dbForge Compare Bundle för SQL Server identifierar och analyserar alla sådana skillnader och rapporterar dem.

I vår nästa artikel kommer vi att undersöka ofta förekommande replikeringsproblem och hur man löser dem professionellt.


  1. Installera Azure Data Studio på Ubuntu 18.04

  2. NodeJS MySQL Dump

  3. MySQL Syntax felmeddelande Operand bör innehålla 1 kolumn(er)

  4. Hur man utför en UPSERT så att jag kan använda både nya och gamla värden i uppdateringsdelen