다음을 통해 공유


구독 다시 초기화

이 항목에서는 SQL Server Management Studio, Transact-SQL 또는 RMO(복제 관리 개체)를 사용하여 2014년 SQL Server 구독을 다시 초기화하는 방법에 대해 설명합니다. 각 게시를 다시 초기화하도록 표시하여 다음 동기화 중에 새 스냅샷을 적용할 수 있습니다.

항목 내용

SQL Server Management Studio 사용

구독을 다시 초기화하는 프로세스는 두 부분으로 구성되어 있습니다.

  1. 게시에 대한 단일 구독이나 모든 구독을 다시 초기화하도록 표시 합니다. Microsoft SQL Server Management Studio의 로컬 게시 폴더와 로컬 구독 폴더에서 사용할 수 있는 구독 다시 초기화 대화 상자에서 다시 초기화할 구독을 표시합니다. 또한 모든 구독 탭 및 복제 모니터의 게시 노드에서 구독을 표시할 수 있습니다. 복제 모니터를 시작하는 방법은 복제 모니터 시작을 참조하세요. 구독을 다시 초기화하도록 표시할 때는 다음과 같은 옵션을 선택할 수 있습니다.

    현재 스냅샷 사용
    다음에 배포 에이전트 또는 병합 에이전트가 실행될 때 현재 스냅샷을 구독자에 적용하려면 이 옵션을 선택합니다. 유효한 스냅샷이 없으면 이 옵션을 선택할 수 없습니다.

    새 스냅샷 사용
    새 스냅샷으로 구독을 다시 초기화하려면 이 옵션을 선택합니다. 스냅샷 에이전트에 의해 스냅샷이 생성된 후에만 스냅샷을 구독자에 적용할 수 있습니다. 스냅샷 에이전트가 예약 실행되도록 설정한 경우에는 예약된 다음 스냅샷 에이전트가 실행될 때까지 구독이 다시 초기화되지 않습니다. 스냅샷 에이전트를 바로 시작하려면 지금 새 스냅샷 생성 을 선택합니다.

    다시 초기화하기 전에 동기화되지 않은 변경 내용 업로드
    병합 복제에 대해서만 사용할 수 있습니다. 구독자의 데이터를 스냅샷으로 덮어쓰기 전에 보류 중인 구독 데이터베이스의 변경 내용을 업로드하려면 이 옵션을 선택합니다.

    매개 변수가 있는 필터를 추가, 삭제 또는 변경할 경우 다시 초기화를 진행하는 동안에는 보류 중인 구독자의 변경 내용을 게시자로 업로드할 수 없습니다. 보류 중인 변경 내용을 업로드하려면 필터를 변경하기 전에 모든 구독을 동기화하세요.

  2. 구독이 다음에 동기화될 때 다시 초기화됩니다. 배포 에이전트(트랜잭션 복제의 경우) 또는 병합 에이전트(병합 복제의 경우)는 최신 스냅샷을 다시 초기화하도록 표시된 구독이 있는 각 구독자에 적용합니다. 구독 동기화 방법은 Synchronize a Push SubscriptionSynchronize a Pull Subscription대화 상자에서 다시 초기화할 구독을 표시합니다.

Management Studio에서 단일 밀어넣기 또는 끌어오기 구독을 다시 초기화하도록 표시하려면(게시자)

  1. Management Studio에서 게시자에 연결한 다음 해당 서버 노드를 확장합니다.

  2. 복제 폴더를 확장한 다음 로컬 게시 폴더를 확장합니다.

  3. 다시 초기화할 구독이 있는 게시를 확장합니다.

  4. 구독을 마우스 오른쪽 단추로 클릭한 다음 다시 초기화를 클릭합니다.

  5. 구독 다시 초기화 대화 상자에서 옵션을 선택한 다음 다시 초기화 표시를 클릭합니다.

Management Studio에서 단일 끌어오기 구독을 다시 초기화하도록 표시하려면(구독자)

  1. Management Studio에서 구독자에 연결한 다음 해당 서버 노드를 확장합니다.

  2. 복제 폴더를 확장한 다음 로컬 구독 폴더를 확장합니다.

  3. 구독을 마우스 오른쪽 단추로 클릭한 다음 다시 초기화를 클릭합니다.

  4. 확인 대화 상자가 표시되면 를 클릭합니다.

Management Studio에서 모든 구독을 다시 초기화하도록 표시하려면

  1. Management Studio에서 게시자에 연결한 다음 해당 서버 노드를 확장합니다.

  2. 복제 폴더를 확장한 다음 로컬 게시 폴더를 확장합니다.

  3. 다시 초기화할 구독이 있는 게시를 마우스 오른쪽 단추로 클릭한 다음 모든 구독 다시 초기화를 클릭합니다.

  4. 구독 다시 초기화 대화 상자에서 옵션을 선택한 다음 다시 초기화 표시를 클릭합니다.

복제 모니터에서 단일 밀어넣기 또는 끌어오기 구독을 다시 초기화하도록 표시하려면

  1. 복제 모니터에서 왼쪽 창의 게시자 그룹을 확장하고 해당 게시자를 확장한 다음 해당 게시를 클릭합니다.

  2. 모든 구독 탭을 클릭합니다.

  3. 다시 초기화할 구독을 마우스 오른쪽 단추로 클릭한 다음 구독 다시 초기화를 클릭합니다.

  4. 구독 다시 초기화 대화 상자에서 옵션을 선택한 다음 다시 초기화 표시를 클릭합니다.

복제 모니터에서 모든 구독을 다시 초기화하도록 표시하려면

  1. 복제 모니터에서 왼쪽 창의 게시자 그룹을 확장한 다음 게시자를 확장합니다.

  2. 다시 초기화할 구독이 있는 게시를 마우스 오른쪽 단추로 클릭한 다음 모든 구독 다시 초기화를 클릭합니다.

  3. 구독 다시 초기화 대화 상자에서 옵션을 선택한 다음 다시 초기화 표시를 클릭합니다.

Transact-SQL 사용

복제 저장 프로시저를 사용하여 프로그래밍 방식으로 게시를 다시 초기화할 수 있습니다. 사용되는 저장 프로시저는 구독의 유형(밀어넣기 또는 끌어오기) 및 구독이 속한 게시의 유형에 따라 다릅니다.

트랜잭션 게시에 대한 끌어오기 구독을 다시 초기화하려면

  1. 구독 데이터베이스의 구독자에서 sp_reinitpullsubscription(Transact-SQL)를 실행합니다. @publisher, @publisher_db@publication 지정합니다. 이렇게 하면 다음 배포 에이전트 실행 시 구독을 다시 초기화하도록 표시됩니다.

  2. 필요에 따라 구독자에서 배포 에이전트를 시작하여 구독을 동기화합니다. 자세한 내용은 Synchronize a Pull Subscription을 참조하세요.

트랜잭션 게시에 대한 밀어넣기 구독을 다시 초기화하려면

  1. 게시자에서 sp_reinitsubscription(Transact-SQL)를 실행합니다. @publication, @subscriber@destination_db 지정합니다. 이렇게 하면 다음 배포 에이전트 실행 시 구독을 다시 초기화하도록 표시됩니다.

  2. 필요에 따라 배포자에서 배포 에이전트를 시작하여 구독을 동기화합니다. 자세한 내용은 밀어넣기 구독 동기화을 참조하세요.

병합 게시에 대한 끌어오기 구독을 다시 초기화하려면

  1. 구독 데이터베이스의 구독자에서 sp_reinitmergepullsubscription(Transact-SQL)를 실행합니다. @publisher, @publisher_db@publication 지정합니다. 다시 초기화하기 전에 구독자에서 변경 내용을 업로드하려면 @upload_first 값을 true 지정합니다. 이렇게 하면 다음 병합 에이전트 실행 시 구독을 다시 초기화하도록 표시됩니다.

    중요

    매개 변수가 있는 필터를 추가, 삭제 또는 변경할 경우 다시 초기화를 진행하는 동안에는 보류 중인 구독자의 변경 내용을 게시자로 업로드할 수 없습니다. 보류 중인 변경 내용을 업로드하려면 필터를 변경하기 전에 모든 구독을 동기화하세요.

  2. 필요에 따라 구독자에서 병합 에이전트를 시작하여 구독을 동기화합니다. 자세한 내용은 Synchronize a Pull Subscription을 참조하세요.

병합 게시에 대한 밀어넣기 구독을 다시 초기화하려면

  1. 게시자에서 sp_reinitmergesubscription(Transact-SQL)를 실행합니다. @publication, @subscriber@subscriber_db 지정합니다. 다시 초기화하기 전에 구독자에서 변경 내용을 업로드하려면 @upload_first 값을 true 지정합니다. 이렇게 하면 다음 배포 에이전트 실행 시 구독을 다시 초기화하도록 표시됩니다.

    중요

    매개 변수가 있는 필터를 추가, 삭제 또는 변경할 경우 다시 초기화를 진행하는 동안에는 보류 중인 구독자의 변경 내용을 게시자로 업로드할 수 없습니다. 보류 중인 변경 내용을 업로드하려면 필터를 변경하기 전에 모든 구독을 동기화하세요.

  2. 필요에 따라 배포자에서 병합 에이전트를 시작하여 구독을 동기화합니다. 자세한 내용은 밀어넣기 구독 동기화을 참조하세요.

새 병합 게시를 만들 때 다시 초기화 정책을 설정하려면

  1. 게시 데이터베이스의 게시자에서 sp_addmergepublication 실행하고 @automatic_reinitialization_policy 다음 값 중 하나를 지정합니다.

    • 1 - 게시의 변경으로 의해 구독이 자동으로 다시 초기화되기 전에 구독자의 변경 내용이 업로드됩니다.

    • 0 - 게시의 변경으로 인해 구독이 자동으로 다시 초기화될 때 구독자의 변경 내용이 삭제됩니다.

    중요

    매개 변수가 있는 필터를 추가, 삭제 또는 변경할 경우 다시 초기화를 진행하는 동안에는 보류 중인 구독자의 변경 내용을 게시자로 업로드할 수 없습니다. 보류 중인 변경 내용을 업로드하려면 필터를 변경하기 전에 모든 구독을 동기화하세요.

    자세한 내용은 게시 만들기를 참조하세요.

기존 병합 게시에 대한 다시 초기화 정책을 변경하려면

  1. 게시 데이터베이스의 게시자에서 sp_changemergepublication 실행하여 @propertyautomatic_reinitialization_policy 지정하고 @value 다음 값 중 하나를 지정합니다.

    • 1 - 게시의 변경으로 의해 구독이 자동으로 다시 초기화되기 전에 구독자의 변경 내용이 업로드됩니다.

    • 0 - 게시의 변경으로 인해 구독이 자동으로 다시 초기화될 때 구독자의 변경 내용이 삭제됩니다.

    중요

    매개 변수가 있는 필터를 추가, 삭제 또는 변경할 경우 다시 초기화를 진행하는 동안에는 보류 중인 구독자의 변경 내용을 게시자로 업로드할 수 없습니다. 보류 중인 변경 내용을 업로드하려면 필터를 변경하기 전에 모든 구독을 동기화하세요.

    자세한 내용은 View and Modify Publication Properties을 참조하세요.

RMO(복제 관리 개체) 사용

각 게시를 다시 초기화하도록 표시하여 다음 동기화 중에 새 스냅샷을 적용할 수 있습니다. RMO(복제 관리 개체)를 사용하여 프로그래밍 방식으로 구독을 다시 초기화할 수 있습니다. 사용되는 클래스는 구독이 속한 게시의 유형과 구독의 유형(밀어넣기 또는 끌어오기 구독)에 따라 다릅니다.

트랜잭션 게시에 대한 끌어오기 구독을 다시 초기화하려면

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

  2. TransPullSubscription 클래스의 인스턴스를 만들고, PublicationName, DatabaseName, PublisherName, PublicationDBNameConnectionContext에 대해 1단계에서 만든 연결을 설정합니다.

  3. LoadProperties 메서드를 호출하여 개체 속성을 가져옵니다.

    참고

    이 메서드가 false를 반환하는 경우 2단계에서 구독 속성이 올바르게 정의되지 않았거나 끌어오기 구독이 없는 것입니다.

  4. Reinitialize 메서드를 호출합니다. 이 메서드는 구독을 다시 초기화하도록 표시합니다.

  5. 끌어오기 구독을 동기화합니다. 자세한 내용은 Synchronize a Pull Subscription을 참조하세요.

트랜잭션 게시에 대한 밀어넣기 구독을 다시 초기화하려면

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

  2. TransSubscription 클래스의 인스턴스를 만들고, PublicationName, DatabaseName, SubscriberName, SubscriptionDBNameConnectionContext에 대해 1단계에서 만든 연결을 설정합니다.

  3. LoadProperties 메서드를 호출하여 개체 속성을 가져옵니다.

    참고

    이 메서드가 false를 반환하는 경우 2단계에서 구독 속성이 올바르게 정의되지 않았거나 밀어넣기 구독이 없는 것입니다.

  4. Reinitialize 메서드를 호출합니다. 이 메서드는 구독을 다시 초기화하도록 표시합니다.

  5. 밀어넣기 구독을 동기화합니다. 자세한 내용은 밀어넣기 구독 동기화을 참조하세요.

병합 게시에 대한 끌어오기 구독을 다시 초기화하려면

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

  2. MergePullSubscription 클래스의 인스턴스를 만들고, PublicationName, DatabaseName, PublisherName, PublicationDBNameConnectionContext에 대해 1단계에서 만든 연결을 설정합니다.

  3. LoadProperties 메서드를 호출하여 개체 속성을 가져옵니다.

    참고

    이 메서드가 false를 반환하는 경우 2단계에서 구독 속성이 올바르게 정의되지 않았거나 끌어오기 구독이 없는 것입니다.

  4. Reinitialize 메서드를 호출합니다. 다시 초기화하기 전에 구독자의 변경 내용을 업로드하려면 true 값을 전달하고, 다시 초기화할 때 보류 중인 모든 변경 내용을 무시하려면 false를 전달합니다. 이 메서드는 구독을 다시 초기화하도록 표시합니다.

    참고

    구독이 만료되면 변경 내용을 업로드할 수 없습니다. 자세한 내용은 Set the Expiration Period for Subscriptions을 참조하세요.

  5. 끌어오기 구독을 동기화합니다. 자세한 내용은 Synchronize a Pull Subscription을 참조하세요.

병합 게시에 대한 밀어넣기 구독을 다시 초기화하려면

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

  2. MergeSubscription 클래스의 인스턴스를 만들고, PublicationName, DatabaseName, SubscriberName, SubscriptionDBNameConnectionContext에 대해 1단계에서 만든 연결을 설정합니다.

  3. LoadProperties 메서드를 호출하여 개체 속성을 가져옵니다.

    참고

    이 메서드가 false를 반환하는 경우 2단계에서 구독 속성이 올바르게 정의되지 않았거나 밀어넣기 구독이 없는 것입니다.

  4. Reinitialize 메서드를 호출합니다. 다시 초기화하기 전에 구독자의 변경 내용을 업로드하려면 true 값을 전달하고, 다시 초기화할 때 보류 중인 모든 변경 내용을 무시하려면 false를 전달합니다. 이 메서드는 구독을 다시 초기화하도록 표시합니다.

    참고

    구독이 만료되면 변경 내용을 업로드할 수 없습니다. 자세한 내용은 Set the Expiration Period for Subscriptions을 참조하세요.

  5. 밀어넣기 구독을 동기화합니다. 자세한 내용은 밀어넣기 구독 동기화을 참조하세요.

예(RMO)

다음 예에서는 트랜잭션 게시에 대한 끌어오기 구독을 다시 초기합니다.

// Define server, publication, and database names.
String subscriberName = subscriberInstance;
String publisherName = publisherInstance;
String publicationName = "AdvWorksProductTran";
String publicationDbName = "AdventureWorks2012";
String subscriptionDbName = "AdventureWorks2012Replica";

// Create a connection to the Subscriber.
ServerConnection conn = new ServerConnection(subscriberName);

TransPullSubscription subscription;

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

    // Define subscription properties.
    subscription = new TransPullSubscription();
    subscription.ConnectionContext = conn;
    subscription.DatabaseName = subscriptionDbName;
    subscription.PublisherName = publisherName;
    subscription.PublicationDBName = publicationDbName;
    subscription.PublicationName = publicationName;

    // If the pull subscription and the job exists, mark the subscription
    // for reinitialization and start the agent job.
    if (subscription.LoadProperties() && subscription.AgentJobId != null)
    {
        subscription.Reinitialize();
        subscription.SynchronizeWithJob();
    }
    else
    {
        // Do something here if the subscription does not exist.
        throw new ApplicationException(String.Format(
            "A subscription to '{0}' does not exists on {1}",
            publicationName, subscriberName));
    }
}
catch (Exception ex)
{
    // Do appropriate error handling here.
    throw new ApplicationException("The subscription could not be reinitialized.", ex);
}
finally
{
    conn.Disconnect();
}
' Define server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2012"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"

' Create a connection to the Subscriber.
Dim conn As ServerConnection = New ServerConnection(subscriberName)

Dim subscription As TransPullSubscription

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

    ' Define subscription properties.
    subscription = New TransPullSubscription()
    subscription.ConnectionContext = conn
    subscription.DatabaseName = subscriptionDbName
    subscription.PublisherName = publisherName
    subscription.PublicationDBName = publicationDbName
    subscription.PublicationName = publicationName

    ' If the pull subscription and the job exists, mark the subscription
    ' for reinitialization and start the agent job.
    If subscription.LoadProperties() And (Not subscription.AgentJobId Is Nothing) Then
        subscription.Reinitialize()
        subscription.SynchronizeWithJob()
    Else
        ' Do something here if the subscription does not exist.
        Throw New ApplicationException(String.Format( _
         "A subscription to '{0}' does not exists on {1}", _
         publicationName, subscriberName))
    End If
Catch ex As Exception
    ' Do appropriate error handling here.
    Throw New ApplicationException("The subscription could not be reinitialized.", ex)
Finally
    conn.Disconnect()
End Try

다음 예에서는 구독자에서 보류 중인 변경 내용을 먼저 업로드한 다음 병합 게시에 대한 끌어오기 구독을 다시 초기화합니다.

// Define server, publication, and database names.
String subscriberName = subscriberInstance;
String publisherName = publisherInstance;
String publicationName = "AdvWorksSalesOrdersMerge";
String publicationDbName = "AdventureWorks2012";
String subscriptionDbName = "AdventureWorks2012Replica";

// Create a connection to the Subscriber.
ServerConnection conn = new ServerConnection(subscriberName);

MergePullSubscription subscription;

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

    // Define subscription properties.
    subscription = new MergePullSubscription();
    subscription.ConnectionContext = conn;
    subscription.DatabaseName = subscriptionDbName;
    subscription.PublisherName = publisherName;
    subscription.PublicationDBName = publicationDbName;
    subscription.PublicationName = publicationName;

    // If the pull subscription and the job exists, mark the subscription
    // for reinitialization after upload and start the agent job.
    if (subscription.LoadProperties() && subscription.AgentJobId != null)
    {
        subscription.Reinitialize(true);
        subscription.SynchronizeWithJob();
    }
    else
    {
        // Do something here if the subscription does not exist.
        throw new ApplicationException(String.Format(
            "A subscription to '{0}' does not exists on {1}",
            publicationName, subscriberName));
    }
}
catch (Exception ex)
{
    // Do appropriate error handling here.
    throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
    conn.Disconnect();
}
' Define server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2012"
Dim subscriptionDbName As String = "AdventureWorks2012Replica"

' Create a connection to the Subscriber.
Dim conn As ServerConnection = New ServerConnection(subscriberName)

Dim subscription As MergePullSubscription

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

    ' Define subscription properties.
    subscription = New MergePullSubscription()
    subscription.ConnectionContext = conn
    subscription.DatabaseName = subscriptionDbName
    subscription.PublisherName = publisherName
    subscription.PublicationDBName = publicationDbName
    subscription.PublicationName = publicationName

    ' If the pull subscription and the job exists, mark the subscription
    ' for reinitialization after upload and start the agent job.
    If subscription.LoadProperties() And (Not subscription.AgentJobId Is Nothing) Then
        subscription.Reinitialize(True)
        subscription.SynchronizeWithJob()
    Else
        ' Do something here if the subscription does not exist.
        Throw New ApplicationException(String.Format( _
         "A subscription to '{0}' does not exists on {1}", _
         publicationName, subscriberName))
    End If
Catch ex As Exception
    ' Do appropriate error handling here.
    Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
    conn.Disconnect()
End Try

참고 항목

구독 다시 초기화
복제 관리 개체 개념
복제 보안을 위한 최선의 구현 방법