Replicatiedistributiedatabase instellen in AlwaysOn-beschikbaarheidsgroep
van toepassing op:SQL Server-
In dit artikel wordt uitgelegd hoe u een SQL Server-replicatiedistributiedatabase instelt in een AlwaysOn-beschikbaarheidsgroep (AG).
SQL Server 2017 CU6 en SQL Server 2016 SP2-CU3 introduceert ondersteuning voor replicatiedistributiedatabases in een AG via de volgende mechanismen:
- De distributiedatabase AG moet een listener hebben. Wanneer de uitgever de distributeur toevoegt, wordt de naam van de listener gebruikt als de naam van de distributeur.
- De replicatietaken worden aangemaakt waarbij de naam van de listener wordt gebruikt als de distributeurnaam. Momentopnamen voor replicatie, logboeklezer en distributieagenttaken (pushabonnementen) die op de distributieserver zijn gecreëerd, worden ook aangemaakt op alle secundaire replica's van de AG voor de distributiedatabase.
Notitie
Distributieagenttaken voor pull-abonnementen worden gemaakt op de abonneeserver en niet op de distributieserver.
- Een nieuwe taak bewaakt de status (primair of secundair in AG) van de distributiedatabases en schakelt de replicatietaken uit of schakelt deze in op basis van de status van de distributiedatabases.
Nadat een distributiedatabase in de beschikbaarheidsgroep (AG) is geconfigureerd volgens de stappen die hieronder worden beschreven, kunnen de configuratie voor replicatie en de uitvoeringstaken correct worden uitgevoerd, zowel voor als na failover van de distributiedatabase in de AG.
Ondersteunde scenario's
- De distributiedatabase configureren voor opname in een beschikbaarheidsgroep.
- Replicatie configureren, zoals publicaties en abonnementen, vóór en na een AG-failover.
- Replicatietaken zijn functioneel zowel vóór als na een failover.
- Replicatie bij distributeur en uitgever verwijderen wanneer distributiedatabase zich in AG bevindt.
- Knooppunten toevoegen aan of verwijderen uit bestaande distributiedatabase-AG.
- Een distributeur kan meerdere distributiedatabases hebben. Elke distributiedatabase kan zich in een eigen beschikbaarheidsgroep bevinden en kan zich niet in een AG bevinden. Meerdere distributiedatabases kunnen een beschikbaarheidsgroep delen.
- Publisher en distributeur moeten zich op afzonderlijke SQL Server-exemplaren bevinden.
- Als de listener voor de beschikbaarheidsgroep die als host fungeert voor de distributiedatabase is geconfigureerd voor het gebruik van een niet-standaardpoort, moet u een alias instellen voor de listener en de niet-standaardpoort.
Beperkingen of uitsluitingen
Local Distributor (waarbij de Publisher-server ook de Distributeur is) wordt niet ondersteund. Publisher en Distributor moeten afzonderlijke SQL Server-exemplaren zijn. Deze instanties kunnen worden gehost op dezelfde sets van knooppunten. Een lokale distributeur wordt om de volgende redenen niet ondersteund:
- Als de distributeur lokaal is geconfigureerd, kunt u de listener van de beschikbaarheidsgroep niet gebruiken om verkeer naar de distributeur te routeren, waardoor replicatieagents mislukken na een failover.
- Als er een lokale Distributeur is geconfigureerd en vervolgens de beschikbaarheidsgroep Distributeur een failover heeft naar de oorspronkelijke secundaire server, verandert de Publisher-verbinding met de distributeur van lokaal naar extern, waardoor de opgeslagen replicatieprocedures en agents mislukken.
Oracle Publisher wordt niet ondersteund.
Samenvoegreplicatie wordt niet ondersteund.
Transactionele replicatie met een abonnee die onmiddellijke of in de wachtrij geplaatste updates uitvoert, wordt niet ondersteund.
Peer-to-peerreplicatie wordt niet ondersteund vóór SQL Server 2019 (15.x) CU 17
Alle SQL Server 2017-exemplaren die als host fungeren voor distributiedatabasereplica's, moeten SQL Server 2017 CU 6 of hoger zijn.
Alle SQL Server 2016-exemplaren die als host fungeren voor distributiedatabasereplica's, moeten SQL Server 2016 SP2-CU3 of hoger zijn.
Alle SQL Server-exemplaren die als host fungeren voor distributiedatabasereplica's, moeten dezelfde versie hebben, behalve tijdens het beperkte tijdsbestek wanneer de upgrade wordt uitgevoerd.
De distributiedatabase moet zich in het volledige herstelmodel bevinden.
Voor herstel en om het inkorten van transactielogboeken mogelijk te maken, configureert u volledige back-ups en back-ups van transactielogboeken.
De distributiedatabase moet een listener hebben geconfigureerd.
Secundaire replica's in een distributiedatabase-AG kunnen synchroon of asynchroon zijn. De synchrone modus wordt aanbevolen en heeft de voorkeur.
Bidirectionele transactionele replicatie wordt niet ondersteund.
SSMS geeft de distributiedatabase niet weer als synchroniserend/gesynchroniseerd wanneer deze aan een beschikbaarheidsgroep wordt toegevoegd.
Notitie
Voordat u een van de opgeslagen replicatieprocedures uitvoert (bijvoorbeeld
sp_dropdistpublisher
,sp_dropdistributiondb
,sp_dropdistributor
,sp_adddistributiondb
,sp_adddistpublisher
) op secundaire replica, moet u ervoor zorgen dat de replica volledig is gesynchroniseerd.Alle secundaire replica's in een distributiedatabase-AG moeten leesbaar zijn. Als een secundaire replica niet leesbaar is, kunnen distributeureigenschappen in SQL Server Management Studio op de specifieke secundaire replica niet worden geopend, maar blijft de replicatie correct werken.
Alle knooppunten in de distributiedatabase-AG moeten hetzelfde domeinaccount gebruiken om SQL Server Agent uit te voeren en dit domeinaccount moet dezelfde bevoegdheid hebben op elk knooppunt.
Als er replicatieagents worden uitgevoerd onder een proxyaccount, moet het proxyaccount bestaan in elk knooppunt in de distributiedatabase-AG en dezelfde bevoegdheid hebben op elk knooppunt.
Breng wijzigingen aan in de eigenschappen van de distributeur- of distributiedatabase in alle replica's die deelnemen aan distributiedatabase AG.
Replicatieopdrachten wijzigen via opgeslagen msdb-procedures of SQL Server Management Studio in alle replica's die deelnemen aan de distributiedatabase AG.
Als u een aangepast profiel voor een agent gebruikt, moet dit handmatig worden gemaakt op alle secundaire replica's met behulp van de procedure
sp_add_agent_profile
. Het profiel moet dezelfde id hebben op alle replica's. Als het profiel niet bestaat op een secundaire replica, kunt u na een failover mogelijk fouten vanwege een schending van de primaire sleutel krijgen. Waarschijnlijk moet u het abonnement voor de publicatie opnieuw initialiseren om de fouten op te lossen.Het configureren van de distributeur op de uitgever moet worden uitgevoerd met scripts. De replicatiewizard kan niet worden gebruikt. Replicatie-wizards en eigenschapvensters voor andere doeleinden worden ondersteund.
Het configureren van de AG voor distributiedatabases kan alleen via scripts worden uitgevoerd.
Het instellen van distributiedatabases in een AG moet een nieuwe replicatieconfiguratie zijn. Het is niet ondersteund om een bestaande distributiedatabase over te schakelen naar een AG. Zodra een distributiedatabase uit een beschikbaarheidsgroep is gehaald, kan deze niet meer functioneren als een geldige distributiedatabase en moet deze worden verwijderd.
Configuratiearchitectuur
De volgende servernamen en -instellingen worden gebruikt in de voorbeelden in dit artikel.
- DIST1, DIST2, DIST3 zijn distributeurservers;
- PUB is uitgeverserver;
- Nadat distributiedatabase-AG is gevormd, is de naam van de listener DISTLISTENER;
- DIST1 is bedoeld als de eerste primaire replica van distributiedatabase-AG.
Distributeur, distributiedatabase en uitgever configureren
In dit voorbeeld configureert u een nieuwe distributeur en uitgever en plaatst u de distributiedatabase in een AG.
Distributeurswerkstroom
Configureer DIST1, DIST2, DIST3 als distributeur met
sp_adddistributor @@servername
. Geef het wachtwoord op voordistributor_admin
via de@password
. De@password
moet identiek zijn in DIST1, DIST2, DIST3.Maak de distributiedatabase op DIST1 met
sp_adddistributiondb
. De naam van de distributiedatabase isdistribution
. Wijzig het herstelmodel vandistribution
database van eenvoudig naar volledig.Maak een AG voor de
distribution
-database met replica's op DIST1, DIST2 en DIST3. Bij voorkeur zijn alle replica's synchroon. Configureer secundaire replica's om leesbaar te zijn of leesbewerkingen toe te staan. Op dit moment zijn de distributiedatabases de AG, DIST1 de primaire replica en zijn DIST2 en DIST3 secundaire replica's.Configureer een listener met de naam
DISTLISTENER
voor de beschikbaarheidsgroep.Voor herstel en om afkapping van transactielogboeken toe te staan, configureert u volledige back-ups en back-ups van transactielogboeken.
Voer op DIST2 en DIST3 het volgende uit:
EXEC sys.sp_adddistributiondb @database = 'distribution';
Als u
PUB
wilt toevoegen als uitgever op DIST1, voert u het volgende uit:EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
De waarde van
@working_directory
moet een netwerkpad zijn dat onafhankelijk is van DIST1, DIST2 en DIST3.Voer op VERD2 en VERD3, als de replica als secundair kan worden gelezen, het volgende uit:
EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
Voer een failover uit zodat, indien een replica niet kan worden gelezen als secundaire, deze de primaire replica wordt en draai de benodigde processen.
EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
De waarde van
@working_directory
moet gelijk zijn aan de vorige stap.
Publisher-werkstroom
Als u de distribution
database AG-listener wilt toevoegen als de distributeur, voert u op PUB het volgende uit:
EXEC sys.sp_adddistributor @distributor = 'DISTLISTENER', @password = '<distributor_admin password>' ;
De waarde van @password moet de waarde zijn die is opgegeven toen distributeurs werden geconfigureerd in de werkstroom van de distributeur.
Distributeur en uitgever verwijderen
In dit voorbeeld worden uitgever en distributeur verwijderd wanneer de distributiedatabase zich in AG bevindt.
Publisher-werkstroom
Verwijder op PUB alle abonnementen en publicaties voor deze uitgever en roep sp_dropdistributor
aan.
Distributeurswerkstroom
In dit voorbeeld is DIST1 de huidige primaire van distribution
database AG. DIST2 en DIST3 zijn secundaire replica's.
Voer op DIST2 en DIST3 het volgende uit:
EXEC sys.sp_dropdistpublisher @publisher = 'PUB', @no_checks = 1;
Voer op VERD1 het volgende uit:
EXEC sys.sp_dropdistpublisher @publisher = 'PUB';
Verwijder de AG.
Wijzig op DIST2 en DIST3 de
distribution
-database naar lees_schrijfmodus door deze te herstellen met hersteloptie.RESTORE DATABASE [distribution] WITH RECOVERY, KEEP_REPLICATION;
Als u
distribution
database wilt verwijderen en de map met momentopnamen wilt behouden, voert u het volgende uit:EXEC sys.sp_dropdistributiondb @database = 'distribution' , @former_ag_secondary = 1;
Met deze procedure worden alle slepende taken op deze replica verwijderd.
Om database
distribution
op DIST1 te verwijderen, voert u het volgende uit:EXEC sys.sp_dropdistributiondb @database = 'distribution';
Als er geen andere distributiedatabases in AG zijn, voert u
sp_dropdistributor
uit op DIST1, DIST2 en DIST3.
Een replica toevoegen aan distributiedatabase AG
In dit voorbeeld wordt een nieuwe distributeur toegevoegd aan een bestaande replicatieconfiguratie met distributiedatabase in AG. In dit voorbeeld bevindt een bestaande distributiedatabase zich in een beschikbaarheidsgroep. DIST1 en DIST2 zijn de distributeurs, distribution
is de distributiedatabase in AG en PUB is de uitgever. Voeg DIST3 toe als een replica in de AG.
Distributeurswerkstroom
DIST3 moet worden geconfigureerd als distributeur via
sp_adddistributor @@servername
. Het wachtwoord voordistributor_admin
moet worden opgegeven via @password parameter. Het wachtwoord moet hetzelfde zijn als wat is opgegeven voor DIST1 en DIST2.Voeg DIST3 toe aan de AG voor de huidige distributiedatabase.
Voer op VERD3 het volgende uit:
EXEC sys.sp_adddistributiondb @database = 'distribution';
Op DIST3, als de replica leesbaar is als secundair, voer het volgende uit:
EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
Als de replica niet als secundair kan worden gelezen, voert u een failover uit, zodat de replica de primaire replica wordt en voert u het volgende uit:
EXEC sys.sp_adddistpublisher @publisher = 'PUB', @distribution_db = 'distribution', @working_directory = '<network path>';
De waarde van
@working_directory
moet gelijk zijn aan wat is opgegeven voor VERD1 en VERD2.Op DIST3 moet u gekoppelde servers opnieuw maken voor de abonnees.
Een replica verwijderen uit distributiedatabase AG
In dit voorbeeld verwijdert men een distributeur uit een huidige beschikbaarheidsgroep van de distributiedatabase, terwijl de rest van de replica's in de distributiedatabase-beschikbaarheidsgroep niet worden beïnvloed. In dit voorbeeld bevindt een distributiedatabase zich in AG. DIST1, DIST2 en DIST3 zijn de distributeurs, distribution
is de distributiedatabase in AG, en PUB is de uitgever. Verwijder DIST3 uit de AG.
Distributeurswerkstroom
Zorg ervoor dat DIST3 een secundaire is voor de
distribution
-database-AG.Verwijder DIST3 uit de
distribution
database-AG.Wijzig in DIST3 de
distribution
-database naar lezen_en_schrijven modus door de database te herstellen met herstelmodus. Voer bijvoorbeeld de volgende opdracht uit:RESTORE DATABASE distribution WITH RECOVERY, KEEP_REPLICATION;
Voer de volgende opdracht uit om alle verweesde taken op DIST3 te verwijderen:
EXEC sys.sp_dropdistpublisher @publisher = 'PUB', @no_checks = 1;
Voer op VERD3 het volgende uit:
EXEC sys.sp_dropdistributiondb @database = 'distribution', @former_ag_secondary = 1;
Voer op VERD3 het commando uit:
EXEC sys.sp_dropdistributor;
Een uitgever verwijderen uit distributiedatabase AG
In dit voorbeeld wordt een uitgever verwijderd uit de huidige distributiedatabase-AG van een distributeur, terwijl de rest van de uitgevers die door deze distributiedatabase-AG worden bediend, niet worden beïnvloed. In dit voorbeeld heeft een bestaande configuratie een distributiedatabase in een beschikbaarheidsgroep. DIST1, DIST2 en DIST3 zijn de distributeurs, distribution
de distributiedatabase in AG is, en PUB1 en PUB2 zijn de uitgevers die worden bediend door distribution
database. In het voorbeeld wordt PUB1 van deze distributeurs verwijderd.
Publisher-werkstroom
Verwijder op PUB1 alle abonnementen en publicaties voor deze uitgever en roep sp_dropdistributor
aan.
Distributeur werkproces
DIST1 is de huidige primaire kopie van de distribution
AG van de database.
Voer op DIST2 en DIST3 het volgende uit:
EXEC sys.sp_dropdistpublisher @publisher = 'PUB1', @no_checks = 1;
Voer op VERD1 het commando uit:
EXEC sys.sp_dropdistpublisher @publisher = 'PUB1';
Op dit moment kunnen er verweesde taken zijn gerelateerd aan PUB1 op DIST2 of DIST3. Wanneer er een failover optreedt bij DIST2 en DIST3, worden zwevende taken gerelateerd aan alle publicaties van PUB1 verwijderd door de
Monitor and sync replication agent jobs
-taak.
Abonnement toevoegen
Dit voorbeeld gaat over het correct configureren van abonneegegevens tussen distributeurs. In het voorbeeld wordt een abonnee toegevoegd. VERD1 is de huidige primaire replica van de distributiedatabase in de AG, DIST2 en DIST3 zijn secundaire replica's van de distributiedatabase in de AG. De naam van de abonnee is SUB.
Publisher-werkstroom
Voeg in PUB een abonnement toe zoals u normaal gesproken zou doen aan abonnee SUB
.
Distributeurwerkstroom
Voeg op VERD2 en VERD3 een gekoppelde server toe voor 'SUB' als deze nog niet eerder is geregistreerd bij DIST2 of DIST3. Hieronder ziet u een voorbeeld van een TSQL voor het maken van een gekoppelde 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;
Een pull-abonnement toevoegen
Abonneewerkstroom
Als u een pull-abonnement wilt toevoegen voor een publicatie met de distributiedatabase in een beschikbaarheidsgroep, gebruikt u de naam van de beschikbaarheidsgroep-luisteraar in de parameter @distributor
van sp_addpullsubscription_agent
.
Voorbeeld van een T-SQL-distributiedatabase maken in AG
Met het volgende script wordt een distributiedatabase in een beschikbaarheidsgroep ingeschakeld.
--- 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;