Il numero di sequenza del file di log (LSN) specificato per l'analisi del log delle repliche completate è precedente all'inizio corrente della replica nel log.
Nel log delle transazioni sono presenti transazioni non replicate contrassegnate per la replica, ma al momento non esistono agenti di lettura log in grado di leggerle. L'agente di lettura log fornisce comandi e transazioni replicati al database di distribuzione all'interno delle transazioni. Dopo il commit di ogni transazione, l'agente chiama sp_repldone nel server di pubblicazione per contrassegnare informazioni quali il numero di sequenza dell'ultima transazione distribuita e il record di commit dell'eventuale transazione successiva da analizzare. Poiché sp_repldone viene chiamata nel server di pubblicazione dopo che è stato eseguito il commit della transazione nel database di distribuzione, è possibile che i dati di verifica del server di pubblicazione non siano corretti.
Ad esempio, dopo che l'agente di lettura log ha completato il commit di una transazione (T1) nel database di distribuzione e dopo che sp_repldone è stata chiamata per aggiornare i dati di verifica del server di pubblicazione per indicare che T1 è stata inviata e la transazione T2 è la successiva transazione da sottoporre ad analisi, l'agente lettura log passa alla transazione T2. Se il server di pubblicazione viene arrestato subito dopo il commit della transazione T2 nel database di distribuzione, ma prima che sp_repldone venga chiamata per aggiornare le informazioni di verifica del server di pubblicazione, quando il server di pubblicazione sarà riavviato i dati di verifica indicheranno ancora che T1 è appena stata inviata e T2 è in attesa di analisi. In questo modo si verifica tuttavia un'incoerenza con il fatto che il commit di T2 è già stato eseguito nel database di distribuzione. L'agente di lettura log gestisce la situazione a livello interno. All'avvio successivo, l'agente di lettura log invierà una query al database di distribuzione per ottenere il numero di sequenza dell'ultima transazione distribuita (LSN), quindi chiamerà sp_repldone per reimpostare i dati di verifica del server di pubblicazione in modo da impedire che il set di comandi e transazioni già recapitato venga inviato di nuovo.
Questo errore può verificarsi se il numero di sequenza della transazione recuperato dall'agente di lettura log dal database di distribuzione è minore del numero di sequenza dell'ultima transazione recapitata indicato nei dati di verifica. Questa condizione indica che nel database di distribuzione mancano alcuni comandi e transazioni precedentemente inviati dall'agente di lettura log. È ad esempio possibile che l'opzione sync with backup non fosse abilitata nel database quando il database di distribuzione è stato ripristinato a una versione precedente mentre l'agente di lettura log recapitava i comandi e le transazioni al database di distribuzione. Un'altra possibile causa potrebbe essere stata l'eliminazione manuale da parte dell'utente di alcuni record della tabella MSrepl_transactions del database di distribuzione.
L'errore può inoltre verificarsi se la replica è stata rimossa in modo incompleto o se si sono verificati problemi di coerenza nel database.
Per risolvere il problema, procedere come segue:
Utilizzare DBCC CHECKDB per verificare la coerenza del database.
Se non esistono altri metodi per cancellare il log delle transazioni, eseguire sp_repldone e impostare @xactid su NULL, @xact_seqno su NULL e @reset su 1, in modo che tutte le transazioni replicate presenti nel log vengano contrassegnate come distribuite. Ciò risulta utile quando nel log delle transazioni sono presenti transazioni replicate non più valide e si vuole troncare il log. Attenzione: è possibile usare questa procedura in situazioni di emergenza per consentire il troncamento del log delle transazioni quando sono presenti transazioni in attesa di replica. Questa procedura fa sì che i record esistenti vengano ignorati, generando incoerenze tra il server di pubblicazione e il Sottoscrittore.
EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1
Per garantire la coerenza, se possibile eliminare e ricreare tutte le pubblicazioni e sottoscrizioni.
Nome | Descrizione | Valore predefinito |
Abilitato | Abilita o disabilita il flusso di lavoro. | No |
Priorità | Definisce la priorità dell'avviso. | 2 |
Gravità | Definisce la gravità dell'avviso. | 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>