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:
Schließlich können Sie Zeilen von allen (in meinem Fall 3 Servern) wie folgt konsolidieren lassen:
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.