Réplication plusieurs à un de SQL Server

14

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

De plus, j'aimerais trouver des méthodes pour y parvenir avec le moins d'impact possible sur les serveurs source. Les agents, déclencheurs ou mods de schéma tiers sur ces serveurs sont difficiles dans mon environnement.

Mes questions:

  • Quelles sont les architectures et technologies prometteuses pour atteindre cet objectif?
  • J'ai examiné la réplication de fusion SQL Server, mais je suis préoccupé par la latence. Est-ce une technologie appropriée pour cet objectif?
  • Existe-t-il des architectures plusieurs à un pour la réplication transactionnelle?
  • Dois-je envisager une réplication 1 à 1 dans 8 bases de données sur mon serveur de rapports, suivie d'une fonction de fusion personnalisée (réplication en 2 étapes)?

Merci, John

John Jeheimer
la source
La seule option intégrée est la réplication de fusion. Un SLA de 30 secondes devrait être facilement réalisable s'il n'y a pas une tonne de changements qui se produisent aux sources. Tout schéma de réplication en 2 étapes introduira une latence supplémentaire dans le processus, ce qui rendra plus difficile la réalisation du SLA indiqué.
Jon Seigel

Réponses:

16

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:

entrez la description de l'image ici

Donc, finalement, vous pouvez consolider les lignes de tous (dans mon cas, 3 serveurs) comme ci-dessous:

entrez la description de l'image ici

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

Kin Shah
la source
@JohnJeheimer Heureux que cela ait aidé. Si vous pensez que la réponse a répondu à votre question, veuillez voter / marquer comme réponse.
Kin Shah