새 스냅 샷을 생성하지 않고 트랜잭션 게시에 기사 추가


23

끌어 오기 구독자와 함께 SQL 2008 R2 트랜잭션 복제를 사용하여 기사를 추가 할 때 전체 스냅 샷을 만들 필요가 없습니다 (db는 ~ 80GB이므로 몇 시간이 걸립니다).

에서 이 기사 , 나는 immediate_sync을 설정하여 부분 스냅 샷이 작업을 수행하는 방법을 본 적이 있지만 그것은 우리를 위해 일을하지 않았다.

이상적으로는 테이블을 만들기 위해 db 스크립트의 일부로 이것을 실행하고 싶습니다. 따라서 복제하려면 다음을 수행하십시오.

Create Table ...    
sp_addArticle ...    
sp_PushThisToOurSubscribersNow    

답변:


13

GUI를 사용하여 SSMS를 통해 기사를 추가하고 필터를 적용 할 수도 있습니다. 기사의 다른 속성을 변경하지 않는 한 전체 스냅 샷을 생성 할 필요가 없습니다.

당신이 (문서를 추가 한 후) 게시 GUI에서 확인을 공격하면 다시 초기화 메시지를 표시하지 않고 종료됩니다 -이 경우 않습니다 다시 초기화 프롬프트, 전체 스냅 샷을 요구 한 후 변경 한 것을. 이 경우 취소를 누르고 다시 시도하십시오.

기사를 추가 한 후 스냅 샷 작업을 시작하면 새 기사에 대한 스냅 샷 만 생성됩니다 (미니 스냅 샷이라고 함).

그런 다음 배포 작업을 확인하고 구독자에서 테이블을 만들고 데이터를 대량 복사 한 것을 확인하십시오.

행운을 빕니다. 도움이 더 필요하면 알려주십시오.


나는이 답변에 설명 된 모든 것을했지만 여전히 복제 된 데이터베이스 전체가 동기화되기를 기다리고 있습니다. 새 기사를 추가 한 후 다시 초기화하라는 메시지가 표시되지 않았지만 여전히 전체 초기화를 수행했습니다. 조심해.
JzInqXc9Dg

7
  1. 발행물 속성 창 에서 새 기사 추가 (목록에서 선택된 기사 만 표시 선택 취소)
  2. 바로 같은 출판 노드를 클릭하고 "로 이동 보기 스냅 샷 에이전트 상태 "
  3. 시작을 클릭 하고 동일한 창에서이 새 기사 만 동기화되었음을 나타내는 로그를 기록하십시오.
  4. 짧은 시간이 지나면 이전에 동기화 된 모든 항목을 초기화하지 않고 구독자에서 새 기사가 동기화됩니다.

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


3

나는 똑같은 질문을했고, DBA를 오랫동안 사용해 왔지만 완전히 익숙해지기에 충분히 깊이 복제를 다루지 않았으므로 다음 리소스와 가이드가 도움이되었다고 생각했습니다.

  • 이 블로그 는 프로세스에 대한 개요를 제공합니다. 또한 기존 발행물이 많고 옵션이 "immediate_sync"로 설정되어 있으면 기사를 추가하거나 변경할 때마다 완전히 새로운 스냅 샷이 준비됩니다. 따라서 그는 옵션을 변경하는 유용한 팁을 가지고 있습니다.sp_changePublication @publication='MyPub', @property='immediate_sync', @value='false';

  • "repltalk"의 MSDN 블로그 게시물 (일반적으로 좋은 리소스처럼 들립니다!)- "직접"관련이 없지만 여전히 도움이 됨

  • @ Brandon-Williams가 구독 인 경우 다음을 사용하여 새로 고쳐야한다고 지적한이 질문sp_refreshSubscriptions @publication = 'MyPub'

  • SSMS Replication Monitor-가이드를 따라갈 때 에이전트 (스냅 샷, 로그 리더)를 중지 및 시작하는 편리한 방법입니다.

다음은 실제로 수행 한 단계로, 잘 작동하고 감독하는 DBA의 승인을 받았습니다.

  1. Replication Monitor를 열고 발행물을 선택하고 에이전트로 이동 한 후 Log Reader Agent를 마우스 오른쪽 단추로 클릭하고 중지를 클릭하십시오.
  2. 사용하지 수 익명 및하지 즉시 동기화에 게시를 설정 sp_changePublication@cody_konior 포인트 아웃이 아래에 문서화 된 바와 같이, 그래,하지만 내 경우에는 잘 작동했다 -. YMMV
  3. 스크립트를 사용하여 구독자에서 수동으로 테이블을 작성했습니다 (링크 된 서버 쿼리를 사용하여 데이터가 채워짐). SSIS, BCP 또는 다른 방법을 사용할 수도 있습니다. repl-snapshot을 사용하여 문제가 없으면 필요하지 않을 수도 있습니다. 방금 처음으로 수동으로 준비하고 싶었습니다.
  4. 를 사용하여 기사 (테이블) 추가 sp_addArticle
  5. 사용하여 테이블의 모든 항목 추가 sp_articleColumn(열을 지정하지 않은, 지정된 게시 및 기사 -> 모든 열을 의미한다)
  6. 풀러 sp_refreshSubscriptions를 새로 고치기 위해 해당 발행물을 실행했습니다.
  7. 복제 모니터를 다시 열고 펍을 선택한 다음 에이전트로 이동하여 스냅 샷 에이전트를 마우스 오른쪽 단추로 클릭하고 "시작"을 클릭하십시오. 한 번 실행되어 새 스냅 샷이 생성됩니다.
  8. Log Reader Agent를 마우스 오른쪽 단추로 클릭하고 "시작"을 클릭하십시오. 정상적으로 시작되고 계속 실행되며 이제 복제가 다시 작동해야합니다.

그리고 예, SSMS GUI로 대부분의 변경 사항을 수행 할 는 있지만 A) 소스 제어 (변경 제어) 및 B) 반복적으로 또는 여러 인스턴스에 배포 할 수 있도록 스크립트를 작성하는 것이 도움이됩니다. . 불행히도 나는 에이전트 중지 / 시작을 스크립팅하는 데 시간을 소비하지 않았지만 SQL 에이전트 작업이기 때문에 너무 어렵지 않아야합니다. 당신은 그 전체 "Job-Name을 사용하여 JobID를 찾으십시오"트릭을 수행해야합니다 (질의 sysjobs-실제로 MS?) ...

미래 독자들을위한 희망!


3

기존 발행물에 기사 추가 및 기존 기사에서 기사 삭제에 언급 된대로 , 발행물 의 새 스냅 샷을 작성해야합니다 *.

새로운 기사를 추가 할 때 모든 기사에 대한 스냅 샷을 생성 방지하려면 게시 속성은 immediate_sync0 전화로 설정해야합니다 sp_addarticle다음 sp_addsubscription. 구독이 당겨지면 전화로 문의해야합니다 sp_refreshsubscriptions. 그런 다음 스냅 샷을 생성하면 새로 추가 된 기사에 대한 스냅 샷 만 생성됩니다.

* 이것은 SQL Server 온라인 설명서에서 권장되는 방법입니다. 접근 방식의 문제점은 오류가 발생하기 쉽다는 것입니다.


2

주요 편집 이것은이 답변을 완전히 재 작성한 것입니다 (이전 버전은 오류가 발생하기 쉬웠으며 문제가 발생할 수 있다는 유효한 비판을 받았습니다)

Youtube-SQL Server Replication : 스냅 샷을 작성하지 않고 기사를 추가하는 방법에 이것을 적용하는 방법에 대한 데모도 게시했습니다 .

중요 : 이것은 NOT 당신이 그것을 수행 작업 받고 관련하여 자신에있을 것입니다 때문에, Microsoft에서 권장되는 접근 하지 중요한 고립 테스트없이 프로덕션 환경에 직접 적용하고 단계를 자신이 편안 받고!

따라야 할 단계 :

Planning steps:
    * Choose Publication that article will be added to
    * Gather information about the publication 
        exec sp_helppublication '[Name of Publication]'
        https://msdn.microsoft.com/en-us/library/ms189782(v=sql.105).aspx
        - replication frequency = 0 - this is Transactional replication (THIS IS A REQUIREMENT FOR THIS METHOD)
        - replicate_ddl = 1 - means ALTER TABLES will apply SQL Server generated repl procs
        - independent_agent = 1 - means that you will only affect tables in this publication when deploying
    * Identify which subscribers are going to be affected

Pre-deployment steps (can be done at any time)
    1. Create table on subscribers
    2. Create custom replication procs on subscribers
       (Customisation will ignore if the IUD has already been applied to subscriber - because you have manually sync'd the data)

Deployment/Potential impact:
    3. Stop Distribution Agents to all subscribers for this publication
    4. Add article to publication on publisher
    5. Sync data from publisher to subscriber
    6. Start Distribution Agents to all subscribers for this publication
    7. Monitor/Verify all data has arrived

Optional follow on:
    8. Apply standard repl procs (removing if not exists checks)
       This is optional as the generated repl scripts should be fine for the most part

Note:  When ALTER table scripts are applied on the Publisher (when replicate_ddl = 1) repl procs will automatically be recreated by the Distribution Agent (so any customisation will be lost)

확인하려면 :

  • 게시자에 삽입 수행-구독자에 행이 도착하는지 확인
  • 게시자 업데이트 수행-구독자에게 변경 사항이 도착했는지 확인
  • 게시자에서 삭제 수행-구독자에서 삭제 된 행 확인
  • 마지막 n 개의 행이 도착했는지와 게시자와 구독자간에 일치하는지 확인하십시오.

예 프로세스

A) 게시자에게 테이블을 만드십시오.

/* Deliberately applying IDENTITY, DEFAULT & INDEX to demonstrate usage on subscriber */
CREATE TABLE [dbo].[TableNotUsingSnap](
    [Id] [int] NOT NULL IDENTITY(1,1),
    [Note_Text] [varchar](4096) NOT NULL,
    [CreatedDate] [datetime] NULL,
    [LoggedDate] [datetime] NOT NULL CONSTRAINT DF_TableNotUsingSnap_LoggedDate DEFAUlT GETUTCDATE(),
 CONSTRAINT [PK_TableNotUsingSnap] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO 

CREATE NONCLUSTERED INDEX [IDX_NC_TableNotUsingSnap_LoggedDate]  ON [dbo].[TableNotUsingSnap]
(
    [LoggedDate] ASC
) INCLUDE ([Note_Text])
GO

B) [TableNotUsingSnap]에서 일부 삽입 / 업데이트 / 삭제를 수행하는 작업 / 프로세스 / 스크립트를 작성하십시오 (이 메소드를 사용하여 구독자가 올바르게 동기화되는 방법을 유효성 검증 할 수 있음).

사전 단계 :

1. 구독자에 테이블 만들기

/* example script to add a table to a publication without running the snapshot agent 
Steps: 
    Pre steps: 
    1. Create table on subscribers
    2. Create replication procs on subscribers

    Deployment/Potential impact:
    3. Stop Distribution Agents to all subscribers for this publication
    4. Add article to publication on publisher
    5. DTS data from publisher to subscriber
    6. Start Distribution Agents to all subscribers for this publication
    7. Monitor/Verify all data has arrived

=========================================================
Notes:
    * Drop unnecessary FK's, Indexes
    * Do NOT have IDENTITY(1,1), DEFAULTS
    * Do have a Clustered PK
    * Create appropriate indexes for your subscribers use case */ 

-- RUN ON SUBSCRIBER
IF OBJECT_ID('dbo.TableNotUsingSnap') IS NOT NULL
    exec sp_rename 'dbo.TableNotUsingSnap', 'TableNotUsingSnap_20170127'
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TableNotUsingSnap](
    [Id] [int] NOT NULL,
    [Note_Text] [varchar](4096) NOT NULL,
    [CreatedDate] [datetime] NULL,
    [LoggedDate] [datetime] NOT NULL,
 CONSTRAINT [PK_TableNotUsingSnap] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

2. 구독자에서 복제 저장 프로 시저 만들기 (업데이트 / 삽입 / 삭제)

repl procs를 만들 수 있습니다 :

  • 수동 (실수하기가 매우 쉽습니다)
  • Dev 시스템에서 MS Snapshot 방법을 사용하여 기사를 추가하고 repl procs를 스크립트로 작성하십시오 (트윅을 추가 할 준비가되었습니다).
  • 일종의 발전기 생성 / 찾기

적용해야 할 변경 사항 :

  • sp_MSins_ [Schema] [TableName]- IF NOT EXISTS (SELECT 'row already exists' FROM [Schema].[TableName] dest WITH (NOLOCK) WHERE dest.Id = @c1)삽입되어 있지 않으면 추가하십시오.
  • sp_MSupd_ [Schema] [TableName]- IF @@rowcount = 0 ... exec sp_MSreplraiserror ...적용되지 않은 업데이트를 무시하도록 주석 처리 (데이터를 동기화하기 전에 게시자에서 레코드가 삭제되었을 수 있음)
  • sp_MSdel_ [Schema] [TableName]- IF @@rowcount = 0 ... exec sp_MSreplraiserror ...적용되지 않은 삭제를 무시하도록 주석 처리 (데이터를 동기화하기 전에 게시자에서 레코드가 삭제되었을 수 있음)

sp_MSins_dboTableNotUsingSnap :

/* Customised Replication insert proc utilized to support adding to replication without a snapshot. */
create procedure [dbo].[sp_MSins_dboTableNotUsingSnap]     
    @c1 int,     
    @c2 varchar(4096),     
    @c3 datetime
AS 
BEGIN
    IF NOT EXISTS (SELECT 'row already exists' FROM [dbo].[TableNotUsingSnap] dest WITH (NOLOCK) WHERE dest.Id = @c1)
    BEGIN
        insert into [dbo].[TableNotUsingSnap]
            ([Id],
            [Note_Text],
            [Repl_Upsert_UTC]) 
        values 
            (@c1,
            @c2,
            @c3)  
    END
END
GO

sp_MSupd_dboTableNotUsingSnap :

/* Customised Replication insert proc utilized to support adding to replication without a snapshot. */
create procedure [dbo].[sp_MSupd_dboTableNotUsingSnap]     
    @c1 int = NULL,     
    @c2 varchar(4096) = NULL,     
    @c3 datetime = NULL, 
    @pkc1 int = NULL, 
    @bitmap binary(1)
AS 
BEGIN
    declare @primarykey_text nvarchar(100) = '' 

    if (substring(@bitmap,1,1) & 1 = 1)
    begin 
        update [dbo].[TableNotUsingSnap]
        set [Id] = case substring(@bitmap,1,1) & 1 when 1 then @c1 else [Id] end, 
            [Note_Text] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [Note_Text] end,
            [Repl_Upsert_UTC] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [Repl_Upsert_UTC] END
        WHERE [Id] = @pkc1

        /*  Commented out while adding to publication
        if @@rowcount = 0
            if @@microsoftversion>0x07320000
            Begin
                set @primarykey_text = @primarykey_text + '[id] = ' + convert(nvarchar(100),@pkc1,1)
                exec sp_MSreplraiserror @errorid=20598, @param1=N'[dbo].[TableNotUsingSnap]', @param2=@primarykey_text, @param3=13233
            End */
    END
    ELSE
    BEGIN
        update [dbo].[TableNotUsingSnap]
        set [Note_Text] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [Note_Text] end,
            [Repl_Upsert_UTC] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [Repl_Upsert_UTC] END
        WHERE [Id] = @pkc1

        /*  Commented out while adding to publication
        if @@rowcount = 0
            if @@microsoftversion>0x07320000
            Begin
                set @primarykey_text = @primarykey_text + '[id] = ' + convert(nvarchar(100),@pkc1,1)
                exec sp_MSreplraiserror @errorid=20598, @param1=N'[dbo].[TableNotUsingSnap]', @param2=@primarykey_text, @param3=13233
            End */
    end
END
GO

sp_MSdel_dboTableNotUsingSnap :

/* Customised Replication insert proc utilized to support adding to replication without a snapshot. */
create procedure [dbo].[sp_MSdel_dboTableNotUsingSnap]
    @pkc1 int
as
begin  
    declare @primarykey_text nvarchar(100) = ''

    delete [dbo].[TableNotUsingSnap]
    where [Id] = @pkc1

    /* ignore if the record doesn't exist when deleting it 
    if @@rowcount = 0
        if @@microsoftversion>0x07320000
        Begin
            set @primarykey_text = @primarykey_text + '[Id] = ' + convert(nvarchar(100),@pkc1,1)
            exec sp_MSreplraiserror @errorid=20598, @param1=N'[dbo].[TableNotUsingSnap]', @param2=@primarykey_text, @param3=13234
        End */
end
GO

배포 단계

3. 배포 에이전트 중지-배포자 (푸시) 또는 구독자 (풀)

/*  example script to add a table to a publication without running the snapshot agent
    Steps:
        Pre steps:
        1. Create table on subscribers
        2. Create replication procs on subscribers

        Deployment/Potential impact:
    **  3. Stop Distribution Agents to all subscribers for this publication
        4. Add article to publication on publisher
        5. DTS data from publisher to subscriber
        6. Start Distribution Agents to all subscribers for this publication
        7. Monitor/Verify all data has arrived

    =========================================================
    Note: check your publication settings:
          if @independent_agent = N'false'
            you will need to stop the distribution agent which will affect ALL
            publications going to that subscriber

          if @independent_agent = N'true'
            you will need to stop the publication specific distribution agent 
            (to each subscriber)

          Plan your live release around that knowledge!
*/

-- IF PUSH REPLICATION: RUN ON DISTRIBUTION SERVER
-- IF PULL REPLICATION: RUN ON SUBSCRIBER SERVER

/* disable the Job first */
exec msdb..sp_update_job @job_name = '[Distribution agent job]', @enabled = 0
GO

/* wait for 10 seconds - precaution ONLY */
WAITFOR DELAY '00:00:10.000'
GO

/* now stop the job */
exec msdb..sp_stop_job @job_name = '[Distribution agent job]'
GO

/* 
    NOTE: You might recieve an error about stopping a job that is already stopped.  You can ignore that error.
                It is up to you to verify that the job has been stopped correctly!
*/

4. 이제 출판물에 기사를 추가하십시오-출판사

주요 매개 변수 :

  • sp_addarticle- @pre_creation_cmd = N'none'배포 에이전트가 자체 개체를 삭제 및 생성하지 않도록 지시하는 데 사용
  • sp_addsubscription- @sync_type = N'none'배포자에게 새 스냅 샷을 만들 필요가 없음을 알리는 데 사용되며 IUD 명령을 대기열에 넣을 수 있습니다.

sp_addarticle :

exec sp_addarticle 
    @publication = N'Publication Name',
    @article = N'TableNotUsingSnap',
    @source_owner = N'dbo',
    @source_object = N'TableNotUsingSnap',
    @type = N'logbased',
    @description = N'',
    @creation_script = N'',
    @pre_creation_cmd = N'none',        /* this is a critical flag - tells SQL Server to not drop/recreate the repl procs/object on the subscriber */
    @schema_option = 0x0000000008004093,
    @identityrangemanagementoption = N'none',
    @destination_table = N'TableNotUsingSnap',
    @destination_owner = N'dbo',
    @status = 16,
    @vertical_partition = N'false',
    @ins_cmd = N'CALL [sp_MSins_dboTableNotUsingSnap]',
    @del_cmd = N'CALL [sp_MSdel_dboTableNotUsingSnap]',
    @upd_cmd = N'SCALL [sp_MSupd_dboTableNotUsingSnap]'
GO

-- Adding the transactional subscriptions
exec sp_addsubscription @publication = N'Publication Name',
    @subscriber = N'Subscriber Server',
    @destination_db = N'Subscriber DB',
    @subscription_type = N'Push',
    @sync_type = N'none',               /* tell SQL Server not to sync/snapshot this change to the publication */
    @article = N'all',
    @update_mode = N'read only',
    @subscriber_type = 0
GO

5. 데이터 동기화

이제 데이터를 가입자에게 복사해야합니다.

  • 연결된 서버를 만들어서 복사
  • 내보내기 / 가져 오기 마법사 사용
  • 백업 복원 및 차이점 적용
  • SSMS 툴팩 'Generate Insert Statements ...'를 사용하여 테이블을 추출하십시오.

내가 사용하는 정확한 방법은 독자에게 맡기고 배포 에이전트를 얼마나 오래 기꺼이 중단 하느냐에 달려 있습니다.

EXTRA : 테스트의 추가 단계로서, (Table NotUsingSnap)에서 IUD 작업을 생성하기 위해 스크립트를 실행하는 단계 (B)에서이 방법에 대한 신뢰를 얻을 수있는 좋은 곳입니다.

6. 배포 에이전트 다시 시작-배포자 (푸시) 또는 구독자 (풀)

/*  example script to add a table to a publication without running the snapshot agent
    Steps:
        Pre steps:
        1. Create table on subscribers
        2. Create replication procs on subscribers

        Deployment/Potential impact:
        3. Stop Distribution Agents to all subscribers for this publication
        4. Add article to publication on publisher
        5. DTS data from publisher to subscriber
    **  6. Start Distribution Agents to all subscribers for this publication
        7. Monitor/Verify all data has arrived

    =========================================================
    Note: check your publication settings:
          if @independent_agent = N'false'
            you will need to stop the distribution agent which will affect ALL
            publications going to that subscriber

          if @independent_agent = N'true'
            you will need to stop the publication specific distribution agent 
            (to each subscriber)

          Plan your live release around that knowledge!
*/

-- IF PUSH REPLICATION: RUN ON DISTRIBUTION SERVER
-- IF PULL REPLICATION: RUN ON SUBSCRIBER SERVER

/* disable the Job first */
exec msdb..sp_update_job @job_name = 'Distribution agent job', @enabled = 1
GO

/* wait for 10 seconds - precaution ONLY */
WAITFOR DELAY '00:00:10.000'
GO

/* now stop the job */
exec msdb..sp_start_job @job_name = 'Distribution agent job'
GO

/* 
    Now go and make sure everything is working ok!
*/
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.