SQL Server-Many-to-One-Replikation

14

Ich habe 8 einzelne SQL Server 2008 R2-Computer, auf denen jeweils 1 Datenbank gehostet wird. Jede Datenbank hat eine identische Tabellenstruktur und ein identisches Schema sowie vollständig eindeutige Daten.

Ich möchte einen Berichtsserver einrichten (möglicherweise 2008 oder 2012), der die Zeilen aus ausgewählten Tabellen auf den 8 Quellservern in einer einzelnen Instanz dieser Tabellen auf dem Berichtsserver konsolidiert. Dies ist eine One-Way-Replikation (es werden keine Änderungen am Berichtsserver vorgenommen). Ich muss Änderungen aus den Quelldatenbanken mit relativ geringer Latenz replizieren (z. B. 20-30 Sekunden).

Darüber hinaus möchte ich Methoden finden, um dies zu erreichen und dabei die Quellserver so wenig wie möglich zu belasten. Agenten, Trigger oder Schema-Modifikationen von Drittanbietern für diese Server sind in meiner Umgebung schwierig.

Meine Fragen:

  • Was sind vielversprechende Architekturen und Technologien, um dieses Ziel zu erreichen?
  • Ich habe mir SQL Server Merge Replication angesehen, bin aber besorgt über die Latenz. Ist das eine geeignete Technologie für dieses Ziel?
  • Gibt es viele-zu-eins-Architekturen für die Transaktionsreplikation?
  • Soll ich die 1-zu-1-Replikation in 8 Datenbanken auf meinem Berichtsserver und anschließend eine benutzerdefinierte Zusammenführungsfunktion (eine 2-stufige Replikation) in Betracht ziehen?

Danke, John

John Jeheimer
quelle
Die einzige integrierte Option ist die Option zum Zusammenführen der Replikation. Ein 30-Sekunden-SLA sollte leicht erreichbar sein, wenn an den Quellen nicht viele Änderungen vorgenommen werden. Jedes zweistufige Replikationsschema führt zu einer zusätzlichen Latenz, wodurch es schwieriger wird, die angegebene SLA zu erreichen.
Jon Seigel

Antworten:

16

Ich habe 8 einzelne SQL Server 2008 R2-Computer, auf denen jeweils 1 Datenbank gehostet wird. Jede Datenbank hat eine identische Tabellenstruktur und ein identisches Schema sowie vollständig eindeutige Daten. Ich möchte einen Berichtsserver einrichten (möglicherweise 2008 oder 2012), der die Zeilen aus ausgewählten Tabellen auf den 8 Quellservern in einer einzelnen Instanz dieser Tabellen auf dem Berichtsserver konsolidiert. Dies ist eine One-Way-Replikation (es werden keine Änderungen am Berichtsserver vorgenommen). Ich muss Änderungen aus den Quelldatenbanken mit relativ geringer Latenz replizieren (z. B. 20-30 Sekunden).

Dies können Sie mit der Transaktionsreplikation erreichen . Im Folgenden erfahren Sie, wie Sie dies tun können.

Hinweis : Sie müssen Ihr Tabellenschema geringfügig ändern, um dies zu erreichen, da Sie diese Zeilen beim Replizieren auf den Abonnenten eindeutig identifizieren müssen. Als Voraussetzung für T-Rep müssen Tabellen mit PK definiert sein.

Unten sehen Sie Ihre Beispieltabelle auf Publisher-Servern , die sich auf allen 8 Servern befinden, auf denen Sie Zeilen auf dem Berichtsserver konsolidieren möchten:

CREATE TABLE Products
(
ProductID INT not null,
ProductName VARCHAR(25),
ServerName sysname default @@servername not null -- this is to identify which row is from which server ; probably add this using Alter column
)
GO
ALTER TABLE Products
ADD CONSTRAINT pk_Product_ID_ServerName PRIMARY KEY (ProductID)

Auf dem Abonnentenserver müssen Sie dieselbe Tabelle mit unterschiedlichen PK erstellen, um die Zeilen auf dem Abonnenten eindeutig zu identifizieren. Andernfalls schlägt T-Rep mit einer PK-Verletzung fehl. Ich gehe davon aus, dass Sie die PK-Struktur nicht ändern können Live-Produktion, lieber am Abonnenten modifizieren

CREATE TABLE Products
(
ProductID INT not null,
ProductName VARCHAR(25),
ServerName sysname default @@servername not null
);
GO

ALTER TABLE Products
ADD CONSTRAINT pk_Product_ID_ServerName PRIMARY KEY (ProductID,ServerName)

Das folgende Skript hilft Ihnen beim Einrichten von T-Rep. Ändern Sie einfach den Datenbanknamen, den Zielservernamen und den Objektnamen.

-- Enabling the replication database
use master
exec sp_replicationdboption @dbname = N'repl1', @optname = N'publish', @value = N'true'
GO

exec [repl1].sys.sp_addlogreader_agent @job_login = null, @job_password = null, @publisher_security_mode = 1
GO
exec [repl1].sys.sp_addqreader_agent @job_login = null, @job_password = null, @frompublisher = 1
GO
-- Adding the transactional publication
use [repl1]
exec sp_addpublication @publication = N'repl1_2005', @description = N'Transactional publication of database ''repl1'' from Publisher ''server_name\SQL2005''.', @sync_method = N'concurrent', @retention = 0, @allow_push = N'true', @allow_pull = N'true', @allow_anonymous = N'false', @enabled_for_internet = N'false', @snapshot_in_defaultfolder = N'true', @compress_snapshot = N'false', @ftp_port = 21, @ftp_login = N'anonymous', @allow_subscription_copy = N'false', @add_to_active_directory = N'false', @repl_freq = N'continuous', @status = N'active', @independent_agent = N'true', @immediate_sync = N'false', @allow_sync_tran = N'false', @autogen_sync_procs = N'false', @allow_queued_tran = N'false', @allow_dts = N'false', @replicate_ddl = 1, @allow_initialize_from_backup = N'false', @enabled_for_p2p = N'false', @enabled_for_het_sub = N'false'
GO


exec sp_addpublication_snapshot @publication = N'repl1_2005', @frequency_type = 1, @frequency_interval = 0, @frequency_relative_interval = 0, @frequency_recurrence_factor = 0, @frequency_subday = 0, @frequency_subday_interval = 0, @active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 0, @active_end_date = 0, @job_login = null, @job_password = null, @publisher_security_mode = 1
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'sa'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'NT AUTHORITY\SYSTEM'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'BUILTIN\Administrators'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'server_name\SQLServer2005SQLAgentUser$server_name$SQL2005'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'server_name\SQLServer2005MSSQLUser$server_name$SQL2005'
GO
exec sp_grant_publication_access @publication = N'repl1_2005', @login = N'distributor_admin'
GO

-- Adding the transactional articles
use [repl1]
exec sp_addarticle @publication = N'repl1_2005', @article = N'Products', @source_owner = N'dbo', @source_object = N'Products', @type = N'logbased', @description = N'', @creation_script = N'', @pre_creation_cmd = N'none', @schema_option = 0x000000000803509F, @identityrangemanagementoption = N'none', @destination_table = N'Products', @destination_owner = N'dbo', @status = 24, @vertical_partition = N'false', @ins_cmd = N'CALL [sp_MSins_dboProducts]', @del_cmd = N'CALL [sp_MSdel_dboProducts]', @upd_cmd = N'SCALL [sp_MSupd_dboProducts]'
GO

-- Adding the transactional subscriptions
use [repl1]
exec sp_addsubscription @publication = N'repl1_2005', @subscriber = N'server_name\SQL2008R2', @destination_db = N'repl123', @subscription_type = N'Push', @sync_type = N'automatic', @article = N'all', @update_mode = N'read only', @subscriber_type = 0
exec sp_addpushsubscription_agent @publication = N'repl1_2005', @subscriber = N'server_name\SQL2008R2', @subscriber_db = N'repl123', @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

Einige Punkte zu beachten:

Stellen Sie in sp_addsubscription sicher, dass @sync_type = N'automatic'

Und die Artikeleigenschaften sollten eingestellt sein auf:

Bildbeschreibung hier eingeben

Schließlich können Sie Zeilen von allen (in meinem Fall 3 Servern) wie folgt konsolidieren lassen:

Bildbeschreibung hier eingeben

Also zusammenfassend

  • Verwenden Sie T-Rep.
  • Fügen Sie den vorhandenen Publisher-Datenbanken eine zusätzliche Spalte hinzu, z. B. serverName, um die Zeilen auf dem Abonnenten eindeutig zu identifizieren.
  • Erstellen Sie eine Tabelle für Subscriber, in der PK als Servername enthalten ist.

  • Erstellen Sie eine Replikation der Tabellen, wobei @sync_type = N'automatic 'und die Article-Eigenschaft auf "Vorhandenes Objekt unverändert lassen" gesetzt sind.

  • Führen Sie den Snapshot-Agent aus.

  • Überprüfen Sie die konsolidierten Daten auf dem Abonnenten.

Kin Shah
quelle
@ JohnJeheimer Schön, dass es geholfen hat. Wenn Sie der Meinung sind, dass die Antwort Ihre Frage beantwortet hat, stimmen Sie der Antwort zu.
Kin Shah