复制和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,错误号: )
获取帮助: 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

惯例上图招狼

Replication--复制与CDC和镜像-LMLPHP

05-11 11:29