Compartilhar via


Sincronizar uma assinatura push

Este tópico descreve como sincronizar uma assinatura push no SQL Server 2014 usando o SQL Server Management Studio, agentes de replicação ou RMO (Replication Management Objects).

Como usar o SQL Server Management Studio.

As assinaturas são sincronizadas pelo Agente de Distribuição (para replicação transacional e de instantâneo) ou pelo Merge Agent (para replicação de mesclagem). Os agentes podem ser executados continuamente, executados quando solicitado ou executados em horários programados. Para obter mais informações sobre como especificar agendas de sincronização, consulte Especificar Agendas de Sincronização.

Sincronize uma assinatura sob demanda a partir das pastas Publicações Locais e Assinaturas Locais no Microsoft SQL Server Management Studio e da guia Todas as Assinaturas no Replication Monitor. As assinaturas de publicações oracle não podem ser sincronizadas sob demanda do Assinante. Para obter informações sobre como iniciar o Replication Monitor, consulte Iniciar o Replication Monitor.

Para sincronizar uma assinatura push sob demanda no Management Studio (no Publicador)

  1. Conecte-se ao Publicador no Management Studio e expanda o nó do servidor.

  2. Expanda a pasta Replicação e expanda a pasta Publicações Locais .

  3. Expanda a publicação para a qual você deseja sincronizar assinaturas.

  4. Clique com o botão direito do mouse na assinatura que você deseja sincronizar e clique em Exibir Status de Sincronização.

  5. Na caixa de diálogo Exibir Status de Sincronização – <Assinante>:<SubscriptionDatabase>, clique em Iniciar. Quando a sincronização é concluída, a mensagem Sincronização concluída é exibida.

  6. Clique em Fechar.

Para sincronizar uma assinatura push sob demanda no Management Studio (no Assinante)

  1. Conecte-se ao Assinante no Management Studio e expanda o nó do servidor.

  2. Expanda a pasta Replicação e expanda a pasta Assinaturas Locais .

  3. Clique com o botão direito do mouse na assinatura que você deseja sincronizar e clique em Exibir Status de Sincronização.

  4. Uma mensagem é exibida sobre como estabelecer uma conexão com o Distribuidor. Clique em OK.

  5. Na caixa de diálogo Verificar Status de Sincronização – <Assinante>:<SubscriptionDatabase>, clique em Iniciar. Quando a sincronização é concluída, a mensagem Sincronização concluída é exibida.

  6. Clique em Fechar.

Para sincronizar uma assinatura push sob demanda no Replication Monitor

  1. No Replication Monitor, expanda um grupo publicador no painel esquerdo, expanda um Publicador e clique em uma publicação.

  2. Clique na guia Todas as Assinaturas.

  3. Clique com o botão direito do mouse na assinatura que você deseja sincronizar e clique em Iniciar Sincronização.

  4. Para exibir o progresso da sincronização, clique com o botão direito do mouse na assinatura e clique em Exibir Detalhes.

Usando agentes de replicação

As assinaturas push podem ser sincronizadas programaticamente e sob demanda invocando o arquivo executável do agente de replicação apropriado do prompt de comando. O arquivo executável do agente de replicação que é invocado dependerá do tipo de publicação ao qual a assinatura push pertence.

Para iniciar o Distribution Agent para sincronizar uma assinatura push com uma publicação transacional

  1. No prompt de comando ou em um arquivo em lote no Distribuidor, execute distrib.exe. Especifique os seguintes argumentos de linha de comando:

    • -Publicador

    • -PublisherDB

    • -Distribuidor

    • -Subscritor

    • -SubscriberDB

    • -TipoDeAssinatura = 0

    Se você estiver usando a Autenticação do SQL Server, também deverá especificar os seguintes argumentos:

    • -DistributorLogin

    • -DistributorPassword

    • -DistributorSecurityMode = 0

    • -PublisherLogin

    • -PublisherPassword

    • -PublisherSecurityMode = 0

    • -SubscriberLogin

    • -SubscriberPassword

    • -SubscriberSecurityMode = 0

      Importante

      Quando possível, use a Autenticação do Windows.

Para iniciar o Merge Agent para sincronizar uma assinatura push para uma publicação de mesclagem

  1. No prompt de comando ou em um arquivo em lote no Distribuidor, execute replmerg.exe. Especifique os seguintes argumentos de linha de comando:

    • -Publicador

    • -PublisherDB

    • -Publicação

    • -Distribuidor

    • -Subscritor

    • -SubscriberDB

    • -SubscriptionType = 0

    Se você estiver usando a Autenticação do SQL Server, também deverá especificar os seguintes argumentos:

    • -DistributorLogin

    • -DistributorPassword

    • -DistributorSecurityMode = 0

    • -PublisherLogin

    • -PublisherPassword

    • -PublisherSecurityMode = 0

    • -SubscriberLogin

    • -SubscriberPassword

    • -SubscriberSecurityMode = 0

      Importante

      Quando possível, use a Autenticação do Windows.

Exemplos (Agentes de Replicação)

O exemplo a seguir inicia o Distribution Agent para sincronizar uma assinatura push.

REM -- Declare the variables.  
SET Publisher=%instancename%  
SET Subscriber=%instancename%  
SET PublicationDB=AdventureWorks2012  
SET SubscriptionDB=AdventureWorks2012Replica   
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

O exemplo a seguir inicia o Merge Agent para sincronizar uma assinatura push.

REM -- Declare the variables.  
SET Publisher=%instancename%  
SET Subscriber=%instancename%  
SET PublicationDB=AdventureWorks2012  
SET SubscriptionDB=AdventureWorks2012Replica   
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

Usando Objetos de Gerenciamento de Replicação (RMO)

Você pode sincronizar assinaturas push programaticamente usando RMO (Replication Management Objects) e acesso de código gerenciado às funcionalidades do agente de replicação. As classes que você usa para sincronizar uma assinatura push dependem do tipo de publicação à qual a assinatura pertence.

Observação

Se você quiser iniciar uma sincronização que seja executada de forma autônoma sem afetar seu aplicativo, inicie o agente de forma assíncrona. No entanto, se você quiser monitorar o resultado da sincronização e receber retornos de chamada do agente durante o processo de sincronização (por exemplo, se quiser exibir uma barra de progresso), inicie o agente de forma síncrona. Para assinantes do MicrosoftSQL Server 2005 Express Edition, você deve iniciar o agente de forma síncrona.

Para sincronizar uma assinatura do tipo push com uma publicação de instantâneo ou transacional

  1. Crie uma conexão com o Distribuidor usando a classe ServerConnection .

  2. Crie uma instância da TransSubscription classe e defina as seguintes propriedades:

  3. Chame o LoadProperties método para obter as propriedades de assinatura restantes. Se esse método retornar false, verifique se a assinatura existe.

  4. Inicie o Distribution Agent no Distribuidor de uma das seguintes maneiras:

    • Chame o método SynchronizeWithJob na instância de TransSubscription da etapa 2. Esse método inicia o Agente de Distribuição de forma assíncrona e o controle retorna imediatamente ao seu aplicativo enquanto o trabalho do agente está em execução. Você não pode chamar este método se a assinatura foi criada com um valor de false para CreateSyncAgentByDefault.

    • Obtenha uma instância da TransSynchronizationAgent classe da SynchronizationAgent propriedade e chame o Synchronize método. Esse método inicia o agente de forma síncrona e o controle permanece com a tarefa do agente em execução. Durante a execução síncrona, você pode manipular o Status evento enquanto o agente está em execução.

Para sincronizar uma assinatura push com uma publicação de mesclagem

  1. Crie uma conexão com o Distribuidor usando a classe ServerConnection .

  2. Crie uma instância da MergeSubscription classe e defina as seguintes propriedades:

  3. Chame o método LoadProperties para obter as propriedades restantes da assinatura. Se esse método retornar false, verifique se a assinatura existe.

  4. Inicie o Merge Agent no Distribuidor de uma das seguintes maneiras:

    • Chame o método SynchronizeWithJob na instância de MergeSubscription da etapa 2. Esse método inicia o Merge Agent de forma assíncrona e o controle retorna imediatamente ao seu aplicativo enquanto o trabalho do agente está em execução. Você não pode chamar este método se a assinatura foi criada com um valor de false para CreateSyncAgentByDefault.

    • Obtenha uma instância da MergeSynchronizationAgent classe da SynchronizationAgent propriedade e chame o Synchronize método. Esse método inicia o Merge Agent de forma síncrona e o controle permanece com o trabalho do agente em execução. Durante a execução síncrona, você pode manipular o Status evento enquanto o agente está em execução.

Exemplos (RMO)

Este exemplo sincroniza uma assinatura push para uma publicação transacional, em que o agente é iniciado de forma assíncrona usando o trabalho do agente.

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

/// 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 = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"

' 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

Este exemplo sincroniza uma assinatura push para uma publicação transacional, em que o agente é iniciado de forma síncrona.

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

// 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 = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"

' 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

Este exemplo sincroniza uma assinatura push para uma publicação de mesclagem, em que o agente é iniciado de forma assíncrona usando o trabalho do agente.

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

// 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 = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"

' 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

Este exemplo sincroniza uma assinatura push para uma publicação de mesclagem, em que o agente é iniciado de forma síncrona.

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

// 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 = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"

' 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

Consulte Também

Conceitos de Objetos de Gerenciamento de Replicação
Sincronizar dados
Práticas recomendadas de segurança de replicação