Replicação muitos-para-um do SQL Server

14

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).

Além disso, gostaria de encontrar métodos para conseguir isso com o menor impacto possível nos servidores de origem. Agentes de terceiros, gatilhos ou mods de esquema para esses servidores são difíceis no meu ambiente.

Minhas perguntas:

  • Quais são as arquiteturas e tecnologias promissoras para alcançar esse objetivo?
  • Eu olhei para a replicação de mesclagem do SQL Server, mas estou preocupado com a latência. Esta é uma tecnologia apropriada para esse objetivo?
  • Existem arquiteturas muitos para um para replicação transacional?
  • Devo observar a replicação 1 para 1 em 8 bancos de dados no meu servidor de relatórios, seguida por alguma função de mesclagem personalizada (uma replicação em duas etapas)?

Obrigado John

John Jeheimer
fonte
A única opção interna é Replicação de Mesclagem. Um SLA de 30 segundos deve ser facilmente alcançado se não houver uma tonelada de mudanças acontecendo nas fontes. Qualquer esquema de replicação em duas etapas introduzirá latência extra no processo, dificultando o alcance do SLA indicado.
Jon Seigel

Respostas:

16

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:

insira a descrição da imagem aqui

Então, finalmente, você pode ter linhas consolidadas de todos (no meu caso, 3 servidores), como abaixo:

insira a descrição da imagem aqui

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.

Kin Shah
fonte
@JohnJeheimer Fico feliz que tenha ajudado. Se você acha que a resposta respondeu à sua pergunta, marque como resposta.
Kin Shah