다음을 통해 공유


구독 다시 초기화

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

항목 내용

  • 다음을 사용하여 구독을 다시 초기화하려면

    SQL Server Management Studio

    Transact-SQL

    RMO(복제 관리 개체)

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. 구독 다시 초기화 대화 상자에서 옵션을 선택한 다음 다시 초기화 표시를 클릭합니다.

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘[Top]

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로 지정합니다. 이렇게 하면 다음 병합 에이전트 실행 시 구독을 다시 초기화하도록 표시됩니다.

    중요 정보중요

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

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

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

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

    중요 정보중요

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

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

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

  • 게시 데이터베이스의 게시자에서 @automatic_reinitialization_policy에 다음 중 한 가지 값을 지정하고 sp_addmergepublication을 실행합니다.

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

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

    중요 정보중요

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

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

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

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

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

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

    중요 정보중요

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

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

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘[Top]

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를 전달합니다. 이 메서드는 구독을 다시 초기화하도록 표시합니다.

    [!참고]

    구독이 만료되면 변경 내용을 업로드할 수 없습니다. 자세한 내용은 구독에 대한 만료 기간 설정을 참조하십시오.

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

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

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

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

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

    [!참고]

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

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

    [!참고]

    구독이 만료되면 변경 내용을 업로드할 수 없습니다. 자세한 내용은 구독에 대한 만료 기간 설정을 참조하십시오.

  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

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘[Top]

참고 항목

개념

구독 다시 초기화

복제 관리 개체 개념

복제 보안을 위한 최선의 구현 방법