Номер LSN транзакции в журнале, указанный для просмотра журнала репликации перед текущим запуском репликации в журнале

Microsoft.SQLServer.2008.SpecifiedLSNForRepldoneLogscanOccursBeforeTheCurrentStartOfReplicationInTheLogRule (Rule)

Knowledge Base article:

Сводка

Регистрационный номер транзакции в журнале, указанный для просмотра журнала репликации перед текущим запуском репликации в журнале.

Причины

В журнале транзакций, помеченном для репликации, есть нереплицированные транзакции, однако отсутствуют текущие агенты чтения журнала, которые могут их прочитать. Посредством транзакций агент чтения журнала доставляет реплицированные команды и транзакции в базу данных распространителя. После фиксации каждой транзакции агент чтения журнала вызывает процедуру sp_repldone в базе данных издателя, чтобы отметить такие сведения, как порядковый номер последней распределенной транзакции и запись фиксации следующей сканируемой транзакции (если есть). Так как процедура sp_repldone вызывается в базе данных издателя после фиксации транзакции в базе данных распространителя, данные трассировки базы данных издателя могут быть неверными.

Например, после того как данное средство чтения журнала успешно фиксировало транзакцию (назовем ее T1) в базе данных распространителя и процедура sp_repldone была вызвана для обновления данных трассировки базы данных издателя, чтобы запомнить отправленную транзакцию T1, а следующей должна быть просмотрена транзакция T2, агент чтения журнала переходит к транзакции T2. Если издатель завершает работу сразу после фиксации транзакции T2 в базе данных распространителя агентом чтения журнала, но до вызова процедуры sp_repldone для обновления данных отслеживания базы данных издателя, то при возобновлении работы издателя данные отслеживания продолжают указывать на то, что транзакция T1 была недавно отправлена, а следующей должна быть просмотрена транзакция T2. Однако это не согласуется с тем фактом, что транзакция T2 уже фиксирована в базе данных распространителя. Агент чтения журнала обрабатывает такую ситуацию внутренним образом. При следующем запуске агент чтения журнала отправляет базе данных распространителя запрос на поиск порядкового номера последней распределенной транзакции (LSN). После этого агент вызывает процедуру sp_repldone, чтобы сбросить данные трассировки базы данных издателя. Это необходимо для того, чтобы избежать повторной отправки уже доставленных команд и транзакций.

Эта ошибка может возникнуть, если порядковый номер транзакции, полученный агентом чтения журнала от базы данных распространителя, меньше порядкового номера последней доставленной транзакции в соответствии с данными трассировки. Это состояние означает, что в базе данных распространителя отсутствуют некоторые команды и транзакции, ранее отправленные агентом чтения журнала. Например, для базы данных распространителя был установлен флажок sync with backup при восстановлении ее более ранней версии в то время, как агент чтения журнала доставляет команды и транзакции в базу данных распространителя. Другой возможных случай — пользователь вручную удалил некоторые записи из таблицы MSrepl_transactions в базе данных распространителя.

Эта ошибка также может возникнуть при неполном удалении репликации или возникновении несогласованности в базе данных.

Решения

Чтобы устранить эту проблему, выполните следующие действия.

Для обеспечения согласованности удалите и заново создайте все публикации и подписки, если это возможно.

Element properties:

TargetMicrosoft.SQLServer.2008.DBEngine
CategoryEventCollection
EnabledFalse
Alert GenerateTrue
Alert SeverityError
Alert PriorityHigh
RemotableTrue
Alert Message
Номер LSN транзакции в журнале, указанный для просмотра журнала репликации перед текущим запуском репликации в журнале
{0}

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.SQLServer.2008.EventProvider Default
GenerateAlert WriteAction System.Health.GenerateAlert Default

Source Code:

<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>$Data/EventDescription$</AlertParameter1>
</AlertParameters>
<Suppression>
<SuppressionValue>$Data/LoggingComputer$</SuppressionValue>
<SuppressionValue>$Data/PublisherName$</SuppressionValue>
<SuppressionValue>$Data/EventDisplayNumber$</SuppressionValue>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>