Replication--復制與CDC和鏡像


復制和CDC 都是使用logreader來從日志中讀取數據的變更,然后寫入到分發庫(復制)或變更表中。

1> 單獨創建復制發布

在該情況下,會在分發服務器上創建日志讀取代理作業(ServerName_DBName_logreaderID)

2> 單獨使用CDC

在該情況下,會在當前實例的代理上創建兩個作業‘cdc.DBName_capture’(調用sys.sp_MScdc_capture_job來讀取日志)和‘cdc.DemoDB3_cleanup’(調用sys.sp_MScdc_cleanup_job來清理過期的變更歷史記錄)

3>先創建復制發布,再使用CDC

創建復制時在分發服務器上創建日志讀取代理作業,使用CDC時只在當前實例的代理上創建作業‘cdc.DemoDB3_cleanup’

4>先使用CDC,再創建復制

使用CDC時,會在當前實例的代理上創建兩個作業‘cdc.DBName_capture’和‘cdc.DemoDB3_cleanup’,然后在創建復制發布時,刪除作業‘cdc.DBName_capture’,然后在分發服務器上創建日志讀取代理作業。

當數據庫上最后一個復制發布刪除時,如果數據庫還在使用CDC,則會刪除復制的日志讀取代理作業,創建一個CDC作業‘cdc.DBName_capture’。

當數據庫上最后一個表上CDC被禁用時,不會刪除CDC的作業,而如果在數據庫級別禁用CDC時,會刪除CDC相關的兩個作業。

 

MSDN如是說:

當日志讀取器代理同時用於變更數據捕獲和事務復制時,復制的更改將首先寫入分發數據庫。  然后,捕獲的更改會寫入更改表。 兩項操作會一起提交。 如果在寫入分發數據庫時有任何滯后時間,則在更改顯示在更改表中之前,將有對應的滯后時間。

 

總結:

1.當復制和CDC一起使用時,CDC會使用復制的日志讀取代理作業,代理作業讀取到日志后,會優先將數據寫入到分發庫,然后再將數據寫入到CDC的歷史變更表中。

2. 無論在多少張表上啟用CDC或創建多少個發布,一個數據庫上只能有一個作業負責讀取日志。

3. 默認情況下,日志需要等待被復制和CDC處理完成后才會被同步到鏡像端。

 

JD DBR(肖磊削一刀)補充:

CDC和復制共同使用會有一些莫名其妙的bug,而這些bug不能完全重現,尚不知道因何引起,因此不推薦兩者一起使用。

 ===============================================================================================

肖磊提到:在復制和CDC均有的環境中,直接刪除最后一個發布將導致logreader被刪除,即便CDC重新創建capture,但也會報錯,貌似是LSN滯后的錯誤,導致CDC失效;

測試1:

步驟:搭建事務復制和CDC,事務復制使用表TB2,CDC使用表TB1,在對表TB1循環插入數據的同時,刪除復制發布。

結果:復制發布被成功移除,新的capture作業被新建,歷史跟蹤表中數據未丟失(操作期間所有的操作都被寫入到歷史表中)

PS: 肖大俠所遇問題的場景與測試1的場景類似。

 

測試2:

步驟:在表TB1上啟用CDC,然后在表TB1上創建快照復制,然后刪除快照復制(UI操作)

結果:刪除失敗

解決辦法:在表和數據庫上禁用CDC后,可以正常刪除快照復制

 

測試3:

步驟:在表TB1上啟用CDC,然后在表TB1上創建事務發布,並創建訂閱,保證訂閱成功運行,在對表TB1循環插入數據的同時,刪除復制發布。

結果:復制發布被成功移除,新的capture作業被新建,歷史跟蹤表中數據未丟失(操作期間所有的操作都被寫入到歷史表中)

 

測試總結:

在測試中未能重下肖大俠所說的問題,由於測試的局限性,肖大俠所說的問題仍需要考慮

 

解決辦法猜想:

如果按肖大俠所說的LSN問題,那么是否可以在刪除復制之前停用復制,然后再刪除發布,這樣是否可能降低問題出現的概率呢?

 

=================================================================================================

一台服務器上出現復制問題,日志讀取出現問題,重啟日志讀起代理依然報錯,錯誤提示如下:

錯誤消息:
進程無法在“WIN-SL4UN7FJ2UJ\SQL_MASTER”上執行“sp_replcmds”。 (源: MSSQL_REPL,錯誤號: MSSQL_REPL20011)
獲取幫助: http://help/MSSQL_REPL20011
未能在變更數據捕獲變更表中插入行。請參閱當前會話中的以前錯誤以確定原因,並更正所有關聯的問題。 (源: MSSQLServer,錯誤號: 22863)
獲取幫助: http://help/22863
進程無法在“WIN-SL4UN7FJ2UJ\SQL_MASTER”上執行“sp_replcmds”。 (源: MSSQL_REPL,錯誤號: MSSQL_REPL22037)
獲取幫助: http://help/MSSQL_REPL22037

經調查,發布中的部分表開啟了CDC功能。
解決辦法:

1.禁用表和數據庫上的CDC

2.重新初始化訂閱

3.開啟數據庫和表上的CDC

=================================================================================================

 參考鏈接:

1>禁用表上CDC http://msdn.microsoft.com/zh-cn/library/bb510702(v=sql.105)

2>禁用數據上CDC http://msdn.microsoft.com/zh-cn/library/bb522508(v=sql.105).aspx

 

慣例上圖招狼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM