指定給 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 資料表中手動刪除了一些記錄。
如果未完全移除複寫或資料庫中存在不一致的現象,也同樣會發生此錯誤。
若要解決此問題,請嘗試下列方法:
使用 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
若要確保一致性,請盡可能卸除然後重新建立所有發行集與訂閱。
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>$Data/EventDescription$</AlertParameter1>
</AlertParameters>
<Suppression>
<SuppressionValue>$Data/LoggingComputer$</SuppressionValue>
<SuppressionValue>$Data/PublisherName$</SuppressionValue>
<SuppressionValue>$Data/EventDisplayNumber$</SuppressionValue>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>