Регистрационный номер транзакции в журнале, указанный для просмотра журнала репликации перед текущим запуском репликации в журнале.
В журнале транзакций, помеченном для репликации, есть нереплицированные транзакции, однако отсутствуют текущие агенты чтения журнала, которые могут их прочитать. Посредством транзакций агент чтения журнала доставляет реплицированные команды и транзакции в базу данных распространителя. После фиксации каждой транзакции агент чтения журнала вызывает процедуру sp_repldone в базе данных издателя, чтобы отметить такие сведения, как порядковый номер последней распределенной транзакции и запись фиксации следующей сканируемой транзакции (если есть). Так как процедура sp_repldone вызывается в базе данных издателя после фиксации транзакции в базе данных распространителя, данные трассировки базы данных издателя могут быть неверными.
Например, после того как данное средство чтения журнала успешно фиксировало транзакцию (назовем ее T1) в базе данных распространителя и процедура sp_repldone была вызвана для обновления данных трассировки базы данных издателя, чтобы запомнить отправленную транзакцию T1, а следующей должна быть просмотрена транзакция T2, агент чтения журнала переходит к транзакции T2. Если издатель завершает работу сразу после фиксации транзакции T2 в базе данных распространителя агентом чтения журнала, но до вызова процедуры sp_repldone для обновления данных отслеживания базы данных издателя, то при возобновлении работы издателя данные отслеживания продолжают указывать на то, что транзакция T1 была недавно отправлена, а следующей должна быть просмотрена транзакция T2. Однако это не согласуется с тем фактом, что транзакция T2 уже фиксирована в базе данных распространителя. Агент чтения журнала обрабатывает такую ситуацию внутренним образом. При следующем запуске агент чтения журнала отправляет базе данных распространителя запрос на поиск порядкового номера последней распределенной транзакции (LSN). После этого агент вызывает процедуру sp_repldone, чтобы сбросить данные трассировки базы данных издателя. Это необходимо для того, чтобы избежать повторной отправки уже доставленных команд и транзакций.
Эта ошибка может возникнуть, если порядковый номер транзакции, полученный агентом чтения журнала из базы данных распространителя, меньше порядкового номера последней доставленной транзакции в соответствии с данными трассировки. Это состояние означает, что в базе данных распространителя отсутствуют некоторые команды и транзакции, ранее отправленные агентом чтения журнала. Например, для базы данных распространителя не был включен параметр sync with backup при восстановлении ее более ранней версии в то время, как агент чтения журнала доставлял команды и транзакции в базу данных распространителя. Другой возможных случай — пользователь вручную удалил некоторые записи из таблицы MSrepl_transactions в базе данных распространителя.
Эта ошибка также может возникнуть при неполном удалении репликации или возникновении несогласованности в базе данных.
Чтобы устранить эту проблему, выполните следующие действия.
С помощью DBCC CHECKDB проверьте согласованность базы данных.
Если нет другого способа очистки журнала транзакций, выполните процедуру sp_repldone и установите @xactid = NULL, @xact_seqno = NULL и @reset = 1, чтобы все реплицированные транзакции в журнале были помечены как распределенные. Это удобно, когда в журнале транзакций присутствуют уже недействительные реплицированные транзакции и требуется выполнить усечение этого журнала. Внимание! Эту процедуру можно использовать в аварийных ситуациях, чтобы разрешить усечение журнала транзакций с транзакциями, ожидающими репликации. Это приведет к пропуску существующих записей журнала и, следовательно, к возникновению несогласованности между издателем и подписчиком.
EXEC sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1
Для обеспечения согласованности удалите и заново создайте все публикации и подписки, если это возможно.
Название | Описание | Значение по умолчанию |
Включено | Включает или отключает рабочий процесс. | Нет |
Приоритет | Определяет приоритет предупреждения. | 2 |
Важность | Определяет серьезность предупреждения. | 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>