O Número de Sequência de Log especificado para verificação do log repldone ocorre antes do início atual da replicação no log.
Há transações não replicadas no log de transações marcadas para replicação, mas não há Agentes de Leitor de Log atuais que possam ler essas transações não replicadas. O Agente de Leitor de Log entrega comandos e transações replicados ao banco de dados de distribuição em transações. Após cada confirmação de transação, o Agentes de Leitor de Log chama o sp_repldone no banco de dados publicador para marcar informações, como o número da sequência da última transação distribuída e o registro da confirmação da próxima transação para verificação, se houver. Depois que o sp_repldone é chamado no banco de dados publicador e a transação é confirmada no banco de dados de distribuição, é possível que os dados de rastreamento do banco de dados publicador tenham dados de rastreamento incorretos.
Por exemplo, depois que o Leitor de Log confirmar com êxito uma transação (pode-se chamá-la de T1) no banco de dados de distribuição e o sp_repldone tiver sido chamado para atualizar os dados de rastreamento do banco de dados publicador para lembrar que T1 foi enviada e a transação T2 é a próxima a ser verificada, o Agente de Leitor de Log passará para a transação T2. Se o Publicador for desligado imediatamente após o Agente de Leitor de Log confirmar a transação T2 no banco de dados de distribuição, mas antes de o sp_repldone ser chamado para atualizar as informações de rastreamento do banco de dados publicador, quando o Publicador voltar a funcionar, os dados de rastreamento ainda indicarão que T1 acabou de ser enviado e T2 é a próxima a ser verificada. No entanto, essa indicação não é consistente com o fato de T2 já ter sido confirmada no banco de dados de distribuição. O Agente de Leitor de Log manipula essa situação internamente. Na próxima inicialização do Agente de Leitor de Log, ele consultará o banco de dados de distribuição para encontrar o número da sequência da última transação distribuída (LSN). Depois disso, ele chama o sp_repldone para redefinir os dados de rastreamento do banco de dados publicador para que o conjunto de comandos e transações entregues não seja reenviado.
Esse erro poderá ser gerado se o número da sequência da transação no Agente de Leitor de Log recuperado do banco de dados de distribuição for menor do que o último número da sequência da transação indicado por seus dados de rastreamento. Essa condição indica que alguns comandos e transações enviados pelo Agente de Leitor de Log estão ausentes no banco de dados de distribuição. Por exemplo, se a opção para sincronizar com backup não foi habilitada no banco de dados de distribuição, quando o banco de dados de distribuição foi restaurado para uma versão anterior enquanto o Agente de Leitor de Log estava enviando comandos e transações a um banco de dados de distribuição. Outra causa possível é quando o usuário exclui manualmente alguns registros da tabela MSrepl_transactions no banco de dados de distribuição.
O erro também poderá ocorrer se a replicação não tiver sido completamente removida ou se houver uma inconsistência no banco de dados.
Para resolver esse problema, tente o seguinte:
Use o DBCC CHECKDB para verificar a consistência do banco de dados.
Se não houver outra maneira de apagar o log de transações, execute sp_repldone e defina @xactid como NULL, @xact_seqno como NULL e @reset como 1 para que todas as transações replicadas no log sejam marcadas como distribuídas. Isso é útil quando há transações replicadas no log de transações que não são mais válidas e você quer truncar o log. Cuidado, esse procedimento pode ser usado em situações de emergência para permitir o truncamento do log de transações quando existirem transações com replicação pendente. Isso fará com que os registros de log existentes sejam ignorados, resultando em inconsistências entre o Publicador e o Assinante.
EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1
Para garantir a consistência, descarte e recrie todas as publicações e assinaturas, se possível.
Nome | Descrição | Valor Padrão |
Habilitado | Habilita ou desabilita o fluxo de trabalho. | Não |
Prioridade | Define a Prioridade do Alerta. | 2 |
Severidade | Define a Severidade do Alerta. | 2 |
Target | Microsoft.SQLServer.2008.DBEngine | ||
Category | EventCollection | ||
Enabled | False | ||
Alert Generate | True | ||
Alert Severity | Error | ||
Alert Priority | High | ||
Remotable | True | ||
Alert Message |
|
ID | Module Type | TypeId | RunAs |
---|---|---|---|
DS | DataSource | Microsoft.SQLServer.2008.EventProvider | Default |
GenerateAlert | WriteAction | System.Health.GenerateAlert | Default |
<Rule ID="Microsoft.SQLServer.2008.SpecifiedLSNForRepldoneLogscanOccursBeforeTheCurrentStartOfReplicationInTheLogRule" Target="SQL2008Core!Microsoft.SQLServer.2008.DBEngine" Enabled="false" ConfirmDelivery="true">
<Category>EventCollection</Category>
<DataSources>
<DataSource ID="DS" TypeID="Microsoft.SQLServer.2008.EventProvider">
<ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
<PublisherName>$Target/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ServiceName$</PublisherName>
<EventNumber>18768</EventNumber>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID="GenerateAlert" TypeID="SystemHealth!System.Health.GenerateAlert">
<Priority>2</Priority>
<Severity>2</Severity>
<AlertMessageId>$MPElement[Name="Microsoft.SQLServer.2008.SpecifiedLSNForRepldoneLogscanOccursBeforeTheCurrentStartOfReplicationInTheLogRule.AlertMessage"]$</AlertMessageId>
<AlertParameters>
<AlertParameter1>Event ID: $Data/EventDisplayNumber$. $Data/EventDescription$</AlertParameter1>
</AlertParameters>
<Suppression>
<SuppressionValue>$Data/LoggingComputer$</SuppressionValue>
<SuppressionValue>$Data/PublisherName$</SuppressionValue>
<SuppressionValue>$Data/EventDisplayNumber$</SuppressionValue>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>