Crie e aplique o snapshot inicial

Aplica-se a:SQL ServerInstância Gerenciada de SQL do Azure

Este artigo descreve como criar e aplicar o snapshot inicial no SQL Server usando SQL Server Management Studio, Transact-SQL ou Objetos de Gerenciamento de Replicação (RMO). Publicações de mesclagem que usam filtros com parâmetros exigem um instantâneo de duas partes. Para obter mais informações, consulte Criar um instantâneo para uma publicação de mesclagem com filtros com parâmetros.
O Agente de Snapshot gera snapshots após a criação da publicação. Você pode gerar snapshots:

  • Imediatamente. Por padrão, o Assistente de Novas Publicações gera um snapshot para uma publicação de mescagem imediatamente após você criar a publicação.
  • Em um momento agendado. Especifique um agendamento na página Agente de Instantâneo do Assistente para Nova Publicação ou ao usar procedimentos armazenados no RMO (Replication Management Objects).
  • Manualmente. Execute o Agente de Snapshot no prompt de comando ou no SQL Server Management Studio. Para obter mais informações sobre a execução de agentes, consulte Conceitos dos executáveis do Replication Agent ou Iniciar e interromper um Agente de Replicação (SQL Server Management Studio).

Para a replicação de merge, o Agente de Instantâneo gera um snapshot toda vez que é executado. Para a Replicação Transacional, a geração de instantâneos depende da configuração da propriedade de publicação immediate_sync. Se a propriedade estiver definida como TRUE (o padrão ao usar o New Publication Wizard), o Agente de Instantâneo gera um snapshot toda vez que roda, e pode aplicar o snapshot a um Assinante a qualquer momento. Se a propriedade estiver definida como FALSE (o padrão ao usar sp_addpublication), o Agente de Instantâneo gera um snapshot somente se uma nova assinatura for adicionada desde a última Agente de Instantâneo executada; Os assinantes devem esperar a conclusão do Agente de Instantâneo antes de poderem sincronizar.

Por padrão, o Agente de Instantâneo salva os snapshots gerados na pasta de snapshots padrão localizada no Distribuidor. Você também pode salvar arquivos snapshot em mídias removíveis, como discos removíveis, CD-ROMs ou em locais diferentes da pasta padrão de snapshots. Você também pode compactar os arquivos para facilitar o armazenamento e a transferência, e executar scripts antes ou depois de o Agente de Instantâneo aplicar o snapshot ao Assinante. Para obter mais informações sobre essas opções, consulte Snapshot Options.

Se o instantâneo for de uma publicação de mesclagem que usa filtros parametrizados, o Agente de Instantâneo criará o instantâneo usando um processo em duas etapas. Primeiro, cria um snapshot de esquema que contém os scripts de replicação e o esquema dos objetos publicados, mas não os dados. Cada assinatura então se inicializa com um snapshot que inclui os scripts e esquemas copiados do snapshot do esquema e os dados que pertencem à partição da assinatura. Para obter mais informações, consulte Snapshots for Merge Publications with Parameterized Filters.

Depois que o Agente de Instantâneo cria o snapshot no Publisher e o armazena em um local padrão ou alternativo de snapshot, você pode transferir o snapshot para o Subscriber e aplicá-lo. O Agente de Distribuição (para snapshot ou Replicação Transacional) ou Agente de Mesclagem (para replicação de fusão) transfere o snapshot e aplica o esquema e os arquivos de dados ao banco de dados de assinatura do Assinante durante a sincronização inicial. Por padrão, a sincronização inicial ocorre imediatamente após você criar uma assinatura se você usar o Assistente de Nova Assinatura. A opção Inicialize When na página Inicialize Subscriptions do assistente controla esse comportamento. Quando o Agente de Instantâneo gera snapshots após a inicialização de uma assinatura, ele não os aplica a um assinante, a menos que você marque uma assinatura para reinicialização. Para obter mais informações, consulte Reinicializar as assinaturas.

Após o Agente de Distribuição ou Agente de Mesclagem aplicar o instantâneo inicial, o agente propaga atualizações subsequentes e outras modificações de dados. Quando instantâneos são distribuídos e aplicados a Assinantes, só esses Assinantes que estão à espera de instantâneos iniciais ou novos são afetados. Outros assinantes dessa publicação (aqueles que já recebem inserções, atualizações, excluções ou outras modificações nos dados publicados) não são afetados.

Para visualizar ou modificar o local padrão da pasta de instantâneos, consulte

Local padrão do instantâneo

Especifique o local padrão do instantâneo na página Pasta de instantâneos do Assistente de Configuração da Distribuição. Para obter mais informações sobre como usar o assistente, consulte Configurar a publicação e a distribuição. Se você criar uma publicação em um servidor que não esteja configurado como Distribuidor, especifique um local padrão do instantâneo na página Pasta de instantâneos do Assistente para Nova Publicação. Para obter mais informações sobre como usar esse assistente, consulte Criar uma publicação.

Modifique o local do instantâneo padrão na página Publicadores da caixa de diálogo Propriedades do Distribuidor – <Distribuidor>. Para obter mais informações, consulte Exibir e modificar as propriedades do Distribuidor e do Publicador. Defina a pasta de instantâneos para cada publicação na caixa de diálogo Propriedades da Publicação - <Publicação>. Para obter mais informações, consulte Exibir e Modificar Propriedades da Publicação.

Modificar a localização do instantâneo padrão

  1. Na página Publishers da caixa de diálogo Propriedades do Distribuidor - <Distribuidor>, selecione o botão de propriedades (...) para o Publisher para o qual você deseja alterar a localização padrão do snapshot.

  2. Na caixa de diálogo Propriedades do Publicador – <Publisher>, digite um valor para a propriedade Pasta de Instantâneo Padrão.

    Observação

    O Agente de Instantâneo precisa de permissões de escrita para o diretório que você especifica, e o Agente de Distribuição ou Agente de Mesclagem precisa de permissões de leitura. Se você usar assinaturas pull, deverá especificar um diretório compartilhado como um caminho UNC (Convenção Universal de Nomenclatura), como \\nomedocomputador\snapshot. Para obter mais informações, consulte Proteger a pasta de instantâneos.

  3. Selecione OK.

Criar instantâneo

Por padrão, se o SQL Server Agent estiver rodando, o Agente de Instantâneo gera um snapshot imediatamente após você criar uma publicação usando o New Publication Wizard. Por padrão, o Agente de Distribuição (para snapshot e Replicação Transacional) ou o Agente de Mesclagem (para assinaturas de merge) então aplica o snapshot para todas as assinaturas. Você também pode gerar um snapshot usando o SQL Server Management Studio e o Replication Monitor. Para obter informações sobre como iniciar o Replication Monitor, consulte Start the Replication Monitor (Iniciar o Replication Monitor).

Como usar o SQL Server 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 na publicação para a qual deseja criar um snapshot e então selecione View Agente de Instantâneo Status.
  4. Na caixa de diálogo View Agente de Instantâneo Status - <Publicação>, selecione Iniciar.
    Quando o Agente de Instantâneo termina de gerar o snapshot, ele exibe uma mensagem, como "[100%] Um snapshot de 17(s) artigo(s) foi gerado."

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 na publicação para a qual deseja gerar um snapshot e então selecione Gerar snapshot.
  3. Para visualizar o status do Agente de Instantâneo, selecione a aba Agentes. Para informações mais detalhadas, clique com o botão direito no Agente de Instantâneo na grade e, em seguida, selecione Ver Detalhes.

Usando o Transact-SQL

Você pode criar snapshots iniciais programaticamente criando e executando um job Agente de Instantâneo ou executando o arquivo executável Agente de Instantâneo a partir de um arquivo batch. Depois da geração de um instantâneo inicial, ele é transferido para e aplicado no Assinante quando a assinatura é sincronizada pela primeira vez. Se você executar o Agente de Instantâneo a partir de um prompt de comando ou de um arquivo batch, precisa reexecutar o agente sempre que o snapshot existente se tornar inválido.

Importante

Quando possível, solicite que os usuários insiram as credenciais de segurança em tempo de execução. Se você precisar armazenar credenciais em um arquivo de script, proteja o arquivo para evitar acesso não autorizado.

  1. Crie uma publicação de instantâneo, transacional ou de mesclagem. Para obter mais informações, consulte Criar uma publicação.

  2. Execute sp_addpublication_snapshot (Transact-SQL). Especifique @publication e os seguintes parâmetros:

    • O @job_login, que especifica as credenciais de autenticação do Windows com as quais o Agente de Instantâneo é executado no Distribuidor.

    • O @job_password, que é a senha para as credenciais do Windows fornecidas.

    • (Opcional) Um valor de 0 para @publisher_security_mode se o agente usar SQL Server Autenticação ao se conectar ao Publisher. Nesse caso, deve-se especificar também a informação de logon da Autenticação do SQL Server para @publisher_login e @publisher_password.

    • (Opcional) Uma agenda de sincronização para o trabalho do Agente de Instantâneo. Para obter mais informações, consulte Specify Synchronization Schedules.

    Importante

    Quando você configura um Publisher com um Distribuidor remoto, os valores fornecidos para todos os parâmetros, incluindo job_login e job_password, são enviados ao Distribuidor em texto simples. Criptografe a conexão entre o Publisher e seu distribuidor remoto antes de executar esse procedimento armazenado. Para obter mais informações, confira Habilitar conexões criptografadas para o mecanismo de banco de dados (SQL Server Configuration Manager).

  3. Adicione artigos à publicação. Para obter mais informações, consulte Define an Article.

  4. No Publicador do banco de dados de publicação, execute sp_startpublication_instantâneo (Transact-SQL) especificando o valor de publication da etapa 1.

Aplicar um instantâneo

Como usar o SQL Server Management Studio.

Após a geração do snapshot, sincronize a assinatura com o Agente de Distribuição ou o Agente de Mesclagem para aplicá-la:

  • Se o agente roda continuamente (o padrão para replicação transacional), ele aplica automaticamente o snapshot após gerá-lo.

  • Se o agente roda em um cronograma, ele aplica o snapshot na próxima vez que roda.

  • Se o agente roda sob demanda, ele aplica o snapshot na próxima vez que você executa.

    Para obter mais informações sobre assinaturas de sincronização, consulte Synchronize a Push Subscription e Synchronize a Pull Subscription.

Usar o Transact-SQL

  1. Crie uma publicação de instantâneo, transacional ou de mesclagem. Para obter mais informações, consulte Criar uma publicação.

  2. Adicione artigos à publicação. Para obter mais informações, consulte Define an Article.

  3. Do prompt de comando ou em um arquivo em lote, inicie o Replication Agente de Instantâneo executando instantâneo.exe, especificando os seguintes argumentos de linha de comando:

    • -Publicação
    • -Publisher
    • -Distribuidor
    • -PublisherDB
    • -ReplicationType

    Se você estiver usando Autenticação SQL Server, também especifique os seguintes argumentos:

    • -DistributorLogin
    • -DistributorPassword
    • -Modo = de Segurança do Distribuidor0
    • -PublisherLogin
    • -PublisherPassword
    • -Modo = de Segurança do Editor0

Exemplos (Transact-SQL)

Esse exemplo mostra como criar uma publicação transacional e adicionar um trabalho do Agente de Instantâneo para a nova publicação (usando variáveis de script sqlcmd ). O exemplo também inicia a tarefa.

-- To avoid storing the login and password in the script file, the values 
-- are passed into SQLCMD as scripting variables. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022'; --publication database
SET @publication = N'AdvWorksCustomerTran'; -- transactional publication name
SET @login = $(Login);
SET @password = $(Password);

USE [AdventureWorks]

-- Enable transactional and snapshot replication on the publication database.
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname = N'publish',
  @value = N'true';

-- Execute sp_addlogreader_agent to create the agent job. 
EXEC sp_addlogreader_agent 
  @job_login = @login, 
  @job_password = @password,
  -- Explicitly specify the security mode used when connecting to the Publisher.
  @publisher_security_mode = 1;

-- Create new transactional publication, using the defaults. 
USE [AdventureWorks2022]
EXEC sp_addpublication 
  @publication = @publication, 
  @description = N'transactional publication';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

Esse exemplo cria uma publicação de mesclagem e adiciona um trabalho do Agente de Instantâneo (usando variáveis sqlcmd ) para a publicação. Este exemplo também inicia a tarefa.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022'; 
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @login = $(Login);
SET @password = $(Password);

-- Enable merge replication on the publication database.
USE master
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname=N'merge publish',
  @value = N'true';

-- Create new merge publication, using the defaults. 
USE [AdventureWorks]
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication.';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

Os seguintes argumentos de linha de comando iniciam o Agente de Instantâneo para gerar o instantâneo para uma publicação de mesclagem.

Observação

Quebras de linhas foram adicionadas para melhorar a legibilidade. Em um arquivo batch, você deve fazer comandos em uma única linha.

  
REM -- Declare variables  
SET Publisher=%InstanceName%  
SET PublicationDB=AdventureWorks2022   
SET Publication=AdvWorksSalesOrdersMerge   
  
REM --Start the Snapshot Agent to generate the snapshot for AdvWorksSalesOrdersMerge.  
"C:\Program Files\Microsoft SQL Server\120\COM\SNAPSHOT.EXE" -Publication %Publication%   
-Publisher %Publisher% -Distributor %Publisher% -PublisherDB %PublicationDB%   
-ReplicationType 2 -OutputVerboseLevel 1 -DistributorSecurityMode 1  
  

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

O Agente de Instantâneo gera snapshots após você criar uma publicação. Você pode gerar esses snapshots programaticamente usando Objetos de Gerenciamento de Replicação (RMO) e acesso direto ao código gerenciado às funcionalidades do agente de replicação. Os objetos usados dependem do tipo de replicação. Você pode iniciar o Agente de Instantâneo de forma síncrona usando o SnapshotGenerationAgent objeto ou assíncrona usando o job do agente. Após a geração do snapshot inicial, o Agente de Instantâneo o transfere para o Assinante e o aplica quando a assinatura é sincronizada pela primeira vez. Você precisa executar novamente o agente sempre que o instantâneo existente não contiver mais dados válidos e atualizados. Para obter mais informações, consulte Maintain Publications (Manter publicações).

Importante

Quando possível, solicite que os usuários insiram as credenciais de segurança em tempo de execução. Se for preciso armazenar credenciais, use os serviços criptográficos fornecidos pelo Microsoft Windows .NET Framework.

Para gerar o instantâneo inicial de uma publicação de instantâneo ou transacional por meio da iniciação do trabalho do Agente de Instantâneo (assíncrono)

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

  2. Criar uma instância da classe TransPublication. Defina as propriedades Name e DatabaseName para a publicação, e a propriedade ConnectionContext para a conexão criada na etapa 1.

  3. Chame o método LoadProperties para carregar as propriedades remanescentes do objeto. Se esse método retornar falso, ou as propriedades de publicação no passo 2 estão definidas incorretamente ou a publicação não existe.

  4. Se o valor de SnapshotAgentExists for false, chame CreateSnapshotAgent para criar o trabalho do Snapshot Agent para essa publicação.

  5. Chame o método StartSnapshotGenerationAgentJob para iniciar o trabalho de agente que gera o instantâneo para essa publicação.

  6. (Opcional) Quando o valor de SnapshotAvailable é true, o instantâneo fica disponível para Assinantes.

Para gerar o instantâneo inicial de uma publicação de instantâneo ou transacional por meio da execução do Agente de Instantâneo (síncrono)

  1. Crie uma instância da classe SnapshotGenerationAgent e defina as seguintes propriedades necessárias:

  2. Defina um valor de Transactional ou Snapshot para ReplicationType.

  3. Chame o método GenerateSnapshot .

Para gerar o instantâneo inicial para uma publicação de mesclagem iniciando o trabalho do Agente de Instantâneo (assíncrono)

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

  2. Criar uma instância da classe MergePublication. Defina as propriedades Name e DatabaseName para a publicação, e a propriedade ConnectionContext para a conexão criada na etapa 1.

  3. Chame o método LoadProperties para carregar as propriedades remanescentes do objeto. Se esse método retornar falso, ou as propriedades de publicação no passo 2 estão definidas incorretamente ou a publicação não existe.

  4. Se o valor de SnapshotAgentExists for false, chame CreateSnapshotAgent para criar o trabalho do Snapshot Agent para essa publicação.

  5. Chame o método StartSnapshotGenerationAgentJob para iniciar o trabalho de agente que gera o instantâneo para essa publicação.

  6. (Opcional) Quando o valor de SnapshotAvailable é true, o instantâneo fica disponível para Assinantes.

Para gerar o instantâneo inicial de uma publicação de mesclagem pela execução do Agente de Instantâneo (síncrono)

  1. Crie uma instância da classe SnapshotGenerationAgent e defina as seguintes propriedades necessárias:

  2. Defina um valor de Merge para ReplicationType.

  3. Chame o método GenerateSnapshot .

Exemplos (RMO)

Esse exemplo executa o Agente de Instantâneo sincronicamente para gerar o instantâneo inicial para uma publicação transacional.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;
string distributorName = publisherInstance;

SnapshotGenerationAgent agent;

try
{
    // Set the required properties for Snapshot Agent.
    agent = new SnapshotGenerationAgent();
    agent.Distributor = distributorName;
    agent.DistributorSecurityMode = SecurityMode.Integrated;
    agent.Publisher = publisherName;
    agent.PublisherSecurityMode = SecurityMode.Integrated;
    agent.Publication = publicationName;
    agent.PublisherDatabase = publicationDbName;
    agent.ReplicationType = ReplicationType.Transactional;

    // Start the agent synchronously.
    agent.GenerateSnapshot();

}
catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "A snapshot could not be generated for the {0} publication."
        , publicationName), ex);
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance
Dim distributorName As String = publisherInstance

Dim agent As SnapshotGenerationAgent

Try
    ' Set the required properties for Snapshot Agent.
    agent = New SnapshotGenerationAgent()
    agent.Distributor = distributorName
    agent.DistributorSecurityMode = SecurityMode.Integrated
    agent.Publisher = publisherName
    agent.PublisherSecurityMode = SecurityMode.Integrated
    agent.Publication = publicationName
    agent.PublisherDatabase = publicationDbName
    agent.ReplicationType = ReplicationType.Transactional

    ' Start the agent synchronously.
    agent.GenerateSnapshot()

Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
     "A snapshot could not be generated for the {0} publication." _
     , publicationName), ex)
End Try

Esse exemplo inicia de forma assíncrona o trabalho do agente sincronicamente para gerar o instantâneo inicial para uma publicação transacional.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;

TransPublication publication;

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

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

    // Set the required properties for an existing publication.
    publication = new TransPublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;

    if (publication.LoadProperties())
    {
        // Start the Snapshot Agent job for the publication.
        publication.StartSnapshotGenerationAgentJob();
    }
    else
    {
        throw new ApplicationException(String.Format(
            "The {0} publication does not exist.", publicationName));
    }
}
catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "A snapshot could not be generated for the {0} publication."
        , publicationName), ex);
}
finally
{
    conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance

Dim publication As TransPublication

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

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

    ' Set the required properties for an existing publication.
    publication = New TransPublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    If publication.LoadProperties() Then
        ' Start the Snapshot Agent job for the publication.
        publication.StartSnapshotGenerationAgentJob()
    Else
        Throw New ApplicationException(String.Format( _
         "The {0} publication does not exist.", publicationName))
    End If
Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
     "A snapshot could not be generated for the {0} publication." _
     , publicationName), ex)
Finally
    conn.Disconnect()
End Try

Bloqueio ao aplicar o instantâneo inicial

Se houver várias publicações que publiquem dados em um único banco de dados nos assinantes, você perceberá que apenas uma publicação poderá aplicar seu snapshot por vez durante a aplicação dos snapshots iniciais.

Você pode encontrar um recurso de espera semelhante ao seguinte ao revisar a atividade SQL:

APP: 18:16384:[snapshot_delivery_in_progress_Tr]:(9bcdaf92)
APP: 5:16384:[snapshot_delivery_in_progress_Er]:(3c3b7db9
)

Consultar o comportamento de travamento pode mostrar recursos semelhantes aos seguintes:

APP 16384:[appname]:(fbe42d68) XAPP 16384:[snapshot_del]:(9bcdaf92) X

Este comportamento ocorre por design. Isso ocorre porque um bloqueio de aplicativo é usado para impedir que vários agentes de replicação apliquem simultaneamente instantâneos de diferentes publicações ao mesmo banco de dados de assinantes. Como o bloqueio de aplicação contém o nome do banco de dados do assinante, qualquer publicação que publique no mesmo banco de dados será afetada. O resultado é que apenas um instantâneo pode ser inserido no banco de dados do assinante em um determinado momento.

Bloqueios exclusivos são usados nessa situação para ajudar a evitar a possibilidade de os agentes de replicação ficarem bloqueados uns com os outros.

Para contornar esse problema, especifique um banco de dados de assinantes diferente para cada publicação.