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:
Finalmente, puede tener filas consolidadas de todos (en mi caso 3 servidores) como se muestra a continuación:
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.