复制和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-SL4UN7FJ2UJSQL_MASTER”上执行“sp_replcmds”。 (源: MSSQL_REPL,错误号: MSSQL_REPL20011) 获取帮助: http://help/MSSQL_REPL20011 未能在变更数据捕获变更表中插入行。请参阅当前会话中的以前错误以确定原因,并更正所有关联的问题。 (源: MSSQLServer,错误号: 22863) 获取帮助: http://help/22863 进程无法在“WIN-SL4UN7FJ2UJSQL_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
惯例上图招狼