Replicación SQL Server Many-to-One

14

Tengo 8 máquinas SQL Server 2008 R2 individuales, cada una con 1 base de datos. Cada base de datos tiene una estructura y un esquema de tabla idénticos, y datos completamente únicos.

Me gustaría establecer un servidor de informes (puede ser 2008 o 2012), que consolide las filas de las tablas seleccionadas en los 8 servidores de origen en una sola instancia de esas tablas en el servidor de informes. Esta es una replicación unidireccional (no se realizarán cambios en el servidor de informes). Tendré que replicar los cambios de las bases de datos de origen con una latencia relativamente baja (digamos 20-30 segundos).

Además, me gustaría encontrar métodos para lograr esto con el menor impacto posible en los servidores de origen. Los agentes de terceros, los desencadenantes o las modificaciones de esquema en esos servidores son difíciles en mi entorno.

Mis preguntas:

  • ¿Cuáles son las arquitecturas y tecnologías prometedoras para lograr este objetivo?
  • He examinado la replicación de combinación de SQL Server, pero me preocupa la latencia. ¿Es esta una tecnología apropiada para este objetivo?
  • ¿Existen arquitecturas muchos a uno para la replicación transaccional?
  • ¿Debo mirar la replicación 1 a 1 en 8 bases de datos en mi servidor de informes, seguida de alguna función de combinación personalizada (una replicación de 2 pasos)?

Gracias John

John Jeheimer
fuente
La única opción integrada es la replicación de mezcla. Un SLA de 30 segundos debería ser fácil de lograr si no se producen muchos cambios en las fuentes. Cualquier esquema de replicación de 2 pasos introducirá una latencia adicional en el proceso, lo que hará más difícil lograr el SLA establecido.
Jon Seigel

Respuestas:

16

Tengo 8 máquinas SQL Server 2008 R2 individuales, cada una con 1 base de datos. Cada base de datos tiene una estructura y un esquema de tabla idénticos, y datos completamente únicos. Me gustaría establecer un servidor de informes (puede ser 2008 o 2012), que consolide las filas de las tablas seleccionadas en los 8 servidores de origen en una sola instancia de esas tablas en el servidor de informes. Esta es una replicación unidireccional (no se realizarán cambios en el servidor de informes). Tendré que replicar los cambios de las bases de datos de origen con una latencia relativamente baja (digamos 20-30 segundos).

Puede lograr esto con la replicación transaccional . A continuación se muestra cómo puedes hacerlo.

Nota : tiene que cambiar ligeramente el esquema de la tabla para lograr esto, ya que debe identificar de forma exclusiva esas filas cuando se replica al suscriptor. Como requisito previo de T-Rep, debe tener tablas con PK definido.

A continuación se muestra su tabla de muestra en los servidores de Publisher que se encuentra en todos los 8 servidores que desea consolidar filas en el servidor de informes:

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)

En el servidor del suscriptor , debe crear la misma tabla pero con un PK diferente para identificar de forma exclusiva las filas en el suscriptor (al no hacerlo, T-Rep fallará con la violación de PK; supongo que no puede modificar la estructura PK en PRODUCCIÓN en vivo más bien es mejor modificar en el suscriptor)

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)

El siguiente script lo ayudará a configurar T-Rep, simplemente cambie el nombre del servidor de datos, el nombre del servidor de destino junto con el nombre del 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

Un par de puntos a tener en cuenta:

En sp_addsubscription, asegúrese de que @sync_type = N'automatic'

Y las propiedades del artículo deben establecerse en:

ingrese la descripción de la imagen aquí

Finalmente, puede tener filas consolidadas de todos (en mi caso 3 servidores) como se muestra a continuación:

ingrese la descripción de la imagen aquí

En resumen,

  • Use T-Rep.
  • Agregue una columna adicional a las bases de datos de Publisher existentes, por ejemplo, serverName para identificar de forma exclusiva las filas en el suscriptor.
  • Cree una tabla en el suscriptor que tenga PK incluido como ServerName.

  • Cree la replicación de las tablas con @sync_type = N'automatic 'y la propiedad Article establecida en "Mantener el objeto existente sin cambios".

  • Ejecute el agente de instantáneas.

  • Verifique los datos consolidados del suscriptor.

Kin Shah
fuente
@JohnJeheimer Me alegro de que haya ayudado. Si cree que la respuesta respondió a su pregunta, vote a favor o márquela como respuesta.
Kin Shah