J'ai 8 machines individuelles SQL Server 2008 R2, chacune hébergeant 1 base de données. Chaque base de données a une structure et un schéma de table identiques, et des données entièrement uniques. Je voudrais créer un serveur de rapports (peut être 2008 ou 2012), qui consolide les lignes des tables sélectionnées sur les 8 serveurs sources en une seule instance de ces tables sur le serveur de rapports. Il s'agit d'une réplication unidirectionnelle (aucune modification ne sera apportée au serveur de rapports). Je devrai répliquer les modifications des bases de données source avec une latence relativement faible (disons 20-30 secondes).
Vous pouvez y parvenir avec la réplication transactionnelle . Voici comment vous pouvez le faire.
Remarque : Vous devez modifier légèrement votre schéma de table pour y parvenir car vous devez identifier ces lignes de manière unique lorsque vous répliquez vers l'abonné. Comme condition préalable à T-Rep, vous devez avoir des tables avec PK définies.
Vous trouverez ci-dessous votre exemple de tableau sur les serveurs Publisher qui se trouve sur l'ensemble de vos 8 serveurs que vous souhaitez consolider les lignes sur le serveur de rapports:
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)
Sur le serveur d'abonné , vous devez créer la même table mais avec des PK différents pour identifier de manière unique les lignes sur l'abonné (sinon, T-Rep va échouer avec une violation de PK - je suppose que vous ne pouvez pas modifier la structure de PK sur PRODUCTION en direct plutôt mieux à modifier chez l'abonné)
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)
Le script ci-dessous vous aidera à configurer T-Rep, il suffit de changer le nom de la base de données, le nom du serveur de destination ainsi que le nom de l'objet.
-- 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
Quelques points à noter:
Dans sp_addsubscription, assurez-vous que @sync_type = N'automatic'
Et les propriétés de l'article doivent être définies sur:
Donc, finalement, vous pouvez consolider les lignes de tous (dans mon cas, 3 serveurs) comme ci-dessous:
Donc en résumé,
- Utilisez T-Rep.
- Ajoutez une colonne supplémentaire aux bases de données Publisher existantes, par exemple serverName pour identifier de manière unique les lignes sur l'abonné.
Créez une table sur l'abonné ayant PK inclus en tant que ServerName.
Créez la réplication des tables avec @sync_type = N'automatic 'et la propriété Article définie sur "Conserver l'objet existant inchangé".
Exécutez l'agent de capture instantanée.
Vérifiez les données consolidées sur l'abonné.