略過交易式複寫中的錯誤

對於交易式複寫,如果在散發過程中遇到錯誤,有兩種方法略過它們:

  • 散發代理程式的 -SkipErrors 參數可讓您略過特定類型的錯誤。含有錯誤的交易不會認可,但是後續的交易則會。

  • sp_setsubscriptionxactseqno 預存程序可讓您略過導致錯誤的一個或多個交易。此選項不可用於非 SQL Server「訂閱者」。

重要事項重要事項

在一般複寫處理情況下,您應該不會遇到需要略過的任何錯誤。略過錯誤時應該特別小心,而且還需要瞭解錯誤狀態、發生錯誤的原因,以及這些錯誤或特定交易需略過而不是進行解析的原因。如果在「發行者」端認可的交易在「訂閱者」端略過,則兩個節點將不會完全同步,這將導致其他的錯誤。

-SkipErrors 參數

依預設,當「散發代理程式」遇到錯誤時,代理程式就會停止。如果您使用 -SkipErrors 參數,並指定預期的錯誤或您不希望妨礙複寫的錯誤,則代理程式將會記錄錯誤資訊,然後繼續執行。例如,如果您要指定「散發代理程式」需記錄重複索引鍵違規,但又要繼續處理後續的交易,則指定代理程式略過錯誤 2601 (無法以唯一索引 '%.*ls' 在物件 '%.*l s' 中插入重複的索引鍵資料列) 和 2627 (違反 %ls 條件約束 '%.*ls'。無法在物件 '%.*ls' 中插入重複的索引鍵。):

-SkipErrors 2601:2627

使用 -SkipErrors 參數最常用的方法是,使用標題為資料一致性錯誤時仍然繼續的散發代理程式設定檔。然後,「散發代理程式」就會略過錯誤 2601、2627 和 20598 (套用複寫的命令時在訂閱者端找不到資料列)。如需詳細資訊,請參閱<複寫代理程式設定檔>。除了這個預先定義的設定檔,您可於自行建立或修改的代理程式設定檔中,或者在命令列上指定參數。如需詳細資訊,請參閱:

重要事項重要事項

依預設,執行觸發程序時 XACT_ABORT 設定為 ON。若散發代理程式為訂閱者套用變更時,觸發程序中的陳述式導致錯誤,失敗的不只有個別陳述式,整個批次的變更都會失敗。在交易式複寫中,您可以使用散發代理程式的 -SkipErrors 參數來略過造成錯誤的陳述式。如果 -SkipErrors 與 XACT_ABORT ON 搭配使用,只要有一個陳述式發生錯誤,整個批次的變更都會略過。除非您需要在觸發程序中將 XACT_ABORT 設定為 ON,否則如果使用 -SkipErrors 參數,我們建議您設定為 OFF。若要設定選項為關閉,請於觸發程序定義中指定 SET XACT_ABORT OFF。如需有關 XACT_ABORT 的資訊,請參閱<SET XACT_ABORT (Transact-SQL)>。

sp_setsubscriptionxactseqno 預存程序

sp_setsubscriptionxactseqno 預存程序可以用來略過在「訂閱者」端套用時造成錯誤的一個或多個交易。如果發生失敗,而您想略過一個或多個交易:

  1. 「散發代理程式」停止後在「散發者」端執行 sp_helpsubscriptionerrors。此預存程序會傳回 xact_seqno 資料行,其中包含每個失敗交易的記錄序號 (LSN)。

  2. 執行 sp_setsubscriptionxactseqno,為參數 @xact_seqno 指定值。如果您想略過所有失敗的交易,則指定 sp_helpsubscriptionerrors 傳回的最大 LSN。

如需詳細資訊,請參閱<sp_setsubscriptionxactseqno (Transact-SQL)>和<sp_helpsubscriptionerrors (Transact-SQL)>。