Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ab SQL Server 2019 (15.x) CU 13 kann eine Datenbank, die zu einer SQL Server Always On-Verfügbarkeitsgruppe gehört, als Peer an einer Peer-to-Peer-Topologie für die Transaktionsreplikation teilnehmen. In diesem Artikel wird das Konfigurieren dieses Szenarios erläutert.
Die Skripts in diesem Beispiel verwenden in T-SQL gespeicherte Prozeduren.
Rollen und Namen
In diesem Abschnitt werden die Rollen und Namen der verschiedenen Elemente beschrieben, die an der Replikationstopologie für diesen Artikel teilnehmen.
Peer1
- Node1: Replikat 1 in der Verfügbarkeitsgruppe MyAG
- Node2: Replikat 2 in der Verfügbarkeitsgruppe MyAG.
- MyAG: Der Name der Verfügbarkeitsgruppe, die Sie auf Node1 und Node2 erstellen.
- MyAGListenerName: Name des Verfügbarkeitsgruppenlisteners
- Dist1: Der Name der Remoteverteilerinstanz
- MyDBName: Name der Datenbank
- P2P_MyDBName: Veröffentlichungsname
Peer2
- Node3: Ein eigenständiger Server, der eine Standardinstanz von SQL Server hostet.
- Dist2: Der Name der Remoteverteilerinstanz
- MyDBName: Name der Datenbank
- P2P_MyDBName: Veröffentlichungsname
Voraussetzungen
Zwei Instanzen von SQL Server auf separaten physischen oder virtuellen Servern, um die Verfügbarkeitsgruppen zu hosten. Die Verfügbarkeitsgruppe enthält eine Peer-Datenbank.
Eine Instanz von SQL Server hostet eine andere Peerdatenbank
Zwei Instanzen von SQL Server, um die Verteilerdatenbanken zu hosten
Alle Serverinstanzen erfordern eine unterstützte Edition: Enterprise Edition oder Developer Edition.
Für alle Serverinstanzen ist eine unterstützte Version erforderlich – SQL Server 2019 (15.x) CU13 oder höher.
Ausreichende Netzwerkkonnektivität und Bandbreite zwischen allen Instanzen.
Installieren Sie die SQL Server-Replikation auf allen Instanzen von SQL Server.
Führen Sie die folgende Abfrage aus, um zu sehen, ob die Replikation auf einer beliebigen Instanz installiert ist:
USE master; GO DECLARE @installed int; EXEC @installed = sys.sp_MS_replication_installed; SELECT @installed;Hinweis
Um einen einzelnen Ausfallpunkt für die Verteilungsdatenbank zu vermeiden, verwenden Sie für jeden Peer einen entfernten Verteiler.
Für eine Demonstrations- oder Testumgebung können Sie die Verteilungsdatenbanken auf einer einzigen Instanz konfigurieren.
Konfigurieren des Verteilers und des Remoteverlegers (Peer1)
Führen Sie
sp_adddistributoraus, um die Verteilung auf Dist1 zu konfigurieren. Verwenden Sie@password =, um ein Kennwort anzugeben, das der Remoteverleger zum Herstellen einer Verbindung mit dem Verteiler verwendet. Verwenden Sie dieses Kennwort bei jedem Remoteverleger, wenn Sie den Remoteverteiler konfigurieren.USE master; GO EXEC sys.sp_adddistributor @distributor = 'Dist1', @password = '<Strong password for distributor>';Erstellen Sie die Verteilungsdatenbank beim Verteiler.
USE master; GO EXEC sys.sp_adddistributiondb @database = 'distribution', @security_mode = 1;Konfigurieren Sie Node1 und Node2 als Remote-Publisher.
Der
@security_modebestimmt, wie Replikationsagenten eine Verbindung zum aktuellen primären Server herstellen.-
1= Windows-Authentifizierung -
0= SQL Server-Authentifizierung Erfordert@loginund@password. Der ausgewählte Anmeldename und das Kennwort müssen bei jedem sekundären Replikat gültig sein.
Hinweis
Wenn geänderte Replikations-Agents auf einem anderen Computer als dem Verteiler ausgeführt werden, dann ist bei Verwendung der Windows-Authentifizierung zum Herstellen einer Verbindung zum primären Replikat eine Kerberos-Authentifizierung für die Kommunikation zwischen den Replikathostcomputern erforderlich. Verwenden Sie einen SQL Server-Login für die Verbindung zum aktuellen primären Konto, das erfordert keine Kerberos-Authentifizierung.
USE master; GO EXEC sys.sp_adddistpublisher @publisher = 'Node1', @distribution_db = 'distribution', @working_directory = '\\MyReplShare\WorkingDir', @security_mode = 1 USE master; GO EXEC sys.sp_adddistpublisher @publisher = 'Node2', @distribution_db = 'distribution', @working_directory = '\\MyReplShare\WorkingDir', @security_mode = 1-
Konfigurieren des Verlegers beim ursprünglichen Verleger (Node1)
Konfigurieren Sie den ursprünglichen Verleger für die Remoteverteilung (Node1). Geben Sie den Wert für
@passwordan, der verwendet wurde, alssp_adddistributorbeim Verteiler ausgeführt wurde, um die Verteilung einzurichten.exec sys.sp_adddistributor @distributor = 'Dist1', @password = '<Password used when running sp_adddistributor on distributor server>'Aktivieren Sie die Datenbank für die Replikation.
USE master; GO EXEC sys.sp_replicationdboption @dbname = 'MyDBName', @optname = 'publish', @value = 'true';
Konfigurieren des sekundären Replikathosts als Replikationsverleger (Node2)
Konfigurieren Sie die Verteilung auf jedem sekundären Replikathost. Gib denselben Wert für @password an wie den Wert, den du beim Distributor sp_adddistributor verwendest, um die Distribution einzurichten.
EXEC sys.sp_adddistributor
@distributor = 'Dist1',
@password = '<Password used when running sp_adddistributor on distributor server>'
Integrieren Sie die Datenbank in die Verfügbarkeitsgruppe, und erstellen Sie den Listener (Peer1).
Erstellen Sie auf dem vorgesehenen primären Replikat die Verfügbarkeitsgruppe mit der Datenbank als Mitgliedsdatenbank.
Erstellen Sie für die Verfügbarkeitsgruppe einen DNS-Listener. Der Replikations-Agent stellt mithilfe des Listeners eine Verbindung mit dem aktuellen primären Replikat her. Im folgenden Beispiel wird ein Listener namens
MyAGListernameerstellt:ALTER AVAILABILITY GROUP 'MyAG' ADD LISTENER 'MyAGListenerName' (WITH IP (('<ip address>', '<subnet mask>') [, PORT = <listener_port>]));Hinweis
Im vorherigen Skript sind Informationen in eckigen Klammern (
[ ... ]) optional. Verwenden Sie es, um einen Nicht-Standardwert für den TCP-Port anzugeben. Füge die Klammern nicht hinzu.
Umleiten des ursprünglichen Verlegers zum Namen des Verfügbarkeitsgruppenlisteners (Peer1)
Leiten Sie auf dem Distributor für Peer1 den ursprünglichen Publisher auf den Namen des AG-Listeners um.
USE distribution;
GO
EXEC sys.sp_redirect_publisher
@original_publisher = 'Node1',
@publisher_db = 'MyDBName',
@redirected_publisher = 'MyAGListenerName,<port>';
Hinweis
Im vorherigen Skript ,<port> ist optional. Es ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest. Verwenden Sie nicht die spitzen Klammern <>.
Peer-to-Peer-Veröffentlichung (Peer1) auf dem ursprünglichen Publisher erstellen - Node1
Das folgende Skript erstellt die Veröffentlichung für Peer1.
exec master..sp_replicationdboption @dbname= 'MyDBName'
,@optname= 'publish'
,@value= 'true'
GO
DECLARE @publisher_security_mode smallint = 1
EXEC [MyDBName].dbo.sp_addlogreader_agent @publisher_security_mode = @publisher_security_mode
GO
DECLARE @allow_dts nvarchar(5) = N'false'
DECLARE @allow_pull nvarchar(5) = N'true'
DECLARE @allow_push nvarchar(5) = N'true'
DECLARE @description nvarchar(255) = N'Peer-to-Peer publication of database MyDBName from Node1'
DECLARE @enabled_for_p2p nvarchar(5) = N'true'
DECLARE @independent_agent nvarchar(5) = N'true'
DECLARE @p2p_conflictdetection nvarchar(5) = N'true'
DECLARE @p2p_originator_id int = 100
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @repl_freq nvarchar(10) = N'continuous'
DECLARE @restricted nvarchar(10) = N'false'
DECLARE @status nvarchar(8) = N'active'
DECLARE @sync_method nvarchar(40) = N'NATIVE'
EXEC [MyDBName].dbo.sp_addpublication @allow_dts = @allow_dts, @allow_pull = @allow_pull, @allow_push = @allow_push, @description = @description, @enabled_for_p2p = @enabled_for_p2p,
@independent_agent = @independent_agent, @p2p_conflictdetection = @p2p_conflictdetection, @p2p_originator_id = @p2p_originator_id, @publication = @publication, @repl_freq = @repl_freq, @restricted = @restricted,
@status = @status, @sync_method = @sync_method
go
DECLARE @article nvarchar(256) = N'tbl0'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl0'
DECLARE @destination_table nvarchar(256) = N'tbl0'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl0'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object, @source_owner = @source_owner, @type = @type
go
DECLARE @article nvarchar(256) = N'tbl1'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl1'
DECLARE @destination_table nvarchar(256) = N'tbl1'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl1'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object,
@source_owner = @source_owner, @type = @type
GO
Peer-to-Peer-Veröffentlichung mit der Verfügbarkeitsgruppe (Peer1) kompatibel machen
Führen Sie auf dem ursprünglichen Verleger (Node1) das folgende Skript aus, um die Veröffentlichung mit der Verfügbarkeitsgruppe kompatibel zu machen:
USE MyDBName
GO
DECLARE @publication sysname = N'P2P_MyDBName'
DECLARE @property sysname = N'redirected_publisher'
DECLARE @value sysname = N'MyAGListenerName,<port>'
EXEC MyDBName..sp_changepublication @publication = @publication, @property = @property, @value = @value
GO
Hinweis
Im vorherigen Skript ,<port> ist optional. Es ist nur erforderlich, wenn du Nicht-Standard-Ports verwendest. Verwenden Sie nicht die spitzen Klammern <>.
Nachdem Sie die vorherigen Schritte abgeschlossen haben, ist die Verfügbarkeitsgruppe bereit, an der Peer-to-Peer-Topologie teilzunehmen. In den nächsten Schritten wird eine eigenständige Instanz von SQL Server (Peer2) für die Teilnahme konfiguriert.
Konfigurieren des Verteilers und des Remoteverlegers (Peer2)
Konfigurieren Sie die Distribution am Verteiler.
USE master; GO EXEC sys.sp_adddistributor @distributor = 'Dist2', @password = '**Strong password for distributor**';Erstellen Sie die Verteilungsdatenbank beim Verteiler.
USE master; GO EXEC sys.sp_adddistributiondb @database = 'distribution', @security_mode = 1;Konfigurieren Sie Node3 als entfernten Publisher auf dem Distributor Dist2.
USE master; GO EXEC sys.sp_adddistpublisher @publisher = 'Node3', @distribution_db = 'distribution', @working_directory = '\\MyReplShare\WorkingDir2', @security_mode = 1
Konfigurieren Sie den Verleger (Peer2)
Konfigurieren Sie die Remoteverteilung auf Node3.
exec sys.sp_adddistributor @distributor = 'Dist2', @password = '<Password used when running sp_adddistributor on distributor server>'Aktivieren Sie auf Node3 die Datenbank für die Replikation.
USE master;
GO
EXEC sys.sp_replicationdboption
@dbname = 'MyDBName',
@optname = 'publish',
@value = 'true';
Erstellen Sie eine Peer-to-Peer-Veröffentlichung (Peer2)
Auf Node3 führen Sie folgenden Befehl aus, um die Peer-to-Peer-Publikation zu erstellen.
exec master..sp_replicationdboption @dbname= 'MyDBName'
,@optname= 'publish'
,@value= 'true'
go
DECLARE @publisher_security_mode smallint = 1
EXEC [MyDBName].dbo.sp_addlogreader_agent @publisher_security_mode = @publisher_security_mode
go
-- Make sure that the value for @p2p_originator_id is different from Peer1.
DECLARE @allow_dts nvarchar(5) = N'false'
DECLARE @allow_pull nvarchar(5) = N'true'
DECLARE @allow_push nvarchar(5) = N'true'
DECLARE @description nvarchar(255) = N'Peer-to-Peer publication of database MyDBName from Node3'
DECLARE @enabled_for_p2p nvarchar(5) = N'true'
DECLARE @independent_agent nvarchar(5) = N'true'
DECLARE @p2p_conflictdetection nvarchar(5) = N'true'
DECLARE @p2p_originator_id int = 1
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @repl_freq nvarchar(10) = N'continuous'
DECLARE @restricted nvarchar(10) = N'false'
DECLARE @status nvarchar(8) = N'active'
DECLARE @sync_method nvarchar(40) = N'NATIVE'
EXEC [MyDBName].dbo.sp_addpublication @allow_dts = @allow_dts, @allow_pull = @allow_pull, @allow_push = @allow_push, @description = @description, @enabled_for_p2p = @enabled_for_p2p, @independent_agent = @independent_agent, @p2p_conflictdetection = @p2p_conflictdetection, @p2p_originator_id = @p2p_originator_id, @publication = @publication, @repl_freq = @repl_freq, @restricted = @restricted, @status = @status, @sync_method = @sync_method
GO
DECLARE @article nvarchar(256) = N'tbl0'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl0'
DECLARE @destination_table nvarchar(256) = N'tbl0'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl0'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object, @source_owner = @source_owner, @type = @type
GO
DECLARE @article nvarchar(256) = N'tbl1'
DECLARE @description nvarchar(255) = N'Article for dbo.tbl1'
DECLARE @destination_table nvarchar(256) = N'tbl1'
DECLARE @publication nvarchar(256) = N'P2P_MyDBName'
DECLARE @source_object nvarchar(256) = N'tbl1'
DECLARE @source_owner nvarchar(256) = N'dbo'
DECLARE @type nvarchar(256) = N'logbased'
EXEC [MyDBName].dbo.sp_addarticle @article = @article, @description = @description, @destination_table = @destination_table, @publication = @publication, @source_object = @source_object,
@source_owner = @source_owner, @type = @type
GO
Erstellen eines Pushabonnements von Peer1 zu Peer2
In diesem Schritt wird ein Pushabonnement von der Verfügbarkeitsgruppe zur eigenständigen Instanz von SQL Server erstellt.
Führen Sie das folgende Skript auf Node1 aus. Dieser Schritt setzt voraus, dass Knoten1 die primäre Replik ausführt.
EXEC [MyDBName].dbo.sp_addsubscription
@publication = N'P2P_MyDBName'
, @subscriber = N'Node3'
, @destination_db = N'MyDBName'
, @subscription_type = N'push'
, @sync_type = N'replication support only'
GO
EXEC [MyDBName].dbo.sp_addpushsubscription_agent
@publication = N'P2P_MyDBName'
, @subscriber = N'Node3'
, @subscriber_db = N'MyDBName'
, @job_login = null
, @job_password = null
, @subscriber_security_mode = 1
, @frequency_type = 64
, @frequency_interval = 1
, @frequency_relative_interval = 1
, @frequency_recurrence_factor = 0
, @frequency_subday = 4
, @frequency_subday_interval = 5
, @active_start_time_of_day = 0
, @active_end_time_of_day = 235959
, @active_start_date = 0
, @active_end_date = 0
, @dts_package_location = N'Distributor'
GO
Erstellen Sie ein Pushabonnement von Peer2 an den Verfügbarkeitsgruppenlistener.
Führen Sie den folgenden Befehl auf Node3 aus, um ein Pushabonnement von Peer2 an den Verfügbarkeitsgruppenlistener zu erstellen.
Wichtig
Das folgende Skript gibt den Namen des Verfügbarkeitsgruppen-Listeners für den Abonnenten an.
@subscriber = N'MyAGListenerName,<port>'
EXEC [MyDBName].dbo.sp_addsubscription
@publication = N'P2P_MyDBName'
, @subscriber = N'MyAGListenerName,<port>'
, @destination_db = N'MyDBName'
, @subscription_type = N'push'
, @sync_type = N'replication support only'
GO
EXEC [MyDBName].dbo.sp_addpushsubscription_agent
@publication = N'P2P_MyDBName'
, @subscriber = N'MyAGListenerName,<port>'
, @subscriber_db = N'MyDBName'
, @job_login = null
, @job_password = null
, @subscriber_security_mode = 1
, @frequency_type = 64
, @frequency_interval = 1
, @frequency_relative_interval = 1
, @frequency_recurrence_factor = 0
, @frequency_subday = 4
, @frequency_subday_interval = 5
, @active_start_time_of_day = 0
, @active_end_time_of_day = 235959
, @active_start_date = 0
, @active_end_date = 0
, @dts_package_location = N'Distributor'
GO
Konfigurieren des Verbindungsservers
An jedem sekundären Replika-Host stellen Sie sicher, dass die Push-Abonnenten der Publikationen als verknüpfte Server erscheinen.
EXEC sys.sp_addlinkedserver
@server = 'MySubscriber';