밀어넣기 구독 동기화

적용 대상:SQL ServerAzure SQL Database

이 항목에서는 SQL Server Management Studio, 복제본(replica)tion 에이전트 또는 RMO(복제 관리 개체)를 사용하여 SQL Server에서 밀어넣기 구독을 동기화하는 방법을 설명합니다.

참고 항목

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

SQL Server Management Studio 사용

구독은 배포 에이전트(스냅샷 및 트랜잭션 복제의 경우) 또는 병합 에이전트(병합 복제의 경우)에 의해 동기화됩니다. 에이전트는 지속적으로 실행하거나, 요청 시 실행하거나, 일정에 따라 실행할 수 있습니다. 동기화 일정을 지정하는 방법에 대한 자세한 내용은 동기화 일정 지정을 참조 하세요.

Microsoft SQL Server Management Studio의 로컬 게시 및 로컬 구독 폴더와 복제 모니터의 모든 구독 탭에서 요청 시 구독을 동기화합니다. Oracle 게시에 대한 구독은 구독자에서 요청 시 동기화할 수 없습니다. 복제 모니터를 시작하는 방법은 복제 모니터 시작을 참조하세요.

Management Studio(게시자)에서 요청 시 밀어넣기 구독을 동기화하려면

  1. Management Studio에서 게시자에 커넥트 서버 노드를 확장합니다.

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

  3. 구독을 동기화할 게시를 확장합니다.

  4. 동기화할 구독을 마우스 오른쪽 단추로 클릭한 다음 동기화 상태 보기를 클릭합니다.

  5. 동기화 상태 보기 - <구독자>:<SubscriptionDatabase> 대화 상자에서 시작을 클릭합니다. 동기화가 완료되면 완료된 메시지 동기화가 표시됩니다.

  6. 닫기를 클릭합니다.

Management Studio에서 요청 시 밀어넣기 구독을 동기화하려면(구독자)

  1. Management Studio에서 구독자에 커넥트 서버 노드를 확장합니다.

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

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

  4. 배포자에 대한 연결을 설정하는 방법에 대한 메시지가 표시됩니다. 확인을 클릭합니다.

  5. 동기화 상태 보기 - <구독자>:<SubscriptionDatabase> 대화 상자에서 시작을 클릭합니다. 동기화가 완료되면 완료된 메시지 동기화가 표시됩니다.

  6. 닫기를 클릭합니다.

복제 모니터에서 요청 시 밀어넣기 구독을 동기화하려면

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

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

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

  4. 동기화 진행률을 보려면 구독을 마우스 오른쪽 단추로 클릭한 다음 세부 정보 보기를 클릭합니다.

복제 에이전트 사용

푸시 구독은 명령 프롬프트에서 적절한 복제본(replica)tion 에이전트 실행 파일을 호출하여 프로그래밍 방식 및 주문형으로 동기화할 수 있습니다. 호출되는 복제본(replica) 에이전트 실행 파일은 밀어넣기 구독이 속한 게시 유형에 따라 달라집니다.

푸시 구독을 트랜잭션 게시에 동기화하는 배포 에이전트 시작하려면

  1. 명령 프롬프트 또는 배포자의 일괄 처리 파일에서 distrib.exe 실행합니다. 다음 명령줄 인수를 지정합니다.

    • -Publisher

    • -PublisherDB

    • -배포자

    • -구독자

    • -SubscriberDB

    • -SubscriptionType = 0

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

    • -DistributorLogin

    • -DistributorPassword

    • -DistributorSecurityMode = 0

    • -PublisherLogin

    • -PublisherPassword

    • -PublisherSecurityMode = 0

    • -SubscriberLogin

    • -SubscriberPassword

    • -SubscriberSecurityMode = 0

      Important

      가능하면 Windows 인증을 사용하세요.

밀어넣기 구독을 병합 게시에 동기화하는 병합 에이전트 시작하려면

  1. 명령 프롬프트 또는 배포자의 일괄 처리 파일에서 replmerg.exe 실행합니다. 다음 명령줄 인수를 지정합니다.

    • -Publisher

    • -PublisherDB

    • -게시

    • -배포자

    • -구독자

    • -SubscriberDB

    • -SubscriptionType = 0

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

    • -DistributorLogin

    • -DistributorPassword

    • -DistributorSecurityMode = 0

    • -PublisherLogin

    • -PublisherPassword

    • -PublisherSecurityMode = 0

    • -SubscriberLogin

    • -SubscriberPassword

    • -SubscriberSecurityMode = 0

      Important

      가능하면 Windows 인증을 사용하세요.

예제(복제 에이전트)

다음 예제에서는 밀어넣기 구독을 동기화하는 배포 에이전트 시작합니다.

  
REM -- Declare the variables.  
SET Publisher=%instancename%  
SET Subscriber=%instancename%  
SET PublicationDB=AdventureWorks2022  
SET SubscriptionDB=AdventureWorks2022Replica   
SET Publication=AdvWorksProductsTran  
  
REM -- Start the Distribution Agent with four subscription streams.  
REM -- The following command must be supplied without line breaks.  
"C:\Program Files\Microsoft SQL Server\120\COM\DISTRIB.EXE" -Subscriber %Subscriber%   
-SubscriberDB %SubscriptionDB% -SubscriberSecurityMode 1 -Publication %Publication%   
-Publisher %Publisher% -PublisherDB %PublicationDB% -Distributor %Publisher%   
-DistributorSecurityMode 1 -Continuous -SubscriptionType 0 -SubscriptionStreams 4  
  

다음 예에서는 병합 에이전트를 시작하여 밀어넣기 구독을 동기화합니다.

  
REM -- Declare the variables.  
SET Publisher=%instancename%  
SET Subscriber=%instancename%  
SET PublicationDB=AdventureWorks2022  
SET SubscriptionDB=AdventureWorks2022Replica   
SET Publication=AdvWorksSalesOrdersMerge  
  
REM -- Start the Merge Agent.  
REM -- The following command must be supplied without line breaks.  
"C:\Program Files\Microsoft SQL Server\120\COM\REPLMERG.EXE"  -Publisher %Publisher%   
-Subscriber  %Subscriber%  -Distributor %Publisher% -PublisherDB  %PublicationDB%   
-SubscriberDB %SubscriptionDB% -Publication %Publication% -PublisherSecurityMode 1   
-OutputVerboseLevel 3  -Output -SubscriberSecurityMode 1  -SubscriptionType 0   
-DistributorSecurityMode 1  
  

RMO(복제 관리 개체) 사용

RMO(복제 관리 개체) 및 관리 코드 액세스를 사용하여 프로그래밍 방식으로 밀어넣기 구독을 복제본(replica)tion 에이전트 기능에 동기화할 수 있습니다. 밀어넣기 구독을 동기화하는 데 사용하는 클래스는 구독이 속한 게시 유형에 따라 달라집니다.

참고 항목

동기화가 애플리케이션에 영향을 미치지 않고 자율적으로 실행하도록 하려면 에이전트를 비동기적으로 시작합니다. 그러나 동기화 프로세스 중에 동기화 결과를 모니터링하고 에이전트로부터 콜백을 받으려면(예: 진행률 표시줄을 표시하려는 경우) 에이전트를 동기적으로 시작해야 합니다. Microsoft SQL Server 2005 Express Edition 구독자의 경우 에이전트를 동기적으로 시작해야 합니다.

밀어넣기 구독을 스냅샷 또는 트랜잭션 게시에 동기화하려면

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

  2. 클래스의 인스턴스를 TransSubscription 만들고 다음 속성을 설정합니다.

  3. 메서드를 LoadProperties 호출하여 다시 기본 구독 속성을 가져옵니다. 이 메서드가 false를 반환하는 경우 구독이 있는지 확인합니다.

  4. 다음 방법 중 하나로 배포자에서 배포 에이전트 시작합니다.

    • SynchronizeWithJob 2단계의 TransSubscription 인스턴스에서 메서드를 호출합니다. 이 메서드는 배포 에이전트 비동기적으로 시작하고 에이전트 작업이 실행되는 동안 컨트롤이 애플리케이션으로 즉시 반환됩니다. 에 대한 CreateSyncAgentByDefaultfalse으로 구독을 만든 경우 이 메서드를 호출할 수 없습니다.

    • 속성에서 클래스의 TransSynchronizationAgent 인스턴스를 SynchronizationAgent 가져오고 메서드를 호출합니다 Synchronize . 이 메서드는 에이전트를 동기적으로 시작하고 실행 중인 에이전트 작업으로 다시 기본 제어합니다. 동기화 실행 중에는 에이전트를 실행하면서 Status 이벤트를 처리할 수 있습니다.

밀어넣기 구독을 병합 게시에 동기화하려면

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

  2. 클래스의 인스턴스를 MergeSubscription 만들고 다음 속성을 설정합니다.

  3. 메서드를 LoadProperties 호출하여 다시 기본 구독 속성을 가져옵니다. 이 메서드가 false를 반환하는 경우 구독이 있는지 확인합니다.

  4. 다음 방법 중 하나로 배포자에서 병합 에이전트 시작합니다.

    • SynchronizeWithJob 2단계의 MergeSubscription 인스턴스에서 메서드를 호출합니다. 이 메서드는 병합 에이전트 비동기적으로 시작하고 에이전트 작업이 실행되는 동안 컨트롤이 애플리케이션으로 즉시 반환됩니다. 에 대한 CreateSyncAgentByDefaultfalse으로 구독을 만든 경우 이 메서드를 호출할 수 없습니다.

    • 속성에서 클래스의 MergeSynchronizationAgent 인스턴스를 SynchronizationAgent 가져오고 메서드를 호출합니다 Synchronize . 이 메서드는 동기적으로 병합 에이전트 시작하고 실행 중인 에이전트 작업으로 다시 기본 제어합니다. 동기화 실행 중에는 에이전트를 실행하면서 Status 이벤트를 처리할 수 있습니다.

예제(RMO)

다음은 에이전트 작업을 사용하여 에이전트가 비동기적으로 시작되는 트랜잭션 게시에 밀어넣기 구독을 동기화하는 예제입니다.

// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string subscriptionDbName = "AdventureWorks2022Replica";
string publicationDbName = "AdventureWorks2022";

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

TransSubscription subscription;

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

    // Instantiate the push subscription.
    subscription = new TransSubscription();
    subscription.ConnectionContext = conn;
    subscription.DatabaseName = publicationDbName;
    subscription.PublicationName = publicationName;
    subscription.SubscriptionDBName = subscriptionDbName;
    subscription.SubscriberName = subscriberName;

    // If the push subscription and the job exists, start the agent job.
    if (subscription.LoadProperties() && subscription.AgentJobId != null)
    {
        // Start the Distribution Agent asynchronously.
        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)
{
    // Implement appropriate error handling here.
    throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
    conn.Disconnect();
}
' Define the server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"

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

Dim subscription As TransSubscription

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

    ' Instantiate the push subscription.
    subscription = New TransSubscription()
    subscription.ConnectionContext = conn
    subscription.DatabaseName = publicationDbName
    subscription.PublicationName = publicationName
    subscription.SubscriptionDBName = subscriptionDbName
    subscription.SubscriberName = subscriberName

    ' If the push subscription and the job exists, start the agent job.
    If subscription.LoadProperties() And Not subscription.AgentJobId Is Nothing Then
        ' Start the Distribution Agent asynchronously.
        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
    ' Implement appropriate error handling here.
    Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
    conn.Disconnect()
End Try

다음은 트랜잭션 게시에 밀어넣기 구독을 동기화하는 예로, 에이전트를 동기적으로 시작합니다.

// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string subscriptionDbName = "AdventureWorks2022Replica";
string publicationDbName = "AdventureWorks2022";

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

TransSubscription subscription;

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

    // Define the push subscription.
    subscription = new TransSubscription();
    subscription.ConnectionContext = conn;
    subscription.DatabaseName = publicationDbName;
    subscription.PublicationName = publicationName;
    subscription.SubscriptionDBName = subscriptionDbName;
    subscription.SubscriberName = subscriberName;

    // If the push subscription exists, start the synchronization.
    if (subscription.LoadProperties())
    {
        // Check that we have enough metadata to start the agent.
        if (subscription.SubscriberSecurity != null)
        {
            // Synchronously start the Distribution Agent for the subscription.
            subscription.SynchronizationAgent.Synchronize();
        }
        else
        {
            throw new ApplicationException("There is insufficent metadata to " +
                "synchronize the subscription. Recreate the subscription with " +
                "the agent job or supply the required agent properties at run time.");
        }
    }
    else
    {
        // Do something here if the push subscription does not exist.
        throw new ApplicationException(String.Format(
            "The subscription to '{0}' does not exist on {1}",
            publicationName, subscriberName));
    }
}
catch (Exception ex)
{
    // Implement appropriate error handling here.
    throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
    conn.Disconnect();
}
' Define the server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"

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

Dim subscription As TransSubscription

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

    ' Define the push subscription.
    subscription = New TransSubscription()
    subscription.ConnectionContext = conn
    subscription.DatabaseName = publicationDbName
    subscription.PublicationName = publicationName
    subscription.SubscriptionDBName = subscriptionDbName
    subscription.SubscriberName = subscriberName

    ' If the push subscription exists, start the synchronization.
    If subscription.LoadProperties() Then
        ' Check that we have enough metadata to start the agent.
        If Not subscription.SubscriberSecurity Is Nothing Then

            ' Synchronously start the Distribution Agent for the subscription.
            subscription.SynchronizationAgent.Synchronize()
        Else
            Throw New ApplicationException("There is insufficent metadata to " + _
             "synchronize the subscription. Recreate the subscription with " + _
             "the agent job or supply the required agent properties at run time.")
        End If
    Else
        ' Do something here if the push subscription does not exist.
        Throw New ApplicationException(String.Format( _
         "The subscription to '{0}' does not exist on {1}", _
         publicationName, subscriberName))
    End If
Catch ex As Exception
    ' Implement appropriate error handling here.
    Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
    conn.Disconnect()
End Try

다음은 에이전트 작업을 사용하여 에이전트가 비동기적으로 시작되는 병합 게시에 밀어넣기 구독을 동기화하는 예제입니다.

// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string subscriptionDbName = "AdventureWorks2022Replica";
string publicationDbName = "AdventureWorks2022";

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

MergeSubscription subscription;

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

    // Define push subscription.
    subscription = new MergeSubscription();
    subscription.ConnectionContext = conn;
    subscription.DatabaseName = publicationDbName;
    subscription.PublicationName = publicationName;
    subscription.SubscriptionDBName = subscriptionDbName;
    subscription.SubscriberName = subscriberName;

    // If the push subscription and the job exists, start the agent job.
    if (subscription.LoadProperties() && subscription.AgentJobId != null)
    {
        // Start the Merge Agent asynchronously.
        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)
{
    // Implement appropriate error handling here.
    throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
    conn.Disconnect();
}
' Define the server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"

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

Dim subscription As MergeSubscription

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

    ' Define push subscription.
    subscription = New MergeSubscription()
    subscription.ConnectionContext = conn
    subscription.DatabaseName = publicationDbName
    subscription.PublicationName = publicationName
    subscription.SubscriptionDBName = subscriptionDbName
    subscription.SubscriberName = subscriberName

    ' If the push subscription and the job exists, start the agent job.
    If subscription.LoadProperties() And Not subscription.AgentJobId Is Nothing Then
        ' Start the Merge Agent asynchronously.
        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
    ' Implement appropriate error handling here.
    Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
    conn.Disconnect()
End Try

다음은 병합 게시에 대한 밀어넣기 구독을 동기화하는 예제입니다. 여기서 에이전트는 동기적으로 시작됩니다.

// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string subscriptionDbName = "AdventureWorks2022Replica";
string publicationDbName = "AdventureWorks2022";

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

MergeSubscription subscription;

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

    // Define the subscription.
    subscription = new MergeSubscription();
    subscription.ConnectionContext = conn;
    subscription.DatabaseName = publicationDbName;
    subscription.PublicationName = publicationName;
    subscription.SubscriptionDBName = subscriptionDbName;
    subscription.SubscriberName = subscriberName;

    // If the push subscription exists, start the synchronization.
    if (subscription.LoadProperties())
    {
        // Check that we have enough metadata to start the agent.
        if (subscription.SubscriberSecurity != null)
        {
            // Synchronously start the Merge Agent for the subscription.
            subscription.SynchronizationAgent.Synchronize();
        }
        else
        {
            throw new ApplicationException("There is insufficent metadata to " +
                "synchronize the subscription. Recreate the subscription with " +
                "the agent job or supply the required agent properties at run time.");
        }
    }
    else
    {
        // Do something here if the push subscription does not exist.
        throw new ApplicationException(String.Format(
            "The subscription to '{0}' does not exist on {1}",
            publicationName, subscriberName));
    }
}
catch (Exception ex)
{
    // Implement appropriate error handling here.
    throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
    conn.Disconnect();
}
' Define the server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"

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

Dim subscription As MergeSubscription

Try
    ' Connect to the Publisher
    conn.Connect()

    ' Define the subscription.
    subscription = New MergeSubscription()
    subscription.ConnectionContext = conn
    subscription.DatabaseName = publicationDbName
    subscription.PublicationName = publicationName
    subscription.SubscriptionDBName = subscriptionDbName
    subscription.SubscriberName = subscriberName

    ' If the push subscription exists, start the synchronization.
    If subscription.LoadProperties() Then
        ' Check that we have enough metadata to start the agent.
        If Not subscription.SubscriberSecurity Is Nothing Then
            ' Synchronously start the Merge Agent for the subscription.
            ' Log agent messages to an output file.
            subscription.SynchronizationAgent.Output = "mergeagent.log"
            subscription.SynchronizationAgent.OutputVerboseLevel = 2
            subscription.SynchronizationAgent.Synchronize()
        Else
            Throw New ApplicationException("There is insufficent metadata to " + _
             "synchronize the subscription. Recreate the subscription with " + _
             "the agent job or supply the required agent properties at run time.")
        End If
    Else
        ' Do something here if the push subscription does not exist.
        Throw New ApplicationException(String.Format( _
         "The subscription to '{0}' does not exist on {1}", _
         publicationName, subscriberName))
    End If
Catch ex As Exception
    ' Implement appropriate error handling here.
    Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
    conn.Disconnect()
End Try

참고 항목

Replication Management Objects Concepts
데이터 동기화
복제 보안을 위한 최선의 구현 방법