Partilhar via


Reinicializar uma assinatura

Este tópico descreve como reinicializar uma assinatura no SQL Server 2012 usando o SQL Server Management Studio, o Transact-SQL ou o RMO (Replication Management Objects). Assinaturas individuais podem ser marcadas para reinicialização, para que durante a próxima sincronização, um novo instantâneo seja aplicado.

Neste tópico

  • Para reinicializar uma assinatura, usando:

    SQL Server Management Studio

    Transact-SQL

    RMO (Replication Management Objects)

Usando o SQL Server Management Studio

Reinicializar uma assinatura é um processo em duas partes:

  1. Uma única assinatura ou todas as assinaturas de uma publicação são marcadas para reinicialização. Marque as assinaturas para reinicialização na caixa de diálogo Reinicializar Assinatura(s), que está disponível nas pastas Publicações Locais e Assinaturas Locais no Microsoft SQL Server Management Studio. Você também pode marcar assinaturas da guia Todas as Assinaturas e o nó de publicações no Replication Monitor. Para obter informações sobre como iniciar o Replication Monitor, consulte Iniciar o Replication Monitor. Ao marcar uma assinatura para reinicialização, você tem as seguintes opções:

    • Usar o instantâneo atual
      Selecione para aplicar o instantâneo atual ao Assinante da próxima vez que o Distribution Agent ou Merge Agent forem executados. Se não houver nenhum instantâneo válido disponível, essa opção não poderá ser selecionada.

    • Usar um novo instantâneo
      Selecione para reinicializar a assinatura com um novo instantâneo. O instantâneo só poderá ser aplicado ao Assinante depois de ser gerado pelo Snapshot Agent. Se o Snapshot Agent estiver configurado para execução agendada, a assinatura não será reinicializada até que a próxima execução agendada do Snapshot Agent tenha ocorrido. Selecione Gerar o novo instantâneo agora para iniciar o Snapshot Agent imediatamente.

    • Carregar alterações não sincronizadas antes da reinicialização
      Somente replicação de mesclagem. Selecione para carregar quaisquer alterações pendentes do banco de dados de assinatura antes que os dados no Assinante sejam substituídos com um instantâneo.

      Se você adicionar, descartar ou alterar um filtro com parâmetros, as alterações pendentes no Assinante não poderão ser carregadas no Publicador durante a reinicialização. Para carregar alterações pendentes, sincronize todas as assinaturas antes de alterar o filtro.

  2. Uma assinatura é reinicializada na próxima vez em for sincronizada: o Distribution Agent (para replicação transacional) ou Merge Agent (para replicação de mesclagem) aplica o instantâneo mais recente a cada Assinante que tenha uma assinatura marcada para reinicialização. Para obter mais informações sobre assinaturas de sincronização, consulte Sincronizar uma assinatura push e Sincronizar uma assinatura pull.

Para marcar uma única assinatura push ou pull para reinicialização 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, em seguida, a pasta Publicações Locais.

  3. Expanda a publicação que tem a assinatura que você quer reinicializar.

  4. Clique com o botão direito do mouse na assinatura e então clique em Reinicializar.

  5. Na caixa de diálogo Reinicializar Assinatura(s), selecione opções e então clique em Marcar para Reinicialização.

Para marcar uma única assinatura pull para reinicialização 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, então, expanda a pasta Assinaturas Locais.

  3. Clique com o botão direito do mouse na assinatura e então clique em Reinicializar.

  4. Na caixa de diálogo de confirmação exibida, clique em Sim.

Para marcar todas as assinaturas para reinicialização no Management Studio

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

  2. Expanda a pasta Replicação e, em seguida, a pasta Publicações Locais.

  3. Clique com o botão direito do mouse na publicação com as assinaturas que você deseja reinicializar e então clique em Reinicializar Todas as Assinaturas.

  4. Na caixa de diálogo Reinicializar Assinatura(s), selecione opções e então clique em Marcar para Reinicialização.

Para marcar uma única assinatura push ou pull para reinicialização no Replication Monitor

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

  2. Clique na guia Todas as Assinaturas.

  3. Clique com o botão direito do mouse na assinatura que deseja reinicializar e então clique em Reinicializar Sincronização.

  4. Na caixa de diálogo Reinicializar Assinatura(s), selecione opções e então clique em Marcar para Reinicialização.

Para marcar todas as assinaturas para reinicialização no Replication Monitor

  1. No Replication Monitor, expanda um Grupo do publicador no painel esquerdo e, depois, expanda um Publicador.

  2. Clique com o botão direito do mouse na publicação com as assinaturas que você deseja reinicializar e então clique em Reinicializar Todas as Assinaturas.

  3. Na caixa de diálogo Reinicializar Assinatura(s), selecione opções e então clique em Marcar para Reinicialização.

Ícone de seta usado com o link Voltar ao Início[Top]

Usando Transact-SQL

As assinaturas podem ser reinicializadas forma programática, usando procedimentos armazenados. O procedimento armazenado usado depende do tipo de assinatura (push ou pull) e o tipo de publicação ao qual a assinatura pertence.

Para reinicializar uma assinatura pull para uma publicação transacional

  1. No Assinante do banco de dados de assinatura, execute sp_reinitpullsubscription (Transact-SQL). Especifique @publisher, @publisher_db, e @publication. Isso marca a assinatura para reinicialização na próxima vez que o Distribution Agent for executado.

  2. (Opcional) Iniciar o Distribution Agent no Assinante para sincronizar a assinatura. Para obter mais informações, consulte Sincronizar uma assinatura pull.

Para reinicializar uma assinatura push para uma publicação transacional

  1. No Publicador, execute sp_reinitsubscription (Transact-SQL). Especifique @publication, @subscriber e @destination_db. Isso marca a assinatura para reinicialização na próxima vez que o Distribution Agent for executado.

  2. (Opcional) Iniciar o Distribution Agent no Distributor para sincronizar a assinatura. Para obter mais informações, consulte Sincronizar uma assinatura push.

Para reinicializar uma assinatura pull para uma publicação de mesclagem

  1. No Assinante do banco de dados de assinatura, execute sp_reinitmergepullsubscription (Transact-SQL). Especifique @publisher, @publisher_db, e @publication. Para carregar alterações do Assinante antes que a reinicialização ocorra, especifique um valor de true para @upload_first. Isso marca a assinatura para reinicialização na próxima vez que o Merge Agent for executado.

    Observação importanteImportante

    Se você adicionar, descartar ou alterar um filtro com parâmetros, as alterações pendentes no Assinante não poderão ser carregadas no Publicador durante a reinicialização. Para carregar alterações pendentes, sincronize todas as assinaturas antes de alterar o filtro.

  2. (Opcional) Iniciar o Merge Agent no Assinante para sincronizar a assinatura. Para obter mais informações, consulte Sincronizar uma assinatura pull.

Para reinicializar uma assinatura push para uma publicação de mesclagem.

  1. No Publicador, execute sp_reinitmergesubscription (Transact-SQL). Especifique @publication, @subscriber e @subscriber_db. Para carregar alterações do Assinante antes que a reinicialização ocorra, especifique um valor de true para @upload_first. Isso marca a assinatura para reinicialização na próxima vez que o Distribution Agent for executado.

    Observação importanteImportante

    Se você adicionar, descartar ou alterar um filtro com parâmetros, as alterações pendentes no Assinante não poderão ser carregadas no Publicador durante a reinicialização. Para carregar alterações pendentes, sincronize todas as assinaturas antes de alterar o filtro.

  2. (Opcional) Iniciar o Merge Agent no Distributor para sincronizar a assinatura. Para obter mais informações, consulte Sincronizar uma assinatura push.

Para definir a política de reinicialização ao criar uma nova publicação de mesclagem

  • No Publicador do banco de dados de publicação, execute sp_addmergepublication, especificando um dos valores a seguir para @automatic_reinitialization_policy:

    • 1 - alterações são carregadas do Assinante antes que a assinatura seja reinicializada automaticamente, de acordo com a alteração feita na publicação.

    • 0 - alterações no Assinante são descartadas quando uma assinatura é reinicializada automaticamente, de acordo com a alteração feita na publicação.

    Observação importanteImportante

    Se você adicionar, descartar ou alterar um filtro com parâmetros, as alterações pendentes no Assinante não poderão ser carregadas no Publicador durante a reinicialização. Para carregar alterações pendentes, sincronize todas as assinaturas antes de alterar o filtro.

    Para obter mais informações, consulte Crie uma publicação.

Para alterar a política de reinicialização para uma publicação de mesclagem existente

  • No Publicador do banco de dados de publicação, execute sp_changemergepublication, especificando automatic_reinitialization_policy para @property e um dos seguintes valores para @value:

    • 1 - alterações são carregadas do Assinante antes que a assinatura seja reinicializada automaticamente, de acordo com a alteração feita na publicação.

    • 0 - alterações no Assinante são descartadas quando uma assinatura é reinicializada automaticamente, de acordo com a alteração feita na publicação.

    Observação importanteImportante

    Se você adicionar, descartar ou alterar um filtro com parâmetros, as alterações pendentes no Assinante não poderão ser carregadas no Publicador durante a reinicialização. Para carregar alterações pendentes, sincronize todas as assinaturas antes de alterar o filtro.

    Para obter mais informações, consulte Visualizar e modificar as propriedades da publicação.

Ícone de seta usado com o link Voltar ao Início[Top]

Usando o RMO (Replication Management Objects)

Assinaturas individuais podem ser marcadas para reinicialização, para que durante a próxima sincronização, um novo instantâneo seja aplicado. As assinaturas podem ser reinicializadas programaticamente usando o RMO (Replication Management Objects). As classes que você usa dependem do tipo da publicação às quais as assinaturas pertencem e o tipo de assinatura (ou seja, uma assinatura push ou pull).

Para reinicializar uma assinatura pull para uma publicação transacional

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

  2. Crie uma instância da classe TransPullSubscription, defina PublicationName, DatabaseName, PublisherName, PublicationDBName e a conexão da etapa 1 para ConnectionContext.

  3. Chame o método LoadProperties para obter as propriedades do objeto.

    ObservaçãoObservação

    Se esse método retornar false, isso significa que as propriedades de assinatura na etapa 2 foram definidas incorretamente ou a assinatura pull não existe.

  4. Chame o método Reinitialize. Esse método marca a assinatura para reinicialização.

  5. Sincronize a assinatura pull. Para obter mais informações, consulte Sincronizar uma assinatura pull.

Para reinicializar uma assinatura push para uma publicação transacional

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

  2. Crie uma instância da classe TransSubscription, defina PublicationName, DatabaseName, SubscriberName, SubscriptionDBName e a conexão da etapa 1 para ConnectionContext.

  3. Chame o método LoadProperties para obter as propriedades do objeto.

    ObservaçãoObservação

    Se esse método retornar false, isso significa que as propriedades de assinatura na etapa 2 foram definidas incorretamente ou a assinatura push não existe.

  4. Chame o método Reinitialize. Esse método marca a assinatura para reinicialização.

  5. Sincronize a assinatura push. Para obter mais informações, consulte Sincronizar uma assinatura push.

Para reinicializar uma assinatura pull para uma publicação de mesclagem

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

  2. Crie uma instância da classe MergePullSubscription, defina PublicationName, DatabaseName, PublisherName, PublicationDBName e a conexão da etapa 1 para ConnectionContext.

  3. Chame o método LoadProperties para obter as propriedades do objeto.

    ObservaçãoObservação

    Se esse método retornar false, isso significa que as propriedades de assinatura na etapa 2 foram definidas incorretamente ou a assinatura pull não existe.

  4. Chame o método Reinitialize. Passe o valor de true para carregar as alterações no Assinante antes da reinicialização ou um valor de false para reinicializar e perder as alterações pendentes no Assinante. Esse método marca a assinatura para reinicialização.

    ObservaçãoObservação

    As alterações não poderão ser carregadas se a assinatura estiver vencida. Para obter mais informações, consulte Definir o período de validade da assinatura.

  5. Sincronize a assinatura pull. Para obter mais informações, consulte Sincronizar uma assinatura pull.

Para reinicializar uma assinatura push para uma publicação de mesclagem.

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

  2. Crie uma instância da classe MergeSubscription, defina PublicationName, DatabaseName, SubscriberName, SubscriptionDBName e a conexão da etapa 1 para ConnectionContext.

  3. Chame o método LoadProperties para obter as propriedades do objeto.

    ObservaçãoObservação

    Se esse método retornar false, isso significa que as propriedades de assinatura na etapa 2 foram definidas incorretamente ou a assinatura push não existe.

  4. Chame o método Reinitialize. Passe o valor de true para carregar as alterações no Assinante antes da reinicialização ou um valor de false para reinicializar e perder as alterações pendentes no Assinante. Esse método marca a assinatura para reinicialização.

    ObservaçãoObservação

    As alterações não poderão ser carregadas se a assinatura estiver vencida. Para obter mais informações, consulte Definir o período de validade da assinatura.

  5. Sincronize a assinatura push. Para obter mais informações, consulte Sincronizar uma assinatura push.

Exemplos (RMO)

Esse exemplo reinicializa uma assinatura pull para uma publicação transacional.

          // 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

Esse exemplo reinicializa uma assinatura pull para uma publicação de mesclagem após o primeiro carregamento das alterações pendentes no Assinante.

          // 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

Ícone de seta usado com o link Voltar ao Início[Top]

Consulte também

Conceitos

Reinicializar as assinaturas

Conceitos de Replication Management Objects

Práticas recomendadas em relação à segurança de replicação