Eu tenho 8 máquinas individuais do SQL Server 2008 R2, cada uma hospedando 1 banco de dados. Cada banco de dados possui uma estrutura e um esquema de tabela idênticos e dados totalmente exclusivos. Gostaria de estabelecer um servidor de relatório (pode ser 2008 ou 2012), que consolide as linhas das tabelas selecionadas nos 8 servidores de origem em uma única instância dessas tabelas no servidor de relatório. Essa é uma replicação unidirecional (nenhuma alteração será feita no servidor de relatório). Vou precisar replicar as alterações dos bancos de dados de origem com latência relativamente baixa (digamos 20 a 30 segundos).
Você pode conseguir isso com a replicação transacional . Abaixo está como você pode fazê-lo.
Nota : É necessário alterar um pouco o esquema da tabela para conseguir isso, pois você precisa identificar exclusivamente essas linhas ao replicar para o assinante. Como pré-requisito do T-Rep, você precisa ter tabelas com PK definidas.
Abaixo está sua tabela de exemplo nos servidores Publisher que estão em todos os seus 8 servidores que você deseja consolidar linhas no servidor de relatórios:
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)
No servidor do assinante , você precisa criar a mesma tabela, mas com PK diferente para identificar exclusivamente as linhas no assinante (se não o fizer, o T-Rep falhará com violação da PK - presumo que você não possa modificar a estrutura PK em produção ao vivo, é melhor modificar no assinante)
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)
O script abaixo o ajudará a configurar o T-Rep, basta alterar o nome do banco de dados, o nome do servidor de destino e o nome do objeto.
-- 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
Alguns pontos a serem observados:
Em sp_addsubscription, verifique se @sync_type = N'automatic'
E as propriedades do artigo devem ser definidas como:
Então, finalmente, você pode ter linhas consolidadas de todos (no meu caso, 3 servidores), como abaixo:
Então, em resumo,
- Use T-Rep.
- Adicione uma coluna adicional aos bancos de dados existentes do Publisher, por exemplo, serverName para identificar exclusivamente as linhas no assinante.
Crie tabela no Assinante com PK incluída como ServerName.
Crie a replicação das tabelas com @sync_type = N'automatic 'e a propriedade Article configuradas para "Manter o objeto existente inalterado".
Execute o agente de captura instantânea.
Verifique os dados consolidados no assinante.