Criar e Aplicar o Instantâneo Inicial

Aplica-se a: SQL ServerAzure SQL Managed Instance

Este tópico descreve como criar e aplicar o snapshot inicial no SQL Server utilizando o SQL Server Management Studio, Transact-SQL ou Replication Management Objects (RMO). Publicações de fusão que utilizam filtros parametrizados requerem um instantâneo em duas partes. Para mais informações, consulte Criar um Snapshot para uma Publicação de Fusão com Filtros Parametrizados.
Os snapshots são gerados pelo Snapshot Agent após a criação de uma publicação. Podem ser gerados:

  • Imediatamente. Por defeito, um snapshot para uma publicação de fusão é gerado imediatamente após a criação da publicação no Assistente de Novas Publicações.
  • A uma hora marcada. Especifique um agendamento na página do Snapshot Agent do Assistente de Nova Publicação ou ao utilizar procedimentos armazenados ou Objetos de Gestão da Replicação (RMO).
  • Manualmente. Execute o Snapshot Agent a partir do prompt de comandos ou do SQL Server Management Studio. Para mais informações sobre agentes em execução, consulte Conceitos de Executáveis de Agentes de Replicação e Iniciar e Parar um Agente de Replicação (SQL Server Management Studio).

Para replicação de mesclagem, um snapshot é gerado sempre que o Snapshot Agent é executado. Para a replicação transacional, a geração de instantâneos depende da configuração da propriedade da publicação immediate_sync. Se a propriedade estiver definida para TRUE (o padrão ao usar o Assistente de Nova Publicação), um snapshot é gerado sempre que o Snapshot Agent é executado, podendo ser aplicado a um Subscritor a qualquer momento. Se a propriedade estiver definida como FALSE (o padrão ao usar sp_addpublication), o snapshot só é gerado se uma nova subscrição tiver sido adicionada desde a última Snapshot Agent execução; Os subscritores devem esperar que o Snapshot Agent seja concluído antes de poderem sincronizar.

Por predefinição, quando os snapshots são gerados, são guardados na pasta predefinida de snapshots, que se encontra no Distribuidor. Também pode guardar ficheiros snapshot em suportes removíveis, como discos removíveis, CD-ROMs ou em locais diferentes da pasta de snapshots predefinida. Além disso, pode comprimir os ficheiros para que sejam mais fáceis de armazenar e transferir, e executar scripts antes ou depois da aplicação do snapshot no Assinante. Para mais informações sobre estas opções, consulte Opções de Snapshot.

Se o snapshot for para uma publicação de fusão que utiliza filtros parametrizados, o snapshot é criado através de um processo em duas partes. Primeiro, é criado um snapshot de esquema que contém os scripts de replicação e o esquema dos objetos publicados, mas não os dados. Cada subscrição é então inicializada com um snapshot que inclui os scripts e o esquema copiados do snapshot do esquema e os dados que pertencem à partição da subscrição. Para obter mais informações, consulte Instantâneos para mesclar publicações com filtros parametrizados.

Depois de o snapshot ser criado no Publisher e armazenado num local de snapshot padrão ou alternativo, o snapshot pode ser transferido para o Assinante e aplicado. O Distribution Agent (para replicação instantânea ou transacional) ou Merge Agent (para replicação de fusão) transfere o snapshot e aplica o esquema e os ficheiros de dados à base de dados de subscrição do Assinante durante a sincronização inicial. Por defeito, a sincronização inicial ocorre imediatamente após a criação de uma subscrição se usar o Assistente de Nova Subscrição. Este comportamento é controlado pela opção Inicializar Quando na página Inicializar Subscrições do assistente. Quando os snapshots são gerados após a inicialização de uma subscrição, não são aplicados a um Assinante, a menos que esta seja marcada para reinicialização. Para mais informações, consulte Reinicializar Subscrições.

Após o Distribution Agent ou Merge Agent aplicar o snapshot inicial, o agente propaga atualizações subsequentes e outras modificações de dados. Quando os snapshots são distribuídos e aplicados aos Subscritores, apenas os Subscritores que aguardam snapshots iniciais ou novos são afetados. Outros Assinantes dessa publicação (aqueles que já recebem inserções, atualizações, eliminações ou outras modificações nos dados publicados) não são afetados.

Para visualizar ou modificar a localização padrão da pasta snapshot, consulte

Localização padrão do instantâneo

Especifique a localização predefinida do instantâneo na página Pasta de Instantâneos do Assistente de Configuração da Distribuição. Para mais informações sobre a utilização deste assistente, consulte Configurar Publicação e Distribuição. Se criar uma publicação num servidor que não esteja configurado como Distribuidor, especifique uma localização predefinida para o instantâneo na página Pasta de Instantâneos do Assistente de Nova Publicação. Para mais informações sobre a utilização deste assistente, consulte Criar uma Publicação.

Modificar a localização predefinida do instantâneo na página de Editores da caixa de diálogo Propriedades do Distribuidor - <Distribuidor> . Para mais informações, consulte Visualizar e Modificar Propriedades de Distribuidores e Publisher. Defina a pasta snapshot para cada publicação na caixa de diálogo Propriedades de Publicação - <Publicação> . Para mais informações, consulte Visualizar e Modificar Propriedades de Publicação.

Alterar a localização predefinida da captura instantânea

  1. Na página Publishers da caixa de diálogo Propriedades do Distribuidor - <Distribuidor>, clique no botão de propriedades (...) do Publicador para o qual pretende alterar a localização predefinida do instantâneo.

  2. Na caixa de diálogo Publisher Properties - <Publisher>, introduza um valor para a propriedade Default Snapshot Folder.

    Note

    O Snapshot Agent deve ter permissões de escrita para o diretório que especifica, e o Distribution Agent ou Merge Agent deve ter permissões de leitura. Se forem usadas subscrições pull, tem de especificar um diretório partilhado como caminho UNC (Convenção Universal de Nomenclatura), tal como \\nomedocomputador\snapshot. Para obter mais informações, consulte Proteger a pasta de snapshots.

  3. Selecione OK.

Criar instantâneo

Por predefinição, se o SQL Server Agent estiver em execução, é criado um instantâneo pelo Snapshot Agent imediatamente depois de uma publicação ser criada com o New Publication Wizard. Por defeito, é então aplicado pelo Distribution Agent (para snapshot e replicação transacional) ou pelo Merge Agent (para subscrições de fusão) para todas as subscrições. Um snapshot também pode ser gerado usando o SQL Server Management Studio e o Replication Monitor. Para obter informações sobre como iniciar o Replication Monitor, consulte Iniciar o Replication Monitor.

Usando o SQL Server Management Studio

  1. Liga-te ao Publisher no Management Studio e depois expande o nó servidor.
  2. Expanda a pasta Replicação e depois expanda a pasta Publicações Locais .
  3. Clique com o botão direito na publicação para a qual pretende criar um snapshot e depois clique em View Snapshot Agent Status.
  4. Na caixa de diálogo Ver Estado do Agente de Instantâneo - <Publicação>, clique em Iniciar.
    Quando o Snapshot Agent termina de gerar o instantâneo, será exibida uma mensagem, como "[100%] Foi gerado um instantâneo de 17 artigos."

No Monitor de Replicação

  1. No Replication Monitor, expanda um grupo do Publisher no painel esquerdo e, em seguida, expanda um Publisher.
  2. Clique com o botão direito na publicação para a qual pretende gerar um instantâneo e depois clique em Gerar Instantâneo.
  3. Para ver o estado do Snapshot Agent, clique no separador Agents. Para informações mais detalhadas, clique com o botão direito no Snapshot Agent na grelha e depois clique em Ver Detalhes.

Usando Transact-SQL

Os snapshots iniciais podem ser criados programaticamente quer através da criação e execução de um trabalho Snapshot Agent, quer executando o ficheiro executável Snapshot Agent a partir de um ficheiro batch. Após a geração de um snapshot inicial, este é transferido e aplicado ao assinante quando a subscrição é sincronizada pela primeira vez. Se executar o Snapshot Agent a partir de um prompt de comandos ou de um ficheiro batch, terá de reexecutar o agente sempre que o snapshot existente se tornar inválido.

Importante

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

  1. Crie uma publicação instantânea, transacional ou de fusão. Para mais informações, consulte Criar uma Publicação.

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

    • O @job_login, que especifica as credenciais de autenticação Windows sob as quais o Snapshot Agent corre no Distribuidor.

    • O @job_password, que é a palavra-passe para as credenciais Windows fornecidas.

    • (Opcional) Um valor de 0 para @publisher_security_mode se o agente usará SQL Server Autenticação ao ligar-se ao Publisher. Neste caso, deve também especificar a informação de login de autenticação SQL Server para @publisher_login e @publisher_password.

    • (Opcional) Um cronograma de sincronização para o trabalho do Snapshot Agent. Para obter mais informações, consulte Especificar agendas de sincronização.

    Importante

    Ao configurar um Publicador com um Distribuidor remoto, os valores fornecidos para todos os parâmetros, incluindo job_login e job_password, são enviados ao Distribuidor como texto simples. Você deve criptografar a conexão entre o Editor e seu Distribuidor remoto antes de executar este procedimento armazenado. Para obter mais informações, consulte Habilitar conexões criptografadas com o Mecanismo de Banco de Dados (Gestor de Configuração do SQL Server).

  3. Adicione artigos à publicação. Para mais informações, consulte Definir um Artigo.

  4. No Publisher da base de dados de publicação, execute sp_startpublication_snapshot (Transact-SQL), especificando o valor de @publication a partir do passo 1.

Aplicar um snapshot

Usando o SQL Server Management Studio

  1. Depois de gerado o snapshot, aplica-se sincronizando a subscrição com o Distribution Agent ou o Merge Agent:

    • Se o agente estiver configurado para correr continuamente (o padrão para replicação transacional), o snapshot é automaticamente aplicado após ser gerado.
    • Se o agente estiver configurado para funcionar num calendário, o snapshot é aplicado na próxima vez que o agente estiver programado para correr.
    • Se o agente estiver configurado para funcionar sob demanda, é aplicado na próxima vez que o executar.

    Para mais informações sobre a sincronização de subscrições, consulte Sincronizar uma Subscrição Push e Sincronizar uma Subscrição Pull.

Utilize o Transact-SQL

  1. Crie uma publicação instantânea, transacional ou de fusão. Para mais informações, consulte Criar uma Publicação.

  2. Adicione artigos à publicação. Para mais informações, consulte Definir um Artigo.

  3. A partir da linha de comandos ou num ficheiro por lotes, inicie o Agente de Instantâneo de Replicação executando o snapshot.exe, especificando os seguintes argumentos da linha de comandos:

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

    Se estiver a usar Autenticação SQL Server, deve também especificar os seguintes argumentos:

    • -DistributorLogin
    • -DistributorPassword
    • -DistributorSecurityMode = 0
    • -PublisherLogin
    • -EditorPassword
    • -Modo = de Segurança do Editor0

Exemplos (Transact-SQL)

Este exemplo mostra como criar uma publicação transacional e adicionar um trabalho Snapshot Agent para a nova publicação (usando variáveis de scripting 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

Este exemplo cria uma publicação de fusão e adiciona um trabalho Snapshot Agent (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 comandos iniciam o Snapshot Agent para gerar o snapshot para uma publicação de fusão.

Note

Foram adicionadas quebras de linha para melhorar a legibilidade. Num ficheiro batch, os comandos devem ser feitos numa ú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  
  

Utilização de Objetos de Gestão de Replicação (RMO)

O Snapshot Agent gera snapshots após a criação de uma publicação. Pode gerar estes snapshots programaticamente usando Replication Management Objects (RMO) e acesso direto ao código gerido às funcionalidades do agente de replicação. Os objetos que usas dependem do tipo de replicação. O Snapshot Agent pode ser iniciado sincronamente usando o objeto SnapshotGenerationAgent ou assincronamente usando a tarefa do agente. Depois de o snapshot inicial ter sido gerado, este é transferido e aplicado ao Assinante quando a subscrição é sincronizada pela primeira vez. Terá de executar novamente o agente sempre que o instantâneo existente deixar de conter dados válidos e atualizados. Para mais informações, consulte Manter Publicações.

Importante

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

Gerar o snapshot inicial para um snapshot ou publicação transacional iniciando o trabalho do Snapshot Agent (assíncrono)

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

  2. Crie uma instância da TransPublication classe. Defina as Name propriedades e DatabaseName para a publicação, e defina a ConnectionContext propriedade para a ligação criada no passo 1.

  3. Chame o LoadProperties método para carregar as propriedades restantes do objeto. Se esse método retornar false, as propriedades de publicação na etapa 2 foram definidas incorretamente ou a publicação não existe.

  4. Se o valor de SnapshotAgentExists for falso, chame CreateSnapshotAgent para criar o trabalho de agente snapshot para esta publicação.

  5. Chame o StartSnapshotGenerationAgentJob método para iniciar a tarefa do agente que gera o snapshot para esta publicação.

  6. (Opcional) Quando o valor de SnapshotAvailable é verdadeiro, o snapshot está disponível para os Subscritores.

Gerar o snapshot inicial para um snapshot ou publicação transacional executando o Snapshot Agent (síncrono)

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

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

  3. Chame o método GenerateSnapshot.

Gerar o snapshot inicial para uma publicação de fusão iniciando o trabalho Snapshot Agent (assíncrono)

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

  2. Crie uma instância da MergePublication classe. Defina as Name propriedades e DatabaseName para a publicação, e defina a ConnectionContext propriedade para a ligação criada no passo 1.

  3. Chame o LoadProperties método para carregar as propriedades restantes do objeto. Se esse método retornar false, as propriedades de publicação na etapa 2 foram definidas incorretamente ou a publicação não existe.

  4. Se o valor de SnapshotAgentExists for falso, chame CreateSnapshotAgent para criar o trabalho de agente snapshot para esta publicação.

  5. Chame o StartSnapshotGenerationAgentJob método para iniciar a tarefa do agente que gera o snapshot para esta publicação.

  6. (Opcional) Quando o valor de SnapshotAvailable é verdadeiro, o snapshot está disponível para os Subscritores.

Para gerar o snapshot inicial para uma publicação de fusão executando o Snapshot Agent (síncrono)

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

  2. Defina um valor de Merge para ReplicationType.

  3. Chame o método GenerateSnapshot.

Exemplos (RMO)

Este exemplo executa sincronizadamente o Snapshot Agent para gerar o snapshot 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

Este exemplo inicia de forma assíncrona a tarefa do agente para gerar o instantâneo inicial de 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 snapshot inicial

Se tiver várias publicações que publicam dados para uma única base de dados no(s) subscritor(es), ao aplicar o(s) snapshot(s) inicial(is), verifica que apenas uma publicação consegue aplicar o respetivo snapshot de cada vez.

Pode encontrar um recurso de espera semelhante ao seguinte ao rever a atividade SQL:

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

A consulta para comportamento de bloqueio pode mostrar recursos semelhantes aos seguintes:

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

Este comportamento é intencional. Ocorre porque é utilizado um bloqueio da aplicação para impedir que vários agentes de replicação apliquem, em simultâneo, instantâneos de diferentes publicações à mesma base de dados do subscritor. Como o bloqueio da aplicação contém o nome da base de dados dos assinantes, quaisquer publicações que publiquem na mesma base de dados serão afetadas. O resultado é que apenas um snapshot pode ser inserido na base de dados dos assinantes de cada vez.

Bloqueios exclusivos são usados nesta situação para ajudar a evitar a possibilidade de agentes de replicação ficarem bloqueados entre si.

Para contornar este problema, especifique uma base de dados de assinantes diferente para cada publicação.