Dela via


Konfigurera replikeringsdistributionsdatabasen i AlwaysOn-tillgänglighetsgruppen

gäller för:SQL Server

Den här artikeln beskriver hur du konfigurerar en SQL Server-replikeringsdistributionsdatabas i en AlwaysOn-tillgänglighetsgrupp (AG).

SQL Server 2017 CU6 och SQL Server 2016 SP2-CU3 introducerar stöd för replikeringsdistributionsdatabas i en tillgänglighetsgrupp genom följande mekanismer:

  • Distribueringsdatabasen AG måste ha en lyssnare. När utgivaren lägger till distributören använder den lyssnarnamnet som distributörsnamn.
  • Replikeringsjobben skapas med lyssnarnamnet som distributörsnamn. Replikationsögonblick, loggläsarjobb och distributionsagentjobb (push-prenumeration) som skapas på distributionsservern skapas även på alla sekundära repliker i tillgänglighetsgruppen för distributionsdatabasen.

Note

Distributionsagentjobb för pull-prenumerationer skapas på prenumerantservern och inte på distributionsservern.

  • Ett nytt jobb övervakar tillståndet (primärt eller sekundärt i tillgänglighetsgruppen) för distributionsdatabaserna och inaktiverar eller aktiverar replikeringsjobben baserat på distributionsdatabasernas tillstånd.

När en distributionsdatabas i AG har konfigurerats enligt stegen nedan kan replikeringskonfigurationen och körningsjobben köras korrekt före och efter failover av distributionsdatabasen.

Scenarier som stöds

  • Konfigurera distributionsdatabas som ska ingå i en tillgänglighetsgrupp.
  • Konfigurera replikering, såsom publikationer och prenumerationer, före och efter AG-redundansväxling.
  • Replikeringsjobb fungerar före och efter failover.
  • Tar bort replikering hos distributör och utgivare när distributionsdatabasen finns i en tillgänglighetsgrupp.
  • Lägga till eller ta bort noder i en befintlig tillgänglighetsgrupp för en distributionsdatabas.
  • En distributör kan ha flera distributionsdatabaser. Varje distributionsdatabas kan finnas i en egen tillgänglighetsgrupp och kan också vara utanför en tillgänglighetsgrupp. Flera distributionsdatabaser kan dela en tillgänglighetsgrupp.
  • Utgivare och distributör måste finnas på separata SQL Server-instanser.
  • Om lyssnaren för tillgänglighetsgruppen som är värd för distributionsdatabasen är konfigurerad att använda en port som inte är standard måste du konfigurera ett alias för lyssnaren och den port som inte är standard.

Begränsningar eller undantag

  • Lokal distributör (där publisher-servern också är distributör) stöds inte. Utgivaren och distributören måste vara separata SQL Server-instanser. Dessa instanser kan finnas på samma uppsättningar noder. En lokal distributör stöds inte av följande skäl:

    • Om distributören har konfigurerats lokalt kan du inte använda tillgänglighetsgruppslyssnaren för att dirigera trafik till distributören, vilket leder till att replikeringsagenter misslyckas efter omkopplingen.
    • Om en lokal distributör har konfigurerats och sedan tillgänglighetsgruppen för distributören flyttas över till den ursprungliga sekundära, ändras publisher-anslutningen till distributören från lokal till fjärransluten, vilket gör att replikeringslagrade procedurer och agenter misslyckas.
  • Oracle Publisher stöds inte.

  • Sammanslagningsreplikering stöds inte.

  • Transaktionsreplikering med omedelbar eller köad uppdateringsprenumerant stöds inte.

  • Peer-to-peer-replikering stöds inte före SQL Server 2019 (15.x) CU 17

  • Alla SQL Server 2017-instanser som är värdar för distributionsdatabasrepliker måste vara SQL Server 2017 CU 6 eller senare.

  • Alla SQL Server 2016-instanser som är värdar för distributionsdatabasrepliker måste vara SQL Server 2016 SP2-CU3 eller senare.

  • Alla SQL Server-instanser som är värdar för distributionsdatabasrepliker måste vara samma version, förutom under den snäva tidsramen när uppgraderingen äger rum.

  • Distributionsdatabasen måste finnas i den fullständiga återställningsmodellen.

  • För återställning och för att tillåta trunkering av transaktionsloggar konfigurerar du fullständiga säkerhetskopior och säkerhetskopieringar av transaktionsloggar.

  • Distributionsdatabasen AG måste ha en lyssnare konfigurerad.

  • Sekundära repliker i en tillgänglighetsgrupp för distributionsdatabasen kan vara synkrona eller asynkrona. Synkront läge rekommenderas och föredras.

  • Dubbelriktad transaktionsreplikering stöds inte.

  • SSMS visar inte distributionsdatabasen som synkroniseras/synkroniserad när den läggs till i en tillgänglighetsgrupp.

    Obs

    Innan du kör någon av de lagrade procedurerna för replikering (till exempel - sp_dropdistpublisher, sp_dropdistributiondb, sp_dropdistributor, sp_adddistributiondb, sp_adddistpublisher) på den sekundära repliken kontrollerar du att repliken är helt synkroniserad.

  • Alla sekundära repliker i en distributionsdatabas-AG (tillgänglighetsgrupp) bör vara läsbara. Om en sekundär replik inte kan läsas går det inte att komma åt distributörsegenskaperna i SQL Server Management Studio på den specifika sekundära repliken, men replikeringen fortsätter att fungera korrekt.

  • Alla noder i distributionsdatabasens AG måste använda samma domänkonto för att köra SQL Server Agent, och det måste ha samma behörighet på varje nod.

  • Om några replikeringsagenter körs under ett proxykonto måste proxykontot finnas i varje nod i distributionsdatabasens tillgänglighetsgrupp och ha samma behörighet på varje nod.

  • Gör ändringar i distributörens eller distributionsdatabasens egenskaper i alla repliker som är med i distributionsdatabasens AG.

  • Gör replikeringsjobbändringar via msdb-lagrade procedurer eller SQL Server Management Studio i alla repliker som deltar i distributionsdatabasens tillgänglighetsgrupp.

  • Om du använder en anpassad profil för en agent måste den skapas manuellt på alla sekundära repliker med hjälp av proceduren sp_add_agent_profile. Profilen måste ha samma ID på alla repliker. Om profilen inte finns på en sekundär replik kan du få fel på grund av primärnyckelsbrott efter överflyttningen. Du måste förmodligen initiera om prenumerationen för publikationen för att lösa felen.

  • Konfiguration av distributör på utgivaren måste göras med skript. Replikeringsguiden kan inte användas. Assistenter för replikering och egenskapsblad för andra ändamål stöds.

  • Det går bara att konfigurera tillgänglighetsgruppen för distributionsdatabaser via skript.

  • Konfigurationen av distributionsdatabaser i en tillgänglighetsgrupp måste vara en ny replikeringskonfiguration. Det stöds inte att växla en befintlig distributionsdatabas till en tillgänglighetsgrupp (AG). När en distributionsdatabas har tagits ur en tillgänglighetsgrupp (AG) kan den inte längre fungera som en giltig distributionsdatabas och bör tas bort.

Konfigurationsarkitektur

Följande servernamn och inställningar används i exemplen i den här artikeln.

  • DIST1, DIST2, DIST3 är distributörsservrar;
  • PUB är utgivarserver;
  • Efter att tillgänglighetsgruppen för distributionsdatabasen har skapats är lyssnarnamnet DISTLISTENER.
  • DIST1 är avsedd att vara den första primära repliken av distributionsdatabasens tillgänglighetsgrupp.

Konfigurera distributör, distributionsdatabas och utgivare

Det här exemplet konfigurerar en ny distributör och utgivare och placerar distributionsdatabasen i en tillgänglighetsgrupp.

Arbetsflöde för distributörer

  1. Konfigurera DIST1, DIST2, DIST3 som distributör med sp_adddistributor @@servername. Ange lösenordet för distributor_admin via @password. @password ska vara identiska mellan DIST1, DIST2, DIST3.

  2. Skapa distributionsdatabasen på DIST1 med sp_adddistributiondb. Namnet på distributionsdatabasen är distribution. Ändra återställningsmodellen för distribution databas från enkel till fullständig.

  3. Skapa en tillgänglighetsgrupp för distribution databas, med repliker på DIST1, DIST2 och DIST3. Helst är alla repliker synkrona. Konfigurera sekundära repliker så att de kan läsas eller tillåta läsning. För närvarande är distributionsdatabaserna tillgänglighetsgruppen, DIST1 är den primära repliken och DIST2 och DIST3 är sekundära repliker.

  4. Konfigurera en lyssnare med namnet DISTLISTENER för AG.

  5. För återställning och för att tillåta trunkering av transaktionsloggar konfigurerar du fullständiga säkerhetskopior och säkerhetskopieringar av transaktionsloggar.

  6. På DIST2 och DIST3 kör du:

    EXEC sys.sp_adddistributiondb @database = 'distribution';
    
  7. Om du vill lägga till PUB som utgivare på DIST1 kör du:

    EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
    

    Värdet för @working_directory ska vara en nätverkssökväg oberoende av DIST1, DIST2 och DIST3.

  8. Om repliken kan läsas som sekundär på DIST2 och DIST3 kör du:

    EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
    

    Om en replik inte kan läsas som sekundär, utför en failover så att repliken blir den primära och kör

    EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
    

    Värdet för @working_directory ska vara detsamma som i föregående steg.

Publisher-arbetsflöde

Om du vill lägga till distribution databas AG-lyssnaren som distributör kör du på PUB:

EXEC sys.sp_adddistributor @distributor = 'DISTLISTENER', @password = '<distributor_admin password>' ;

Värdet för @password bör vara det som angavs när distributörerna konfigurerades i distributörens arbetsflöde.

Ta bort distributör och utgivare

Det här exemplet tar bort utgivare och distributör när distributionsdatabasen finns i AG.

Publisher-arbetsflöde

På PUB släpper du alla prenumerationer och publikationer för den här utgivaren och anropar sedan sp_dropdistributor.

Arbetsflöde för distributörer

I det här exemplet är DIST1 den aktuella primären för distribution databastillgänglighetsgruppen. DIST2 och DIST3 är sekundära repliker.

  1. På DIST2 och DIST3 kör du:

    EXEC sys.sp_dropdistpublisher @publisher = 'PUB', @no_checks = 1;
    
  2. På DIST1 kör du:

    EXEC sys.sp_dropdistpublisher @publisher = 'PUB';
    
  3. Ta bort AG.

  4. På DIST2 och DIST3 ändrar du distribution-databasen till read_write läge genom att återställa databasen med återställning.

    RESTORE DATABASE [distribution] WITH RECOVERY, KEEP_REPLICATION;
    
  5. Om du vill ta bort distribution databas och behålla katalogen för ögonblicksbilder kör du:

    EXEC sys.sp_dropdistributiondb @database = 'distribution' , @former_ag_secondary = 1;
    

Den här proceduren tar bort alla dinglande jobb på den här repliken.

  1. För att ta bort databasen distribution på DIST1, kör du

    EXEC sys.sp_dropdistributiondb @database = 'distribution';
    
  2. Om det inte finns några andra distributionsdatabaser i tillgänglighetsgruppen (AG) kör du sp_dropdistributor på DIST1, DIST2 och DIST3.

Lägg till en kopia i distributionsdatabasens tillgänglighetsgrupp (AG)

Det här exemplet lägger till en ny distributör i en befintlig replikeringskonfiguration med distributionsdatabasen i en tillgänglighetsgrupp (AG). I det här exemplet finns en befintlig distributionsdatabas i en tillgänglighetsgrupp (AG). DIST1 och DIST2 är distributörerna, distribution är distributionsdatabasen i AG och PUB är utgivaren. Lägg till DIST3 som en replik i tillgänglighetsgruppen.

Arbetsflöde för distributörer

  1. DIST3 ska konfigureras som distributör via sp_adddistributor @@servername. Lösenordet för distributor_admin ska anges via @password parameter. Lösenordet ska vara detsamma som det som angavs för DIST1 och DIST2.

  2. Lägg till DIST3 i AG för den aktuella distributionsdatabasen.

  3. Kör kommandot på DIST3:

    EXEC sys.sp_adddistributiondb @database = 'distribution';
    
  4. Om repliken kan läsas som sekundär på DIST3 kör du:

    EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
    

    Om kopian inte kan läsas som sekundär, utför en failover så att kopian blir den primära och kör:

    EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
    

    Värdet för @working_directory ska vara detsamma som det som angavs för DIST1 och DIST2.

  5. På DIST3 måste du återskapa länkade servrar till prenumeranterna.

Ta bort en replik från distributionsdatabasens tillgänglighetsgrupp

I det här exemplet tas en distributör bort från en aktuell tillgänglighetsgrupp för distributionsdatabasen medan resten av replikerna i distributionsdatabasens tillgänglighetsgrupp inte påverkas. I det här exemplet finns en distributionsdatabas i tillgänglighetsgruppen. DIST1, DIST2 och DIST3 är distributörer, distribution är distributionsdatabasen i AG och PUB är utgivare. Ta bort DIST3 från AG.

Arbetsflöde för distributörer

  1. Kontrollera att DIST3 är en sekundär för distribution databastillgänglighetsgruppen.

  2. Ta bort DIST3 från distribution databasens AG.

  3. På DIST3 ändrar du distribution-databasen till skrivbart läge genom att återställa databasen. Kör till exempel följande kommando:

    RESTORE DATABASE distribution WITH RECOVERY, KEEP_REPLICATION;
    
  4. För att ta bort alla föräldralösa jobb på DIST3, kör:

    EXEC sys.sp_dropdistpublisher @publisher = 'PUB', @no_checks = 1;
    
  5. Kör på DIST3:

    EXEC sys.sp_dropdistributiondb @database = 'distribution', @former_ag_secondary = 1;
    
  6. Kör kommandot på DIST3:

    EXEC sys.sp_dropdistributor;
    

Ta bort en utgivare från distributionsdatabas AG

I det här exemplet tas en utgivare bort från en distributörs aktuella distributionsdatabas AG medan resten av utgivarna som betjänas av denna distributionsdatabas AG inte påverkas. I det här exemplet finns en befintlig konfiguration där distributionsdatabasen ingår i en tillgänglighetsgrupp. DIST1, DIST2 och DIST3 är distributörer, distribution är distributionsdatabasen i AG, och PUB1 och PUB2 är utgivare som betjänas av distribution databasen. Exemplet tar bort PUB1 från dessa distributörer.

Publisher-arbetsflöde

På PUB1 släpper du alla prenumerationer och publikationer för den här utgivaren och anropar sedan sp_dropdistributor.

Arbetsflöde för distributör

DIST1 är den aktuella primärnoden för distribution databasens tillgänglighetsgrupp.

  1. På DIST2 och DIST3 kör du:

    EXEC sys.sp_dropdistpublisher @publisher = 'PUB1',  @no_checks = 1;
    
  2. På DIST1 kör du:

    EXEC sys.sp_dropdistpublisher @publisher = 'PUB1';
    
  3. Nu kan det finnas överblivna jobb relaterade till PUB1 på DIST2 eller DIST3. När en redundansväxling sker till DIST2 och DIST3 tas överblivna jobb relaterade till alla publikationer i PUB1 bort av Monitor and sync replication agent jobs jobb.

Lägg till prenumeration

Det här exemplet handlar om att korrekt konfigurera prenumerantinformation mellan distributörer. Exemplet lägger till en prenumerant. DIST1 är den aktuella primära repliken av distributionsdatabasen i tillgänglighetsgruppen, DIST2 och DIST3 är sekundära repliker av distributionsdatabasen i tillgänglighetsgruppen. Prenumerantnamnet är SUB.

Publisher-arbetsflöde

På PUB lägger du till en prenumeration som du normalt skulle göra med prenumeranten SUB.

Arbetsflöde för distributör

På DIST2 och DIST3 lägger du till en länkad server för "SUB" om den inte tidigare har registrerats med DIST2 eller DIST3. Nedan visas ett exempel på TSQL för att skapa länkad server –

EXEC master.dbo.sp_addlinkedserver@server =N'SUB', @srvproduct=N'SQL Server';
/* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin@rmtsrvname = N'SUB', @useself = N'True',@locallogin = NULL,@rmtuser =N ULL,@rmtpassword = NULL;

Lägga till en pull-prenumeration

Arbetsflöde för prenumerant

För att lägga till en pull-prenumeration för en publikation där distributionsdatabasen finns i en tillgänglighetsgrupp, använd AG-lyssnarnamnet i @distributor-parametern för sp_addpullsubscription_agent.

Exempel på T-SQL Skapa distributionsdatabas i tillgänglighetsgruppen

Följande skript aktiverar en distributionsdatabas i en tillgänglighetsgrupp.

--- WorkFlow to Enable Distribution Database In AG.

-- SECTION 1 ---- CONFIGURE THE DISTRIBUTOR SERVERS

-- Step1 - Configure the Distribution DB nodes (AG Replicas) to act as a distributor
:Connect SQLNode1
EXEC [sys].[sp_adddistributor]
    @distributor = @@SERVERNAME,
    @password = 'Pass@word1';
GO
:Connect SQLNode2
EXEC [sys].[sp_adddistributor]
    @distributor = @@SERVERNAME,
    @password = 'Pass@word1';
GO

-- Step2 - Configure the Distribution Database
:Connect SQLNode1
USE [master];
EXEC [sys].[sp_adddistributiondb]
    @database = 'DistributionDB',
    @security_mode = 1;
GO
ALTER DATABASE [DistributionDB] SET RECOVERY FULL;
GO
BACKUP DATABASE [DistributionDB] TO DISK = 'NUL';
GO
-- Step 3 - Create AG for the Distribution DB.
:Connect SQLNode1
USE [master];
GO
CREATE ENDPOINT [Hadr_endpoint]
    STATE = STARTED
    AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
    FOR DATA_MIRRORING (
        ROLE = ALL,
        AUTHENTICATION = WINDOWS NEGOTIATE,
        ENCRYPTION = REQUIRED ALGORITHM AES
    );
GO

:Connect SQLNode2
USE [master];
GO
CREATE ENDPOINT [Hadr_endpoint]
    STATE = STARTED
    AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
    FOR DATA_MIRRORING (
        ROLE = ALL,
        AUTHENTICATION = WINDOWS NEGOTIATE,
        ENCRYPTION = REQUIRED ALGORITHM AES
    );
GO

:Connect SQLNode1
-- Create the Availability Group
CREATE AVAILABILITY GROUP [DistributionDB_AG]
FOR DATABASE [DistributionDB]
REPLICA ON
N'SQLNode1' WITH (ENDPOINT_URL = N'TCP://SQLNode1.contoso.com:5022', 
	 FAILOVER_MODE = AUTOMATIC, 
	 AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, 
	 BACKUP_PRIORITY = 50, 
	 SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL), 
	 SEEDING_MODE = AUTOMATIC),
N'SQLNode2' WITH (ENDPOINT_URL = N'TCP://SQLNode2.contoso.com:5022', 
	 FAILOVER_MODE = AUTOMATIC, 
	 AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, 
	 BACKUP_PRIORITY = 50, 
	 SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL), 
	 SEEDING_MODE = AUTOMATIC);
GO


:Connect SQLNode2
ALTER AVAILABILITY GROUP [DistributionDB_AG] JOIN;
GO  
ALTER AVAILABILITY GROUP [DistributionDB_AG] GRANT CREATE ANY DATABASE;
GO

--STEP4 - Create the Listener for the Availability Group. This is very important.
:Connect SQLNode1

USE [master]
GO
ALTER AVAILABILITY GROUP [DistributionDB_AG]
ADD LISTENER N'DistributionDBList' (
WITH IP
((N'10.0.0.8', N'255.255.255.0')) , PORT=1500);
GO

-- STEP 5 - Enable SQLNode2 also as a Distributor
:Connect SQLNode2
EXEC sys.sp_adddistributiondb @database = 'DistributionDB', @security_mode = 1;
GO

--STEP 6 - On all Distributor Nodes Configure the Publisher Details 
:Connect SQLNode1
EXEC sys.sp_adddistpublisher @publisher = 'SQLNode4', @distribution_db = 'DistributionDB', 
	@working_directory = '\\sqlfileshare\Dist_Work_Directory\';
GO
:Connect SQLNode2
EXEC sys.sp_adddistpublisher @publisher = 'SQLNode4', @distribution_db = 'DistributionDB', 
	@working_directory = '\\sqlfileshare\Dist_Work_Directory\';
GO

-- SECTION 2 ---- CONFIGURE THE PUBLISHER SERVER
:Connect SQLNode4
EXEC sys.sp_adddistributor @distributor = 'DistributionDBList', -- Listener for the Distribution DB.	
	@password = 'Pass@word1';
GO

-- SECTION 3 ---- CONFIGURE THE SUBSCRIBERS 
-- On Publisher, create the publication as one would normally do.
-- On the Secondary replicas of the Distribution DB, add the Subscriber as a linked server.
:Connect SQLNode2
EXEC master.dbo.sp_addlinkedserver @server = N'SQLNODE5', @srvproduct = N'SQL Server';
/* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'SQLNODE5', @useself = N'True',
	@locallogin = NULL,@rmtuser = NULL,@rmtpassword = NULL;