SQL Server 다 대일 복제


14

각각 1 개의 데이터베이스를 호스팅하는 8 개의 개별 SQL Server 2008 R2 컴퓨터가 있습니다. 각 데이터베이스는 동일한 테이블 구조와 스키마 및 완전히 고유 한 데이터를 갖습니다.

8 개의 원본 서버에서 선택된 테이블의 행을보고 서버에있는 해당 테이블의 단일 인스턴스로 통합하는보고 서버 (2008 또는 2012 일 수 있음)를 설정하고 싶습니다. 이것은 단방향 복제입니다 (보고 서버는 변경되지 않음). 비교적 짧은 대기 시간 (예 : 20-30 초)으로 원본 데이터베이스의 변경 사항을 복제해야합니다.

또한 소스 서버에 거의 영향을 미치지 않으면 서이를 달성하는 방법을 찾고 싶습니다. 해당 서버에 대한 타사 에이전트, 트리거 또는 스키마 모드는 내 환경에서 어렵습니다.

내 질문 :

  • 이 목표를 달성하기위한 유망한 아키텍처와 기술은 무엇입니까?
  • SQL Server 병합 복제를 살펴 봤지만 대기 시간이 걱정됩니다. 이것이이 목표에 적합한 기술입니까?
  • 트랜잭션 복제를위한 다 대일 아키텍처가 있습니까?
  • 보고 서버에서 8 개의 데이터베이스로 일대일 복제를보고 사용자 지정 병합 기능 (2 단계 복제)을 수행해야합니까?

고마워, 존


내장 옵션은 병합 복제뿐입니다. 소스에서 많은 변화가 없다면 30 초의 SLA를 쉽게 달성 할 수 있습니다. 2 단계 복제 체계를 사용하면 프로세스에 추가 대기 시간이 발생하여 명시된 SLA를 달성하기가 더 어려워집니다.
Jon Seigel

답변:


16

각각 1 개의 데이터베이스를 호스팅하는 8 개의 개별 SQL Server 2008 R2 컴퓨터가 있습니다. 각 데이터베이스는 동일한 테이블 구조와 스키마 및 완전히 고유 한 데이터를 갖습니다. 8 개의 원본 서버에서 선택된 테이블의 행을보고 서버에있는 해당 테이블의 단일 인스턴스로 통합하는보고 서버 (2008 또는 2012 일 수 있음)를 설정하고 싶습니다. 이것은 단방향 복제입니다 (보고 서버는 변경되지 않음). 비교적 짧은 대기 시간 (예 : 20-30 초)으로 원본 데이터베이스의 변경 사항을 복제해야합니다.

트랜잭션 복제를 통해이를 달성 할 수 있습니다 . 다음은 그 방법입니다.

참고 : 구독자에게 복제 할 때 해당 행을 고유하게 식별해야하므로 테이블 스키마를 약간 변경해야합니다. T-Rep의 전제 조건으로 PK가 정의 된 테이블이 있어야합니다.

다음은 보고 서버에서 행을 통합하려는 8 개 서버 모두 에있는 Publisher 서버 의 샘플 테이블입니다 .

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)

가입자 서버 난 당신의 PK 구조를 수정할 수 있음을 가정하고 -, 당신은 유일하게 T-담당자는 PK 위반 실패 할 것입니다 그렇게하지 가입자 (의 행을 식별 할 수 있지만 다른 PK와 같은 테이블을 작성해야 실제 생산은 오히려 가입자에게 수정하는 것이 좋습니다)

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)

아래 스크립트는 T-Rep 설정에 도움이됩니다. 데이터베이스 이름, 대상 서버 이름 및 개체 이름을 변경하면됩니다.

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

참고 사항 :

sp_addsubscription에서 다음을 확인하십시오. @sync_type = N'automatic'

기사 속성은 다음과 같이 설정해야합니다.

여기에 이미지 설명을 입력하십시오

따라서 마지막으로 다음과 같이 모든 경우 (내 경우에는 3 서버)에서 행을 통합 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

요약하면

  • T-Rep를 사용하십시오.
  • 기존 게시자 데이터베이스에 추가 열을 추가하여 구독자에서 행을 고유하게 식별하십시오 (예 : serverName).
  • PK가 ServerName으로 포함 된 구독자에 테이블을 만듭니다.

  • @sync_type = N'automatic '이고 Article 속성이 "기존 개체를 변경하지 않음"으로 설정하여 테이블의 복제를 만듭니다.

  • 스냅 샷 에이전트를 실행하십시오.

  • 가입자의 통합 데이터를 확인하십시오.


@JohnJeheimer 도움이 되었기 때문에 기쁘다. 답변이 귀하의 질문에 대한 답변이라고 생각되면 답변으로 공감하거나 표시하십시오.
Kin Shah
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.