標籤:
最近遇到“應用複製的命令時在訂閱伺服器上找不到該行”問題,報錯如下:
官方給出的建議是重新同步和初始化訂閱,當然,這是一種選擇,但是對於動輒上百G的生產庫,這種方法會消耗大量的資源和時間。可以通過定位出錯資料,選擇跳過,等從庫追平主庫後,修複錯誤資料方式,達到最終主從資料一致。
解決思路1.
找到分發任務的事務序號
- 如果是複製分發停止了,那麼在錯誤資訊中會顯示事務序號。中是‘0x000311CC00013A7300010000000’
- 如果複製錯誤資訊在顯示視窗中被覆蓋,比如選擇了跳過錯誤,或者其他錯誤覆蓋了該錯誤,可以在散發者上執行 :
sp_helpsubscriptionerrors [ @publisher = ]‘publisher‘, [ @publisher_db = ]‘publisher_db‘ , [ @publication = ]‘publication‘ , [ @subscriber = ]‘subscriber‘ , [ @subscriber_db = ]‘subscriber_db‘
參數對應值可以通過下面查詢擷取:
select * from MSsubscriber_info
擷取publisher_db和publication
select * from MSpublications
在訂閱伺服器上執行,擷取事務序號
sp_setsubscriptionxactseqno [ @publisher= ]‘publisher‘, [ @publisher_db= ]‘publisher_db‘, [ @publication= ]‘publication‘, [ @xact_seqno= ] xact_seqno
樣本:
2.
查看出錯命令
擷取事務序號之後,查看事務號對應的具體命令:
sp_browsereplcmds [ [ @xact_seqno_start = ] ‘xact_seqno_start‘ ] [ , [ @xact_seqno_end = ] ‘xact_seqno_end‘ ] [ , [ @originator_id = ] ‘originator_id‘ ] [ , [ @publisher_database_id = ] ‘publisher_database_id‘ ] [ , [ @article_id = ] ‘article_id‘ ] [ , [ @command_id= ] command_id ] [ , [ @agent_id = ] agent_id ][ , [ @compatibility_level = ] compatibility_level ]
前兩個參數是開始事務號和結束事務號,輸入這兩參數即可
command 預設的命名規則是sp_MS+operation+_schemaName+tableName
通過樣本知道該動作表示對T_CarPakingRecord表進行update操作,最後的表示的是主鍵。
3.
補救措施
根據上面分析的命令結果,將完整資料插入到從庫中(這裡是補救缺失行錯誤,如果是插入重複則直接刪除即可)
如果認為資料一致性不重要,則可以直接跳過,不推薦這樣。跳過錯誤的命令:
sp_setsubscriptionxactseqno [ @publisher = ] ‘發行伺服器主機名稱‘, [ @publisher_db = ] ‘發行集資料庫‘, [ @publication = ] ‘發布名稱‘, [ @xact_seqno = ] 跳過的事務號
select*from MSpublications
sqlserver複寫延遲報”應用複製的命令時在訂閱伺服器上找不到該行“