复制和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不能完全重现,尚不知道因何引起,因此不推荐两者一起使用。
参考链接:
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
惯例上图招狼
原文:http://www.cnblogs.com/TeyGao/p/3543656.html