다음을 통해 공유


구독 다시 초기화

적용 대상:SQL ServerAzure SQL Database

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

참고 항목

Azure SQL Managed Instance는 스냅샷 및 트랜잭션 복제를 위한 게시자, 배포자 및 구독자일 수 있습니다. Azure SQL Database의 데이터베이스는 스냅샷 및 트랜잭션 복제를 위한 밀어넣기 구독자만 될 수 있습니다. 자세한 내용은 Azure SQL Database 및 Azure SQL Managed Instance를 사용한 트랜잭션 복제를 참조하세요.

SQL Server Management Studio 사용

구독 다시 초기화는 두 부분으로 구성된 프로세스입니다.

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

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

    새 스냅샷 사용
    새 스냅샷을 사용하여 구독을 다시 초기화하려면 선택합니다. 스냅샷 에이전트에서 생성된 후에만 구독자에 스냅샷을 적용할 수 있습니다. 스냅샷 에이전트가 일정에 따라 실행되도록 설정된 경우 예약된 다음 스냅샷 에이전트가 실행될 때까지 구독이 다시 초기화되지 않습니다. 지금 새 스냅샷 생성을 선택하여 스냅샷 에이전트를 즉시 시작합니다.

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

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

  2. 구독이 다음에 동기화될 때 다시 초기화됩니다. 배포 에이전트(트랜잭션 복제의 경우) 또는 병합 에이전트(병합 복제의 경우)는 최신 스냅샷을 다시 초기화하도록 표시된 구독이 있는 각 구독자에 적용합니다. 구독 동기화에 대한 자세한 내용은 밀어넣기 구독 동기화 및 끌어오기 구독 동기화를 참조하세요.

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. (선택 사항) 구독자에서 배포 에이전트를 시작하여 구독을 동기화합니다. 자세한 내용은 끌어오기 구독 동기화를 참조 하세요.

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

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

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

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

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

    Important

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

  2. (선택 사항) 구독자에서 병합 에이전트를 시작하여 구독을 동기화합니다. 자세한 내용은 끌어오기 구독 동기화를 참조 하세요.

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

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

    Important

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

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

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

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

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

    • 0 - 구독이 게시 변경에 필요한 대로 자동으로 다시 초기화되면 구독자의 변경 내용이 삭제됩니다.

    Important

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

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

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

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

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

    • 0 - 구독이 게시 변경에 필요한 대로 자동으로 다시 초기화되면 구독자의 변경 내용이 삭제됩니다.

    Important

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

    자세한 내용은 게시 속성 보기 및 수정을 참조 하세요.

RMO(복제 관리 개체) 사용

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

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

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

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

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

    참고 항목

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

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

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

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

  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. 끌어오기 구독을 동기화합니다. 자세한 내용은 끌어오기 구독 동기화를 참조 하세요.

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

  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 = "AdventureWorks2022";
String subscriptionDbName = "AdventureWorks2022Replica";

// 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 = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"

' 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 = "AdventureWorks2022";
String subscriptionDbName = "AdventureWorks2022Replica";

// 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 = "AdventureWorks2022"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"

' 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

참고 항목

구독 다시 초기화
Replication Management Objects Concepts
복제 보안을 위한 최선의 구현 방법