El número de secuencia de registro especificado para el examen del registro repIdone tiene lugar antes del inicio actual de la replicación en el registro.
Hay transacciones sin replicar en el registro de transacciones marcadas para la replicación, pero actualmente no hay ningún Agente de registro del LOG que pueda leer esas transacciones sin replicar. El Agente de registro del LOG entrega los comandos y las transacciones replicados a la base de datos de distribución dentro de las transacciones. Una vez confirmada cada una de las transacciones, el Agente de registro del LOG llama a sp_repldone en la base de datos del publicador para marcar información como el número de secuencia de la última transacción distribuida y el registro de confirmación de la siguiente transacción que se debe examinar, si hay alguna. Ya que se llama a sp_repldone en la base de datos del publicador, una vez confirmada la transacción en la base de datos de distribución, puede que la base de datos del publicador tenga datos de seguimiento incorrectos.
Por ejemplo, una vez que el lector del registro confirma una transacción de forma correcta (la llamaremos T1) en la base de datos de distribución y se llama a sp_repldone para actualizar los datos de seguimiento de la base de datos del publicador para que tenga en cuenta que T1 se ha enviado y que la transacción T2 es la siguiente que se debe examinar, el Agente de registro del LOG pasa a la transacción T2. Si el publicador se cierra inmediatamente después de que el Agente de registro del LOG confirme la transacción T2 en la base de datos de distribución pero antes de que se llame a sp_repldone para actualizar la información de seguimiento de la base de datos del publicador, cuando el publicador vuelve a activarse, los datos de seguimiento aún indican que se acaba de enviar T1 y que T2 es la siguiente que se debe examinar. Sin embargo, esto no concuerda con el hecho de que T2 ya se ha confirmado en la base de datos de distribución. El Agente de registro del LOG administra esta situación de forma interna. La siguiente vez que se inicie el Agente de registro del LOG, consultará la base de datos de distribución para averiguar el número de secuencia de la última transacción distribuida (LSN). Después de esto, llama a sp_repldone para restablecer los datos de seguimiento de la base de datos del publicador de forma que el conjunto de comandos y transacciones entregados no se envíen de nuevo.
Este error puede aparecer si el número de secuencia de transacción recuperado por el Agente de registro del LOG desde la base de datos de distribución es menor que el número de secuencia de la última transacción entregada, tal y como se indica en los datos de seguimiento. Esta situación implica que en la base de datos de distribución faltan algunos comandos y transacciones que el Agente de registro del LOG envió previamente. Por ejemplo, si no estaba habilitado sync with backup en la base de datos de distribución al restaurar la base de datos de distribución a una versión anterior mientras el Agente de registro del LOG estaba entregando comandos y transacciones a la base de datos de distribución. Otra posible causa es que el usuario elimine manualmente algunos registros de la tabla MSrepl_transactions correspondiente a la base de datos de distribución.
El error también podría producirse si la replicación no se ha quitado por completo o si hay una incoherencia en la base de datos.
Para resolver este problema, intente lo siguiente:
Use DBCC CHECKDB para comprobar la coherencia de la base de datos.
Si no hay otra forma de limpiar el registro de transacciones, ejecute sp_repldone y elija el valor NULL para @xactid, el valor NULL para @xact_seqno y el valor 1 para @reset, de forma que todas las transacciones replicadas del registro se marquen como distribuidas. Esto resulta útil cuando existen transacciones replicadas en el registro de transacciones que ya no son válidas y desea truncar el registro. Precaución Este procedimiento se puede utilizar en situaciones de emergencia para permitir el truncamiento del registro de transacciones cuando las transacciones pendientes de replicación están presentes. Esto provocará que los registros existentes del registro se omitan, con lo que se producirán incoherencias entre el publicador y el suscriptor.
EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1
Para garantizar la coherencia, quite y vuelva a crear todas las publicaciones y suscripciones si es posible.
Nombre | Descripción | Valor predeterminado |
Habilitado | Habilita o deshabilita el flujo de trabajo. | No |
Prioridad | Define la prioridad de la alerta. | 2 |
Gravedad | Define la gravedad de la 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>