Partilhar via


Solução de problemas: localizar erros com a replicação transacional do SQL Server

Aplica-se a:SQL ServerAzure SQL Managed Instance

A solução de problemas de erros de replicação pode ser frustrante sem uma compreensão básica de como a replicação transacional funciona. A primeira etapa na criação de uma publicação é fazer com que o Snapshot Agent crie o snapshot e salve-o na pasta do snapshot. Em seguida, o Distribution Agent aplica o snapshot ao assinante.

Este processo cria a publicação e coloca-a no estado de sincronização . A sincronização funciona em três fases:

  1. As transações ocorrem em objetos que são replicados e são marcados como "para replicação" no log de transações.

  2. O Log Reader Agent verifica o log de transações e procura transações marcadas como "para replicação". Essas transações são salvas no banco de dados de distribuição.

  3. O Distribution Agent verifica o banco de dados de distribuição usando o thread do leitor. Em seguida, usando o thread do gravador, esse agente se conecta ao assinante para aplicar essas alterações ao assinante.

Erros podem ocorrer em qualquer etapa deste processo. Encontrar esses erros pode ser o aspeto mais desafiador da solução de problemas de sincronização. Felizmente, o uso do Replication Monitor facilita esse processo.

Observação

O objetivo deste guia de solução de problemas é ensinar a metodologia de solução de problemas. Ele foi projetado não para resolver seu erro específico, mas para fornecer orientação geral na localização de erros com replicação. Alguns exemplos específicos são fornecidos, mas a resolução para eles pode variar dependendo do ambiente. Os erros de exemplo são baseados no tutorial Tutorial: Configurar a replicação entre dois servidores totalmente conectados (transacionais).

Metodologia de solução de problemas

Perguntas a fazer

  1. Onde no processo de sincronização a replicação está falhando?
  2. Qual agente está apresentando um erro?
  3. Quando foi a última vez que a replicação funcionou com êxito? Mudou alguma coisa desde então?

Passos a dar

  1. Use o Replication Monitor para identificar em que ponto a replicação está encontrando o erro (qual agente?):

    • Se estiverem ocorrendo erros na seção Publicador para Distribuidor , o problema é com o Log Reader Agent.
    • Se estiverem a ocorrer erros na secção Distribuidor para Subscritor , o problema é com o Agente de Distribuição.
  2. Examine o histórico de trabalho desse agente no Monitor de Atividade de Trabalho para identificar detalhes do erro. Se o histórico de trabalhos não estiver mostrando detalhes suficientes, você poderá habilitar o registro detalhado nesse agente específico.

  3. Tente determinar uma solução para o erro.

Localizar erros com o Snapshot Agent

O Snapshot Agent gera o snapshot e grava-o na pasta de snapshot especificada.

  1. Veja o status do seu Snapshot Agent:

    1. No Explorador de Objetos, expanda o nó Publicação Local em Replicação.

    2. Clique com o botão direito do rato na sua publicação AdvWorksProductTrans>Ver Estado do Agente de Instantâneos.

    Captura de ecrã do comando View Snapshot Agent Status no menu de atalho.

  2. Se um erro for relatado no status do Snapshot Agent, você poderá encontrar mais detalhes no histórico de trabalhos do Snapshot Agent:

    1. Expanda SQL Server Agent no Pesquisador de Objetos e abra o Monitor de Atividade de Trabalho.

    2. Classifique por categoria e identifique o agente de instantâneo pela categoria REPL-Snapshot.

    3. Clique com o botão direito do mouse no Snapshot Agent e selecione Exibir histórico.

    Captura de tela de Seleções para abrir o histórico do Snapshot Agent.

  3. No histórico do Snapshot Agent, selecione a entrada de log relevante. Normalmente, trata-se de uma ou duas linhas antes da entrada que está a comunicar o erro. (Um X vermelho indica erros.) Reveja o texto da mensagem na caixa abaixo dos registos:

    Captura de ecrã do erro do Snapshot Agent devido a acesso negado.

    The replication agent had encountered an exception.
    Exception Message: Access to path '\\node1\repldata.....' is denied.
    

Se as permissões do Windows não estiverem configuradas corretamente para a pasta de instantâneo, você verá um erro "acesso negado" para o Snapshot Agent. Você precisa verificar as permissões para a pasta onde o snapshot está armazenado e certificar-se de que a conta usada para executar o Snapshot Agent tem permissões para acessar o compartilhamento.

Localizar erros com o Log Reader Agent

O Log Reader Agent se conecta ao banco de dados do editor e verifica o log de transações em busca de transações marcadas como "para replicação". Em seguida, adiciona essas transações ao banco de dados de distribuição.

  1. Conecte-se ao editor no SQL Server Management Studio. Expanda o nó do servidor, clique com o botão direito na pasta Replicação e selecione Iniciar o Monitor de Replicação:

    Screenshot do comando 'Iniciar Monitor de Replicação' no menu de atalho.

    O Replication Monitor abre:

    Captura de ecrã do Replication Monitor.

  2. O X vermelho indica que a publicação não está sincronizada. Expanda Meus Editores no lado esquerdo e, em seguida, expanda o servidor de editor relevante.

  3. Selecione a publicação AdvWorksProductTrans à esquerda e procure o X vermelho em uma das guias para identificar onde está o problema. Nesse caso, o X vermelho está na guia Agentes , portanto, um dos agentes está encontrando um erro:

    Captura de ecrã de Red X no separador 'Agentes' do Replication Monitor.

  4. Selecione a guia Agentes para identificar qual agente está encontrando o erro:

    Captura de tela de Red X no Log Reader Agent com falha no Replication Monitor.

  5. Esta exibição mostra-lhe dois agentes, o agente de instantâneos e o agente leitor de registos. Aquele que está encontrando um erro tem o X vermelho. Neste caso, é o Log Reader Agent.

    Clique duas vezes na linha que está relatando o erro para abrir o histórico do agente para o Log Reader Agent. Este histórico fornece mais informações sobre o erro:

    Captura de ecrã dos detalhes do erro para o Log Reader Agent.

    Status: 0, code: 20011, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
    The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.
    Status: 0, code: 15517, text: 'Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.'.
    Status: 0, code: 22037, text: 'The process could not execute 'sp_replcmds' on 'NODE1\SQL2016'.'.
    
  6. O erro normalmente ocorre quando o proprietário do banco de dados do editor não está definido corretamente. Isso pode acontecer quando um banco de dados é restaurado. Para verificar esta situação:

    1. Expanda Bancos de Dados no Pesquisador de Objetos.

    2. Clique com o botão direito em AdventureWorks2025>Propriedades.

    3. Verifique se existe um proprietário na página Arquivos . Se esta caixa estiver em branco, esta é a causa provável do seu problema.

    Captura de ecrã da página 'Ficheiros' nas propriedades da base de dados, com uma caixa 'Proprietário' em branco.

  7. Se o proprietário estiver em branco na página Arquivos, abra uma janela Nova Consulta no contexto da base de dados AdventureWorks2025. Execute o seguinte código T-SQL:

    -- set the owner of the database to 'sa' or a specific user account, without the brackets.
    EXECUTE sp_changedbowner '<useraccount>';
    -- example for sa: exec sp_changedbowner 'sa'
    -- example for user account: exec sp_changedbowner 'sqlrepro\administrator'
    
  8. Talvez seja necessário reiniciar o Log Reader Agent:

    1. Expanda o nó SQL Server Agent no Pesquisador de Objetos e abra o Monitor de Atividade de Trabalho.

    2. Classifique por categoria e identifique o Log Reader Agent pela categoria REPL-LogReader .

    3. Clique com o botão direito do rato no trabalho do Log Reader Agent e selecione Iniciar Trabalho no Passo.

    Captura de tela de Seleções para reiniciar o Log Reader Agent.

  9. Valide se sua publicação está sincronizando abrindo o Replication Monitor novamente. Se ainda não estiver aberto, você poderá encontrá-lo clicando com o botão direito do mouse em Replicação no Pesquisador de Objetos.

  10. Selecione a publicação AdvWorksProductTrans , selecione a guia Agentes e clique duas vezes no Log Reader Agent para abrir o histórico do agente. Agora você deve ver que o Log Reader Agent está em execução e está replicando comandos ou não tem "nenhuma transação replicada":

    Captura de tela do Log Reader Agent em execução sem transações replicadas.

Localizar erros com o Distribution Agent

O Agente de Distribuição localiza os dados no banco de dados de distribuição e, em seguida, os aplica ao assinante.

  1. Conecte-se ao editor no SQL Server Management Studio. Expanda o nó do servidor, clique com o botão direito do mouse na pasta Replicação e selecione Iniciar o Replication Monitor.

  2. No Replication Monitor, selecione a publicação AdvWorksProductTrans e selecione a guia Todas as assinaturas . Clique com o botão direito do rato na subscrição e selecione Ver Detalhes:

    Captura de ecrã do comando 'Ver detalhes' no menu de atalho.

  3. A caixa de diálogo Histórico do Distribuidor para Assinante é aberta e esclarece qual erro o agente está encontrando:

    Captura de tela dos detalhes do erro para o agente de distribuição.

    Error messages:
    Agent 'NODE1\SQL2016-AdventureWorks2022-AdvWorksProductTrans-NODE2\SQL2016-7' is retrying after an error. 89 retries attempted. See agent job history in the Jobs folder for more details.
    
  4. O erro indica que o Distribution Agent está tentando novamente. Para obter mais informações, verifique o histórico de trabalhos do Agente de Distribuição:

    1. Expanda SQL Server Agent no Explorador de Objetos >Monitor de Atividade de Trabalho.

    2. Classifique os trabalhos por categoria.

    3. Identifique o Agente de Distribuição pela categoria REPL-Distribution. Clique com o botão direito do mouse no agente e selecione Exibir histórico.

    Captura de tela de Seleções para visualizar o histórico do Agente de Distribuição.

  5. Selecione uma das entradas de erro e visualize o texto do erro na parte inferior da janela:

    Captura de ecrã do texto de erro que indica uma palavra-passe errada para o agente de distribuição.

    Message:
    Unable to start execution of step 2 (reason: Error authenticating proxy NODE1\repl_distribution, system error: The user name or password is incorrect.)
    
  6. Este erro indica que a senha que o agente de distribuição usado está incorreta. Para resolvê-lo:

    1. Expanda o nó Replicação no Explorador de Objetos.

    2. Clique com o botão direito do rato nas > da subscrição.

    3. Selecione as reticências (...) ao lado de Conta de processo do agente e altere a palavra-passe.

    Captura de tela de Seleções para modificar a senha do Agente de Distribuição.

  7. Verifique o Monitor de Replicação novamente, clicando com o botão direito do mouse em Replicação no Pesquisador de Objetos. Um X vermelho em Todas as Subscrições indica que o Agente de Distribuição ainda está a encontrar um erro.

    Abra o Histórico de Distribuição para o Assinante clicando com o botão direito do mouse na assinatura em Replication Monitor e depois selecione >. Aqui, o erro agora é diferente:

    Captura de tela do erro que indica que o agente de distribuição não pode se conectar.

    Connecting to Subscriber 'NODE2\SQL2016'
    Agent message code 20084. The process could not connect to Subscriber 'NODE2\SQL2016'.
    Number:  18456
    Message: Login failed for user 'NODE2\repl_distribution'.
    
  8. Esse erro indica que o Distribution Agent não pôde se conectar ao assinante, porque o login falhou para o usuário NODE2\repl_distribution. Para investigar mais, conecte-se ao assinante e abra o log de erros atual do SQL Server no nó Gerenciamento no Pesquisador de Objetos:

    Captura de ecrã do erro que indica que o início de sessão falhou para o subscritor.

    Se você estiver vendo esse erro, o login está faltando no assinante. Para resolver esse erro, consulte Requisitos de função de segurança para replicação.

  9. Depois que o erro de login for resolvido, verifique o Replication Monitor novamente. Se todos os problemas tiverem sido resolvidos, deverá ver uma seta verde junto a Nome da Publicação e um estado em Execução em Todas as Subscrições.

    Clique com o botão direito do rato na subscrição para abrir novamente o histórico do Distribuidor para Subscritor e verificar o sucesso. Se esta for a primeira vez que estiver a executar o Distribution Agent, verá que o snapshot foi copiado em bloco para o assinante.

    Captura de ecrã do Distribution Agent com um estado 'Em execução' e uma mensagem sobre cópia em massa.

Localizar erros com o Merge Agent

O agente de mesclagem pode levar muito tempo para replicar as alterações. Para determinar qual etapa do processo de sincronização de replicação de mesclagem leva mais tempo, use o sinalizador de rastreamento 101 juntamente com o log do agente de mesclagem. Para tal, utilize os parâmetros seguintes para os parâmetros do agente de intercalação e, em seguida, reinicie o agente:

-T 101
-output
-outputverboselevel

Observação

Se tiver que escrever estatísticas na tabela <distribution-server>..msmerge_history, use o indicador de rastreamento 102.

Uma saída de exemplo do agente de mesclagem após a conclusão da sincronização da replicação de mesclagem é a seguinte:

**************************************************************
CONNECTION TIMES --> time took to establish the connection to the servers. Publisher (all connections) 156 msec   Subscriber (all connections) 32 msec Distributor 93 msec
**************************************************************
UPLOAD COUNTERS  --> upload phase (changes from the Sub to the Pub) stats MakeGeneration Time = 343 msec. InsertGenHistory Time = 31 msec. UpdateGenHistory Time = 0 msec. ProxiedMetadata Time = 0 msec.
**************************************************************
DOWNLOAD COUNTERS  --> download phase (changes from the Pub to the Sub) stats MakeGeneration Time = 219 msec. InsertGenHistory Time = 0 msec. UpdateGenHistory Time = 0 msec.
**************************************************************
RETENTION-BASED CLEANUP STATISTICS --> sp_mergemetadataretentioncleanup proc stats Publisher: Cleanup Time 281 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_tombstone rows cleaned up 0 Subscriber: Cleanup Time 187 msec MSmerge_genhistory rows cleaned up 0 MSmerge_contents rows cleaned up 0 MSmerge_rowtrack rows cleaned up 0 MSmerge_tombstone rows cleaned up 0
**************************************************************
RETRY STATISTICS Retry Time (Upload) 0 msec. Retry Time (Download) 0 msec. Total changes retried 0 Number of Iterations through rows needing retry 0 Total number of changes that failed despite retry 0
**************************************************************
PROXY METADATA QUEUE COUNTERS Queue Full: Number of Waits: 0, Total Wait Time: 0 msec
**************************************************************
Distributor-side History Logging Time = 219 msec. Number of Distributor-side History Messages Logged = 11 Subscriber-side History Logging Time = 295 msec. Number of Subscriber-side History Messages Logged = 11
**************************************************************
2013-05-28 17:24:11.820 OLE DB Subscriber '<SQL Server name>\sql2008r2': DBCC SQLPERF (NETSTATS)  2013-05-28 17:24:11.822 OLE DB Publisher '<SQL Server name>\SQL2008R2':  DBCC SQLPERF (NETSTATS)  2013-05-28 17:24:11.824 OLE DB Distributor '<SQL Server name>\SQL2008R2':  DBCC SQLPERF (NETSTATS)  NETWORK STATISTICS Server  Reads  Writes  Bytes Read Bytes Written Publisher 74  74  19112  37526 Subscriber 73  73  19032  36931 Distributor 75  75  19192  38121
**************************************************************
NETWORK STATUS Network Connection: The computer has one or more LAN cards that are active. Network link speed: Destination Incoming  Outgoing Publisher Unreachable  Unreachable Subscriber Unreachable  Unreachable Distributor Unreachable  Unreachable
**************************************************************

Habilite o registro detalhado em qualquer agente

Pode utilizar o registo verboso para ver informações mais detalhadas sobre os erros que ocorrem com qualquer agente na topologia de replicação. As etapas são as mesmas para cada agente. Apenas certifique-se de que está a selecionar o agente correto no Monitor de Atividade de Trabalho.

Observação

Os agentes podem estar no editor ou no assinante, dependendo se é uma assinatura "pull" ou "push". Se o agente não estiver disponível no servidor que você está investigando, verifique o outro servidor.

  1. Decida onde deseja que o log detalhado seja salvo e verifique se a pasta existe. Este exemplo usa c:\temp.

  2. Expanda o nó SQL Server Agent no Pesquisador de Objetos e abra o Monitor de Atividade de Trabalho.

    Captura de ecrã do comando 'Ver Atividade de Trabalho' no menu de atalho do Monitor de Atividade de Trabalho.

  3. Ordene por Categoria e identifique o agente de interesse. Este exemplo usa o Log Reader Agent. Clique com o botão direito do rato no agente de interesse >e selecione Propriedades.

    Captura de tela de Seleções para abrir propriedades do agente.

  4. Selecione a página Etapas e realce a etapa Executar agente . Selecione Editar.

    Captura de tela de Seleções para editar a etapa 'Executar agente'.

  5. Na caixa Comando, inicie uma nova linha, digite o seguinte texto e selecione OK:

    -Output C:\Temp\OUTPUTFILE.txt -Outputverboselevel 3
    

    Você pode modificar a localização e o nível de detalhamento de acordo com as suas preferências.

    Captura de tela da saída detalhada nas propriedades da etapa de trabalho.

    Ao adicionar o parâmetro de saída detalhado, os seguintes problemas podem fazer com que seu agente falhe ou que o arquivo de saída esteja ausente:

    • Há um problema de formatação em que o traço se tornou um hífen.

    • O local não existe no disco ou a conta que está executando o agente não tem permissão para gravar no local especificado.

    • Há um espaço faltando entre o último parâmetro e o -Output parâmetro.

    • Diferentes agentes suportam diferentes níveis de verbosidade. Se você habilitar o registro detalhado, mas o agente não conseguir iniciar, tente diminuir o nível de detalhamento especificado em 1.

  6. Reinicie o Log Reader Agent clicando com o botão direito do mouse no agente >Stop Job at Step. Atualize selecionando o ícone Atualizar na barra de ferramentas. Clique com o botão direito do mouse no agente >Start Job at Step.

  7. Reveja o conteúdo no disco.

    Captura de ecrã do ficheiro de texto de saída.

  8. Para desativar o registro detalhado, siga as mesmas etapas anteriores para remover a linha -Output que adicionou anteriormente.

Obter ajuda

Contribuir para a documentação do SQL

Você sabia que você mesmo pode editar conteúdo SQL? Se o fizer, não só ajudará a melhorar a nossa documentação, como também será creditado como contribuidor da página.

Para obter mais informações, consulte Editar a documentação do Microsoft Learn.