復制和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
慣例上圖招狼