초기 스냅샷 만들기 및 적용

적용 대상:SQL ServerAzure SQL Managed Instance

이 항목에서는 SQL Server Management Studio, Transact-SQL 또는 RMO(복제 관리 개체)를 사용하여 SQL Server에서 초기 스냅샷 만들고 적용하는 방법을 설명합니다. 매개 변수가 있는 필터를 사용하는 병합 게시에는 두 부분으로 구성된 스냅샷 필요합니다. 자세한 내용은 매개 변수가 있는 필터로 병합 게시에 대한 스냅샷 만들기을 참조하세요.
스냅샷은 게시를 만든 후 스냅샷 에이전트 의해 생성됩니다. 다음을 생성할 수 있습니다.

병합 복제본(replica) 경우 스냅샷 에이전트 실행될 때마다 스냅샷 생성됩니다. 트랜잭션 복제본(replica) 경우 스냅샷 생성은 게시 속성 immediate_sync 설정에 따라 달라집니다. 속성이 TRUE(새 게시 마법사를 사용하는 경우 기본값)로 설정된 경우 스냅샷 에이전트 실행될 때마다 스냅샷 생성되며 언제든지 구독자에 적용할 수 있습니다. 이 속성을 FALSE( sp_addpublication사용 시 기본 설정)로 설정하면 스냅샷 에이전트가 마지막으로 실행된 후에 새 구독이 추가된 경우에만 스냅샷이 생성됩니다. 구독자는 동기화하기 위해 스냅샷 에이전트가 완료될 때까지 기다려야 합니다.

기본적으로 스냅샷이 생성되면 그 스냅샷은 배포자에 위치한 기본 스냅샷 폴더에 저장됩니다. 이동식 디스크나 CD-ROM과 같은 이동식 미디어 또는 기본 스냅샷 폴더 이외의 위치에 스냅샷 파일을 저장할 수도 있습니다. 또한 파일을 더 쉽게 저장 및 전송할 수 있도록 압축하고 구독자에서 스냅샷 적용하기 전이나 후에 스크립트를 실행할 수 있습니다. 이러한 옵션에 대한 자세한 내용은 스냅샷 옵션을 참조 하세요.

매개 변수가 있는 필터를 사용하는 병합 게시에 대한 스냅샷 경우 두 부분으로 구성된 프로세스를 사용하여 스냅샷 만들어집니다. 먼저 게시된 개체의 데이터를 제외하고 복제 스크립트와 스키마를 포함하는 스키마 스냅샷이 생성됩니다. 그런 다음 각 구독은 스키마 스냅샷 복사한 스크립트 및 스키마와 구독의 파티션에 속한 데이터를 포함하는 스냅샷 사용하여 초기화됩니다. 자세한 내용은 매개 변수가 있는 필터를 사용하여 병합 게시에 대한 스냅샷을 참조 하세요.

스냅샷이 게시자에 생성된 다음 기본 또는 대체 스냅샷 위치에 저장되면 스냅샷을 구독자로 전송하고 적용할 수 있습니다. 배포 에이전트(스냅샷 또는 트랜잭션 복제본(replica)tion의 경우) 또는 병합 에이전트(병합 복제본(replica)tion의 경우)는 스냅샷 전송하고 초기 동기화 중에 구독자의 구독 데이터베이스에 스키마 및 데이터 파일을 적용합니다. 새 구독 마법사를 사용할 경우 초기 동기화는 기본적으로 구독이 생성되는 즉시 발생합니다. 이 동작은 마법사의 구독 초기화 페이지에서 초기화 옵션에 의해 제어됩니다 . 구독이 초기화된 후 스냅샷 생성되는 경우 구독이 다시 초기화되도록 표시되지 않는 한 구독자에 적용되지 않습니다. 자세한 내용은 구독 다시 초기화를 참조하세요.

배포 에이전트 또는 병합 에이전트 초기 스냅샷 적용한 후 에이전트는 후속 업데이트 및 기타 데이터 수정 사항을 전파합니다. 스냅샷 배포되고 구독자에 적용되는 경우 초기 또는 새 스냅샷 기다리는 구독자만 영향을 받습니다. 해당 게시에 대한 다른 구독자(게시된 데이터에 대한 삽입, 업데이트, 삭제, 기타 수정 사항을 이미 받은 구독자)는 영향을 받지 않습니다.

기본 스냅샷 폴더 위치를 보거나 수정하려면 다음을 참조하세요.

기본 스냅샷 위치

배포 구성 마법사의 스냅샷 폴더 페이지에서 기본 스냅샷 위치를 지정합니다. 이 마법사를 사용하는 방법에 대한 자세한 내용은 게시 및 배포 구성을 참조하세요. 배포자로 구성되지 않은 서버에 게시를 만드는 경우 새 게시 마법사의 스냅샷 폴더 페이지에서 기본 스냅샷 위치를 지정합니다. 이 마법사를 사용하는 방법에 대한 자세한 내용은 게시 만들기를 참조하세요.

배포자 속성 - <배포>자 대화 상자의 게시자 페이지에서 기본 스냅샷 위치를 수정합니다. 자세한 내용은 배포자 및 게시자 속성 보기 및 수정을 참조 하세요. 게시 속성 - <게시 대화 상자에서 각 게시에 대한 스냅샷 폴더를> 설정합니다. 자세한 내용은 게시 속성 보기 및 수정을 참조 하세요.

기본 스냅샷 위치 수정

  1. 배포자 속성 - <배포자> 대화 상자의 게시자 페이지에서 기본 스냅샷 위치를 변경할 게시자의 속성 단추(...)를 클릭합니다.

  2. 게시자 속성 - <게시자> 대화 상자에서 기본 스냅샷 폴더 속성의 값을 입력합니다.

    참고 항목

    스냅샷 에이전트 지정한 디렉터리에 대한 쓰기 권한이 있어야 하며 배포 에이전트 또는 병합 에이전트 읽기 권한이 있어야 합니다. 끌어오기 구독을 사용하는 경우 공유 디렉터리를 \\computername\스냅샷 같은 UNC(범용 명명 규칙) 경로로 지정해야 합니다. 자세한 내용은 스냅샷 폴더 보안을 참조 하세요.

  3. 확인을 선택합니다.

스냅샷 만들기

기본적으로 SQL Server 에이전트 실행 중인 경우 새 게시 마법사를 사용하여 게시를 만든 직후 스냅샷 에이전트 스냅샷 생성됩니다. 기본적으로 모든 구독에 대해 배포 에이전트(스냅샷 및 트랜잭션 복제본(replica)tion의 경우) 또는 병합 에이전트(병합 구독의 경우)에 의해 적용됩니다. SQL Server Management Studio 및 복제 모니터를 사용하여 스냅샷 생성할 수도 있습니다. 복제 모니터를 시작하는 방법은 복제 모니터 시작을 참조하세요.

SQL Server Management Studio 사용

  1. Management Studio에서 게시자에 커넥트 서버 노드를 확장합니다.
  2. 복제 폴더를 확장한 다음 로컬 게시 폴더를 확장합니다.
  3. 스냅샷을 생성할 게시를 마우스 오른쪽 단추로 클릭한 다음 스냅샷 에이전트 상태 보기를 클릭합니다.
  4. 보기 스냅샷 에이전트 상태 - <게시> 대화 상자에서 시작을 클릭합니다.
    스냅샷 에이전트 스냅샷 생성을 마치면 "[100%] 17개 아티클 중 스냅샷 생성되었습니다."와 같은 메시지가 표시됩니다.

복제 모니터에서

  1. 복제 모니터에서 왼쪽 창의 게시자 그룹을 확장한 다음 게시자를 확장합니다.
  2. 스냅샷을 생성할 게시를 마우스 오른쪽 단추로 클릭한 다음 스냅샷 생성을 클릭합니다.
  3. 스냅샷 에이전트 상태 보려면 에이전트 탭을 클릭합니다. 자세한 내용은 표에서 스냅샷 에이전트 마우스 오른쪽 단추로 클릭한 다음 세부 정보 보기를 클릭합니다.

Transact-SQL 사용

초기 스냅샷은 스냅샷 에이전트 작업을 만들고 실행하거나 배치 파일에서 스냅샷 에이전트 실행 파일을 실행하여 프로그래밍 방식으로 작성할 수 있습니다. 초기 스냅샷 생성되면 구독이 처음 동기화될 때 구독자에 전송되고 구독자에 적용됩니다. 명령 프롬프트 또는 일괄 처리 파일에서 스냅샷 에이전트 실행하는 경우 기존 스냅샷 유효하지 않을 때마다 에이전트를 다시 실행해야 합니다.

Important

가능한 경우 런타임 시 사용자에게 보안 자격 증명을 입력하라는 메시지가 표시됩니다. 스크립트 파일에 자격 증명을 저장해야 하는 경우 무단 액세스를 방지하기 위해 파일을 보호해야 합니다.

  1. 스냅샷, 트랜잭션 또는 병합 게시를 만듭니다. 자세한 내용은 게시 만들기를 참조하세요.

  2. sp_addpublication_스냅샷 실행(Transact-SQL). @publication 및 다음 매개 변수를 지정합니다.

    • 배포자에서 스냅샷 에이전트를 실행하는 Windows 인증 자격 증명을 지정하는@job_login .

    • 제공된 Windows 자격 증명의 암호인 @job_password.

    • (선택 사항) 에이전트가 게시자에 연결할 때 SQL Server 인증을 사용하는 경우 @publisher_security_mode 값은 0입니다. 이 경우 @publisher_login@publisher_password에 SQL Server 인증 로그인 정보도 지정해야 합니다.

    • (옵션) 스냅샷 에이전트 작업에 대한 동기화 일정. 자세한 내용은 Specify Synchronization Schedules을 참조하세요.

    Important

    원격 배포자를 사용하여 게시자를 구성할 때 job_login 및 job_password 비롯한 모든 매개 변수에 제공된 값은 일반 텍스트로 배포자로 전송됩니다. 이 저장 프로시저를 실행하기 전에 게시자와 해당 원격 배포자 간의 연결을 암호화해야 합니다. 자세한 내용은 데이터베이스 엔진(SQL Server 구성 관리자)에 대한 암호화된 커넥트온을 사용하도록 설정하세요.

  3. 게시에 아티클을 추가합니다. 자세한 내용은 아티클 정의를 참조 하세요.

  4. 게시 데이터베이스의 게시자에서 1단계의 @publication 값을 지정하여 sp_startpublication_스냅샷(Transact-SQL)를 실행합니다.

스냅샷 적용

SQL Server Management Studio 사용

  1. 스냅샷이 생성된 후에는 구독을 배포 에이전트나 병합 에이전트와 동기화하여 스냅샷을 적용합니다.

    • 에이전트가 지속적으로 실행되도록 설정된 경우(트랜잭션 복제본(replica)에 대한 기본값) 스냅샷 생성된 후 자동으로 적용됩니다.
    • 에이전트가 일정에 따라 실행되도록 설정된 경우 다음에 에이전트가 실행되도록 예약될 때 스냅샷 적용됩니다.
    • 에이전트가 요청 시 실행되도록 설정된 경우 다음에 에이전트를 실행할 때 적용됩니다.

    구독 동기화에 대한 자세한 내용은 밀어넣기 구독 동기화 및 끌어오기 구독 동기화를 참조하세요.

Transact-SQL 사용

  1. 스냅샷, 트랜잭션 또는 병합 게시를 만듭니다. 자세한 내용은 게시 만들기를 참조하세요.

  2. 게시에 아티클을 추가합니다. 자세한 내용은 아티클 정의를 참조 하세요.

  3. 명령 프롬프트 또는 배치 파일에서 snapshot.exe 를 실행하여 Replication Snapshot Agent를 시작하고 다음 명령줄 인수를 지정합니다.

    • -게시
    • -Publisher
    • -배포자
    • -PublisherDB
    • -ReplicationType

    SQL Server 인증을 사용하는 경우 다음 인수도 지정해야 합니다.

    • -DistributorLogin
    • -DistributorPassword
    • -DistributorSecurityMode = 0
    • -PublisherLogin
    • -PublisherPassword
    • -PublisherSecurityMode = 0

예제(Transact-SQL)

이 예제에서는 트랜잭션 게시를 만들고 새 게시에 대한 스냅샷 에이전트 작업을 추가하는 방법을 보여 줍니다(sqlcmd 스크립팅 변수 사용). 또한 이 예제에서는 작업을 시작합니다.

-- To avoid storing the login and password in the script file, the values 
-- are passed into SQLCMD as scripting variables. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022'; --publication database
SET @publication = N'AdvWorksCustomerTran'; -- transactional publication name
SET @login = $(Login);
SET @password = $(Password);

USE [AdventureWorks]

-- Enable transactional and snapshot replication on the publication database.
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname = N'publish',
  @value = N'true';

-- Execute sp_addlogreader_agent to create the agent job. 
EXEC sp_addlogreader_agent 
  @job_login = @login, 
  @job_password = @password,
  -- Explicitly specify the security mode used when connecting to the Publisher.
  @publisher_security_mode = 1;

-- Create new transactional publication, using the defaults. 
USE [AdventureWorks2022]
EXEC sp_addpublication 
  @publication = @publication, 
  @description = N'transactional publication';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

이 예제에서는 병합 게시를 만들고 sqlcmd 변수를 사용하여 게시에 대한 스냅샷 에이전트 작업을 추가합니다. 이 예제에서는 작업을 시작합니다.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022'; 
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @login = $(Login);
SET @password = $(Password);

-- Enable merge replication on the publication database.
USE master
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname=N'merge publish',
  @value = N'true';

-- Create new merge publication, using the defaults. 
USE [AdventureWorks]
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication.';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

다음 명령줄 인수는 스냅샷 에이전트 시작하여 병합 게시에 대한 스냅샷 생성합니다.

참고 항목

가독성을 향상시키기 위해 줄 바꿈이 추가되었습니다. 배치 파일에서 명령은 단일 행으로 작성해야 합니다.

  
REM -- Declare variables  
SET Publisher=%InstanceName%  
SET PublicationDB=AdventureWorks2022   
SET Publication=AdvWorksSalesOrdersMerge   
  
REM --Start the Snapshot Agent to generate the snapshot for AdvWorksSalesOrdersMerge.  
"C:\Program Files\Microsoft SQL Server\120\COM\SNAPSHOT.EXE" -Publication %Publication%   
-Publisher %Publisher% -Distributor %Publisher% -PublisherDB %PublicationDB%   
-ReplicationType 2 -OutputVerboseLevel 1 -DistributorSecurityMode 1  
  

RMO(복제 관리 개체) 사용

스냅샷 에이전트 게시를 만든 후 스냅샷 생성합니다. RMO(복제 관리 개체)를 사용하여 프로그래밍 방식으로 이러한 스냅샷 생성하고 관리 코드 액세스를 복제본(replica)tion 에이전트 기능에 직접 액세스할 수 있습니다. 사용하는 개체는 복제본(replica) 형식에 따라 달라집니다. 스냅샷 에이전트는 SnapshotGenerationAgent 개체를 사용하여 동기적으로 시작하거나 에이전트 작업을 사용하여 비동기적으로 시작할 수 있습니다. 초기 스냅샷 생성되면 구독이 처음 동기화될 때 구독자에 전송되고 구독자에 적용됩니다. 기존 스냅샷 더 이상 유효한 최신 데이터가 포함되지 않을 때마다 에이전트를 다시 실행해야 합니다. 자세한 내용은 게시 유지 관리를 참조 하세요.

Important

가능한 경우 런타임 시 사용자에게 보안 자격 증명을 입력하라는 메시지가 표시됩니다. 자격 증명을 저장해야 하는 경우 Microsoft Windows .NET Framework에서 제공하는 암호화 서비스를 사용합니다.

스냅샷 에이전트 작업을 시작하여 스냅샷 또는 트랜잭션 게시에 대한 초기 스냅샷을 생성하려면(비동기)

  1. ServerConnection 클래스를 사용하여 게시자 연결을 만듭니다.

  2. TransPublication 클래스의 인스턴스를 만듭니다. 게시에 Name 대한 속성 및 DatabaseName 속성을 설정하고 1단계에서 만든 연결로 속성을 설정합니다 ConnectionContext .

  3. 메서드를 LoadProperties 호출하여 개체의 다시 기본 속성을 로드합니다. 이 메서드가 false를 반환하는 경우 2단계의 게시 속성이 잘못 정의되었거나 게시가 존재하지 않습니다.

  4. SnapshotAgentExists 이 false면 호출 CreateSnapshotAgent 하여 이 게시에 대한 스냅샷 에이전트 작업을 만듭니다.

  5. 메서드를 StartSnapshotGenerationAgentJob 호출하여 이 게시에 대한 스냅샷 생성하는 에이전트 작업을 시작합니다.

  6. (선택 사항) 값 SnapshotAvailable 이 true면 구독자가 스냅샷 사용할 수 있습니다.

스냅샷 에이전트 실행하여 스냅샷 또는 트랜잭션 게시에 대한 초기 스냅샷 생성하려면(동기)

  1. 클래스의 인스턴스를 SnapshotGenerationAgent 만들고 다음 필수 속성을 설정합니다.

  2. 값 또는 TransactionalSnapshot 에 대한 ReplicationType값을 설정합니다.

  3. GenerateSnapshot 메서드를 호출합니다.

스냅샷 에이전트 작업을 시작하여 병합 게시에 대한 초기 스냅샷 생성하려면(비동기)

  1. ServerConnection 클래스를 사용하여 게시자 연결을 만듭니다.

  2. MergePublication 클래스의 인스턴스를 만듭니다. 게시에 Name 대한 속성 및 DatabaseName 속성을 설정하고 1단계에서 만든 연결로 속성을 설정합니다 ConnectionContext .

  3. 메서드를 LoadProperties 호출하여 개체의 다시 기본 속성을 로드합니다. 이 메서드가 false를 반환하는 경우 2단계의 게시 속성이 잘못 정의되었거나 게시가 존재하지 않습니다.

  4. SnapshotAgentExists 이 false면 호출 CreateSnapshotAgent 하여 이 게시에 대한 스냅샷 에이전트 작업을 만듭니다.

  5. 메서드를 StartSnapshotGenerationAgentJob 호출하여 이 게시에 대한 스냅샷 생성하는 에이전트 작업을 시작합니다.

  6. (선택 사항) 값 SnapshotAvailable 이 true면 구독자가 스냅샷 사용할 수 있습니다.

스냅샷 에이전트를 실행하여 병합 게시에 대한 초기 스냅샷을 생성하려면(동기)

  1. 클래스의 인스턴스를 SnapshotGenerationAgent 만들고 다음 필수 속성을 설정합니다.

  2. MergeReplicationType값을 설정합니다.

  3. GenerateSnapshot 메서드를 호출합니다.

예제(RMO)

이 예제에서는 스냅샷 에이전트 동기적으로 실행하여 트랜잭션 게시에 대한 초기 스냅샷 생성합니다.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;
string distributorName = publisherInstance;

SnapshotGenerationAgent agent;

try
{
    // Set the required properties for Snapshot Agent.
    agent = new SnapshotGenerationAgent();
    agent.Distributor = distributorName;
    agent.DistributorSecurityMode = SecurityMode.Integrated;
    agent.Publisher = publisherName;
    agent.PublisherSecurityMode = SecurityMode.Integrated;
    agent.Publication = publicationName;
    agent.PublisherDatabase = publicationDbName;
    agent.ReplicationType = ReplicationType.Transactional;

    // Start the agent synchronously.
    agent.GenerateSnapshot();

}
catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "A snapshot could not be generated for the {0} publication."
        , publicationName), ex);
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance
Dim distributorName As String = publisherInstance

Dim agent As SnapshotGenerationAgent

Try
    ' Set the required properties for Snapshot Agent.
    agent = New SnapshotGenerationAgent()
    agent.Distributor = distributorName
    agent.DistributorSecurityMode = SecurityMode.Integrated
    agent.Publisher = publisherName
    agent.PublisherSecurityMode = SecurityMode.Integrated
    agent.Publication = publicationName
    agent.PublisherDatabase = publicationDbName
    agent.ReplicationType = ReplicationType.Transactional

    ' Start the agent synchronously.
    agent.GenerateSnapshot()

Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
     "A snapshot could not be generated for the {0} publication." _
     , publicationName), ex)
End Try

이 예제에서는 에이전트 작업을 비동기적으로 시작하여 트랜잭션 게시에 대한 초기 스냅샷 생성합니다.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;

TransPublication publication;

// Create a connection to the Publisher using Windows Authentication.
ServerConnection conn;
conn = new ServerConnection(publisherName);

try
{
    // Connect to the Publisher.
    conn.Connect();

    // Set the required properties for an existing publication.
    publication = new TransPublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;

    if (publication.LoadProperties())
    {
        // Start the Snapshot Agent job for the publication.
        publication.StartSnapshotGenerationAgentJob();
    }
    else
    {
        throw new ApplicationException(String.Format(
            "The {0} publication does not exist.", publicationName));
    }
}
catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "A snapshot could not be generated for the {0} publication."
        , publicationName), ex);
}
finally
{
    conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance

Dim publication As TransPublication

' Create a connection to the Publisher using Windows Authentication.
Dim conn As ServerConnection
conn = New ServerConnection(publisherName)

Try
    ' Connect to the Publisher.
    conn.Connect()

    ' Set the required properties for an existing publication.
    publication = New TransPublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    If publication.LoadProperties() Then
        ' Start the Snapshot Agent job for the publication.
        publication.StartSnapshotGenerationAgentJob()
    Else
        Throw New ApplicationException(String.Format( _
         "The {0} publication does not exist.", publicationName))
    End If
Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
     "A snapshot could not be generated for the {0} publication." _
     , publicationName), ex)
Finally
    conn.Disconnect()
End Try

초기 스냅샷 적용할 때 차단

초기 스냅샷 적용하는 동안 구독자의 데이터베이스 하나에 데이터를 게시하는 여러 게시가 있는 경우 한 번에 하나의 게시만 해당 스냅샷 적용할 수 있습니다.

SQL 작업을 검토할 때 다음과 유사한 대기 리소스가 표시 될 수 있습니다.

앱: 18:16384:[스냅샷_delivery_in_progress_Tr]:(9bcdaf92)
APP: 5:16384:[스냅샷_delivery_in_progress_Er]:(3c3b7db9
)

잠금 동작에 대한 쿼리는 다음과 유사한 리소스를 표시할 수 있습니다.

APP 16384:[appname]:(fbe42d68) XAPP 16384:[스냅샷_del]:(9bcdaf92) X

이 동작은 의도된 것입니다.  애플리케이션 잠금은 여러 복제본(replica) 에이전트가 서로 다른 게시의 스냅샷 동일한 구독자 데이터베이스에 동시에 적용하지 못하도록 하는 데 사용되기 때문입니다.  애플리케이션 잠금에는 구독자 데이터베이스의 이름이 포함되어 있으므로 동일한 구독자 데이터베이스에 게시되는 모든 게시에 영향을 줍니다.  그 결과 지정된 시간에 구독자 데이터베이스에 스냅샷 하나만 삽입할 수 있습니다.

이 상황에서는 복제본(replica) 에이전트가 서로 교착 상태에 빠질 가능성을 방지하기 위해 배타적 잠금이 사용됩니다.

이 문제를 해결하려면 각 게시에 대해 다른 구독자 데이터베이스를 지정합니다.

참고 항목

게시 만들기
끌어오기 구독 만들기
밀어넣기 구독 만들기
동기화 일정 지정
스냅샷을 사용하여 구독 초기화
Replication Management Objects Concepts
복제 보안을 위한 최선의 구현 방법
Replication System Stored Procedures Concepts
스크립팅 변수와 함께 sqlcmd 사용