复制和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和镜像的更多相关文章

  1. 浅谈MySQL Replication(复制)基本原理

    1.MySQL Replication复制进程MySQL的复制(replication)是一个异步的复制,从一个MySQL instace(称之为Master)复制到另一个MySQL instance ...

  2. Chapter 17 Replication 复制

    Chapter 17 Replication 复制 Table of Contents 17.1 Replication Configuration 17.2 Replication Implemen ...

  3. 在Docker平台实现MySQL Replication(复制)

    MySQL Replication提供了数据库之间复制数据的功能,通过这个功能可以让一个数据库的数据更改自动同步到另外一个数据库.通常用这个功能来实现数据备份.数据容灾.数据冗余,进一步实现数据的读写 ...

  4. Redis的Replication(复制)

    文件并发(日志处理)--队列--Redis+Log4Net 分布式中使用Redis实现Session共享(二) http://www.cnblogs.com/stephen-liu74/archive ...

  5. Active Directory Replication(复制)

    KCC(The Knowledge Consistency Checker)知识一致性检查器是一个内置的程序,在所有与管理器上运行,为林创建复制拓扑.默认,KCC15分钟间隔运行一次,根据当时存活的最 ...

  6. Windows 下MySql Replication(复制)配置

    环境准备 到官网下载mysql-installer-web-community-5.7.21.0.msi并安装,选择MySql Workbench,记录安装时root输入的密码. 需要安装在两台机器上 ...

  7. MongoDB基础之九 replication复制集

    准备工作:创建目录 mkdir -p /home/m17 //home/m18 /home/m19 /home/mlog 1:启动3个实例,且声明实例属于某复制集 # ./bin/mongod --d ...

  8. MySQL 5.6 Replication 复制 FAQ

    原文请参照MySQL官方文档Reference Manual,版本5.6.10. 复制功能使得数据可以从一个MySQL数据库(master主库)复制到另一个或多个MySQL数据库(slave从库).缺 ...

  9. mysql replication 复制的一些问题

    1   过大的复制延迟 mysql 的复制延迟是一个常见问题,现在已经有一些解决方案,如淘宝开发的一些工具 2 没有磁盘空间 复制导致磁盘空间塞满,二进制日志.中继日志或临时文件把磁盘塞满,slave ...

随机推荐

  1. java程序后台报错java.net.SocketException: Too many open files

    问题描述: 今天一个同事反映程序有问题,让帮忙查看后台日志,发现后台日志报错的信息如下: java.net.SocketException: Too many open files at java.n ...

  2. mysql中,如何查看数据库元数据(metadata)的字符集?

    需求描述: mysql中,数据库的元数据也是有字符集的. 操作过程: 1.查看mysql数据库元数据的字符集 mysql> show variables like 'character_set_ ...

  3. kendo-ui的使用和开发自己的组件

    摘要: 前面介绍了一款非常不错的前端框架kendo-ui,如果你想阅读,请点这里.通过使用它一段时间,感觉是非常好用.下面就介绍一下如何使用它和开发自己的组件 引入: 只需要引进下面三个文件即可 ke ...

  4. visual studio 2017使用NHibernate4.0连接oracle11g数据库

    之前一直是公司用NHibernate2.1来做项目,连接oracle 10g的数据库,配置NHibernate的东西都是以前的同事做好了的,也怪自己太懒了,没尝试过配置这个东西,虽然一直在使用NHib ...

  5. 聊聊iOS中TCP / UDP 协议

    TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于 传输层协议. UDP(User Datagram protoco ...

  6. POJ 1321 棋盘问题(状态压缩DP)

    不总结的话, 同一个地方会 WA 到死 思路: 状态压缩 DP. 1. s 表示压缩状态, 若第 i 列放了棋子, 那么该列置 1, 否则该列置 0. 假如 s = 3(0x011) 那么表示棋盘的第 ...

  7. 解决Qt程序在Linux下无法输入中文的办法(与下文连接)

    在安装QT集成开发工具包之前需要先安装build-essential和libncurses5-dev这两个开发工具和库,libncurses5-dev库是一个在Linux/Unix下广泛应用的图形函数 ...

  8. PHP5 session 详解【经典】

    原文:http://www.pkwind.com/php5-session-xiang-jie-jing-dian http协议是WEB服务器与客户端 (浏览器)相互通信的协议,它是一种无状态协议.所 ...

  9. 教程Xcode 下编译发布与提交App到AppStore

    The proplem of Prepare for Upload for App store upload Application App store 增加新应用的步骤. 1. 访问iTunesCo ...

  10. LeetCode——Populating Next Right Pointers in Each Node

    Description: Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; Tree ...