Replica moltiplicata per SQL Server


14

Ho 8 singole macchine SQL Server 2008 R2, ognuna delle quali ospita 1 database. Ogni database ha una struttura e uno schema di tabella identici e dati completamente unici.

Vorrei stabilire un server di report (potrebbe essere il 2008 o il 2012), che consolida le righe dalle tabelle selezionate attraverso gli 8 server di origine in un'unica istanza di tali tabelle sul server di report. Questa è una replica unidirezionale (non verranno apportate modifiche al server di report). Dovrò replicare le modifiche dai database di origine con latenza relativamente bassa (diciamo 20-30 secondi).

Inoltre, vorrei trovare metodi per raggiungere questo obiettivo con il minor impatto possibile sui server di origine. Agenti di terze parti, trigger o mod di schema per quei server sono difficili nel mio ambiente.

Le mie domande:

  • Quali sono le architetture e le tecnologie promettenti per raggiungere questo obiettivo?
  • Ho esaminato SQL Server Merge Replication, ma sono preoccupato per la latenza. È una tecnologia adeguata per questo obiettivo?
  • Esistono architetture one-to-one per la replica transazionale?
  • Dovrei guardare la replica 1 a 1 in 8 database sul mio server di report, seguita da una funzione di unione personalizzata (una replica in 2 passaggi)?

Grazie John


L'unica opzione integrata è Merge Replication. Uno SLA di 30 secondi dovrebbe essere facilmente realizzabile se non ci sono un sacco di cambiamenti in corso alle fonti. Qualsiasi schema di replica in due passaggi introdurrà ulteriore latenza nel processo, rendendo più difficile il raggiungimento dello SLA dichiarato.
Jon Seigel,

Risposte:


16

Ho 8 singole macchine SQL Server 2008 R2, ognuna delle quali ospita 1 database. Ogni database ha una struttura e uno schema di tabella identici e dati completamente unici. Vorrei stabilire un server di report (potrebbe essere il 2008 o il 2012), che consolida le righe dalle tabelle selezionate attraverso gli 8 server di origine in un'unica istanza di tali tabelle sul server di report. Questa è una replica unidirezionale (non verranno apportate modifiche al server di report). Dovrò replicare le modifiche dai database di origine con latenza relativamente bassa (diciamo 20-30 secondi).

È possibile ottenere ciò con la replica transazionale . Di seguito è come puoi farlo.

Nota : è necessario modificare leggermente lo schema della tabella per ottenere ciò poiché è necessario identificare in modo univoco quelle righe durante la replica nell'abbonato. Come prerequisito di T-Rep è necessario disporre di tabelle con PK definito.

Di seguito è riportata la tabella di esempio sui server Publisher che è su tutti gli 8 server su cui si desidera consolidare le righe sul server di report:

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)

Sul server abbonati , è necessario creare la stessa tabella ma con PK diverso per identificare in modo univoco le righe nell'abbonato (non farlo, T-Rep fallirà con la violazione PK - Sto assumendo che non è possibile modificare la struttura PK su live PRODUCTION è meglio modificarlo presso l'abbonato)

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)

Lo script di seguito ti aiuterà a configurare T-Rep, basta cambiare il nome del database, il nome del server di destinazione e il nome dell'oggetto.

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

Coppia di punti da notare:

In sp_addsubscription assicurati che @sync_type = N'automatic'

E le proprietà dell'articolo dovrebbero essere impostate su:

inserisci qui la descrizione dell'immagine

Quindi, finalmente, puoi avere le righe consolidate da tutti (nel mio caso 3 server) come di seguito:

inserisci qui la descrizione dell'immagine

Quindi in sintesi,

  • Usa T-Rep.
  • Aggiungere una colonna aggiuntiva ai database di Publisher esistenti, ad es. NomeServer per identificare in modo univoco le righe nell'abbonato.
  • Creare una tabella sul Sottoscrittore con PK incluso come NomeServer.

  • Crea la replica delle tabelle con @sync_type = N'automatic 'e la proprietà Article impostata su "Mantieni invariato l'oggetto esistente".

  • Esegui agente snapshot.

  • Controllare i dati consolidati sull'abbonato.


@JohnJeheimer Lieto che mi abbia aiutato. Se ritieni che la risposta abbia risposto alla tua domanda, per favore vota / segna come risposta.
Kin Shah,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.