指定給 repldone 記錄檔掃描的 LSN 發生於記錄檔中目前的複寫起始之前

Microsoft.SQLServer.2008.SpecifiedLSNForRepldoneLogscanOccursBeforeTheCurrentStartOfReplicationInTheLogRule (Rule)

Knowledge Base article:

摘要

指定給 repldone 記錄檔掃描的記錄序號發生於記錄檔中目前的複寫起始之前。

原因

交易記錄中有未複寫的交易標記為複寫,但目前沒有記錄讀取器代理程式可讀取這些未複寫的交易。記錄讀取器代理程式會將複寫命令與交易傳送到交易的散發資料庫中。認可各個交易後,記錄讀取器代理程式會在發行者資料庫中呼叫 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
指定給 repldone 記錄檔掃描的 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>