Ho 8 singole macchine SQL Server 2008 R2, ognuna delle quali ospita 1 database. Ogni database ha una struttura e uno schema di tabella identici e dati completamente unici. Vorrei stabilire un server di report (potrebbe essere il 2008 o il 2012), che consolida le righe dalle tabelle selezionate attraverso gli 8 server di origine in un'unica istanza di tali tabelle sul server di report. Questa è una replica unidirezionale (non verranno apportate modifiche al server di report). Dovrò replicare le modifiche dai database di origine con latenza relativamente bassa (diciamo 20-30 secondi).
È possibile ottenere ciò con la replica transazionale . Di seguito è come puoi farlo.
Nota : è necessario modificare leggermente lo schema della tabella per ottenere ciò poiché è necessario identificare in modo univoco quelle righe durante la replica nell'abbonato. Come prerequisito di T-Rep è necessario disporre di tabelle con PK definito.
Di seguito è riportata la tabella di esempio sui server Publisher che è su tutti gli 8 server su cui si desidera consolidare le righe sul server di report:
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)
Sul server abbonati , è necessario creare la stessa tabella ma con PK diverso per identificare in modo univoco le righe nell'abbonato (non farlo, T-Rep fallirà con la violazione PK - Sto assumendo che non è possibile modificare la struttura PK su live PRODUCTION è meglio modificarlo presso l'abbonato)
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)
Lo script di seguito ti aiuterà a configurare T-Rep, basta cambiare il nome del database, il nome del server di destinazione e il nome dell'oggetto.
-- 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
Coppia di punti da notare:
In sp_addsubscription assicurati che @sync_type = N'automatic'
E le proprietà dell'articolo dovrebbero essere impostate su:
Quindi, finalmente, puoi avere le righe consolidate da tutti (nel mio caso 3 server) come di seguito:
Quindi in sintesi,
- Usa T-Rep.
- Aggiungere una colonna aggiuntiva ai database di Publisher esistenti, ad es. NomeServer per identificare in modo univoco le righe nell'abbonato.
Creare una tabella sul Sottoscrittore con PK incluso come NomeServer.
Crea la replica delle tabelle con @sync_type = N'automatic 'e la proprietà Article impostata su "Mantieni invariato l'oggetto esistente".
Esegui agente snapshot.
Controllare i dati consolidati sull'abbonato.