KB2733630 - 合併代理程式在 SQL Server 的合併式複寫同步處理期間可能會失敗

Applies To
SQL Server 2008 Developer SQL Server 2008 Enterprise SQL Server 2008 Express SQL Server 2008 R2 Datacenter SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Express SQL Server 2008 R2 Parallel Data Warehouse SQL Server 2008 R2 Standard SQL Server 2008 R2 Web SQL Server 2008 R2 Workgroup SQL Server 2008 Standard SQL Server 2008 Web SQL Server 2008 Workgroup SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Express SQL Server 2012 Standard SQL Server 2012 Web SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Express - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2014 Web - duplicate (do not use)

症狀

在 Microsoft SQL Server 2008 和更新版本的 SQL Server 中同步處理合併式複寫時,合併代理程式可能會失敗。 此外,您收到下列錯誤訊息:

注意

在偵測到保留型中繼資料清理已刪除訂閱者中尚未傳送給發行者的變更中繼資料後,合併代理程式失敗。 您必須重新初始化訂閱 (,而不需要上傳) 。 (來源:MSSQL_REPL,錯誤號碼:MSSQL_REPL-2147199401)

取得說明:http://help/MSSQL_REPL-2147199401

發生此問題的原因有很多。 其中包括在某些情況下可以預期的許多原因。 若要判斷您是否意外遇到此錯誤,請檢查「原因」一節中所述的中繼資料詳細資料。

原因

這個問題的原因可在訂閱者的以下系統表格中找到:

  • dbo.sysMergeSubscriptions
  • DBO。MsMerge_Genhistory

請確定合併代理程式已不再同步。 然後,執行下列查詢並檢查結果:

從 SubscriberDB.dbo.sysMergeSubscriptions 選取 sentgen,其中 pubid = subid 且 sentgen 不是 Null

查詢結果

sentgen 資料行會標示訂閱者傳送給發行者的最舊變更群組。 如果傳回多個值,請檢查 dbo.sysMergeSubscriptions 資料表中的其他資料行,以確定您檢視的是正確發行項目的中繼資料。 接下來,使用此查詢在下列查詢中傳回的值:

選取前 20 * from SubscriberDB.dbo.MSmerge_genhistory where generation >= sentgen_value order by generation查詢的輸出應類似下列:

依世代的查詢結果

當下列所有條件為真時,您可能會意外遇到錯誤:

  • 第一列的 產生 資料行中的值略大於上一個查詢中的 sentgen 值。
  • genstatus 資料行中的值為 4。
  • changecount 資料行中的值為 0。

注意:第一列的 coldate 欄的值通常也會比其他列中的該欄的值舊得多。

解決方式

若要解決此問題,請重新初始化產生錯誤的訂閱者。

在某些情況下,您或許可以解決此問題,而不需要完全重新初始化。 如需可能因應措施的相關資訊,請連絡 Microsoft 客戶支援服務。

若要防止將來再次發生此問題,請根據您的 SQL Server 版本,套用下列其中一個修正程式。

累積更新資訊

SQL Server 2008

SQL Server 2008 中沒有此問題的修正程式。

SQL Server 2008 R2 Service Pack 2

此問題的修正程式最初在累積更新 3 中發行。 如需有關如何取得 SQL Server 2008 R2 Service Pack 2 累積更新套件的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

2754552 SQL Server 2008 R2 Service Pack 2 累積更新套件 3
 注意:由於這些組建是累積的,因此每個新發行的修正程式都包含先前的 SQL Server 2008 R2 Service Pack 2 修正程式版本中包含的所有 Hotfix 和所有安全性修正程式。 建議您考慮套用包含此 Hotfix 的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

2730301 發行 SQL Server 2008 R2 Service Pack 2 之後所發行的 SQL Server 2008 R2 組建

SQL Server 2012

此問題的修正程式最初在累積更新 4 中發行。 如需有關如何取得此 SQL Server 2012 累積更新套件的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

2758687 SQL Server 2012 累積更新套件 4
 注意:由於這些組建是累積的,因此每個新發行的修正程式都包含所有 Hotfix 和先前的 SQL Server 2012 修正程式版本中包含的所有安全性修正程式。 建議您考慮套用包含此 Hotfix 的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

2692828 SQL Server 2012 發行之後所發行的 SQL Server 2012 組建

SQL Server 2008 R2 Service Pack 1

此問題的修正程式最初在累積更新 8 中發行。 如需有關如何取得此 SQL Server 2008 R2 Service Pack 1 累積更新套件的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

2723743 SQL Server 2008 R2 SP1 的累積更新套件 8 注意:由於這些組建是累積的,因此每個新發行的修正程式都包含先前的 SQL Server 2008 R2 Service Pack 1 修正程式版本中包含的所有 Hotfix 和所有安全性修正程式。 建議您考慮套用包含此 Hotfix 的最新修正版本。 如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:

2567616 SQL Server 2008 R2 SP1 發行之後所發行的 SQL Server 2008 R2 組建