Compartilhar via


Reinicializar uma assinatura

Aplica-se a: SQL Server Banco de Dados SQL do Azure

Este tópico descreve como reinicializar uma assinatura no SQL Server 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.

Observação

A Instância Gerenciada de SQL do Azure pode ser um publicador, um distribuidor e um assinante para a replicação transacional e de instantâneo. Os bancos de dados do Banco de Dados SQL do Azure só podem ser assinantes por push para a replicação transacional e de instantâneo. Para obter mais informações, confira Replicação transacional com o Banco de Dados SQL do Azure e a Instância Gerenciada de SQL do Azure.

Como usar 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 Assinaturas, disponível nas pastas Publicações Locais e Assinaturas Locais do 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 Start the Replication Monitor (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 Synchronize a Push Subscription e Synchronize a Pull Subscription.

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, em seguida, 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, em seguida, expanda o nó de 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, em seguida, 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.

Usando o 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, no 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 Synchronize a Pull Subscription.

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

  1. No Publicador, execute sp_reinitsubscription (Transact-SQL). Especifique @publication, @subscribere @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 Synchronize a Push Subscription.

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

  1. No Assinante, no 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.

    Importante

    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 Synchronize a Pull Subscription.

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

  1. No Publicador, execute sp_reinitmergesubscription (Transact-SQL). Especifique @publication, @subscribere @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.

    Importante

    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 Synchronize a Push Subscription.

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

  1. 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.

    Importante

    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 Criar uma assinatura.

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

  1. 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.

    Importante

    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 View and Modify Publication Properties.

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, PublicationDBNamee a conexão da etapa 1 para ConnectionContext.

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

    Observaçã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 Synchronize a Pull Subscription.

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, SubscriptionDBNamee a conexão da etapa 1 para ConnectionContext.

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

    Observaçã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 Synchronize a Push Subscription.

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, PublicationDBNamee a conexão da etapa 1 para ConnectionContext.

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

    Observaçã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ção

    As alterações não poderão ser carregadas se a assinatura estiver vencida. Para obter mais informações, consulte Set the Expiration Period for Subscriptions.

  5. Sincronize a assinatura pull. Para obter mais informações, consulte Synchronize a Pull Subscription.

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, SubscriptionDBNamee a conexão da etapa 1 para ConnectionContext.

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

    Observaçã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ção

    As alterações não poderão ser carregadas se a assinatura estiver vencida. Para obter mais informações, consulte Set the Expiration Period for Subscriptions.

  5. Sincronize a assinatura push. Para obter mais informações, consulte Synchronize a Push Subscription.

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 = "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

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 = "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