zoukankan      html  css  js  c++  java
  • Replication--复制与CDC和镜像

    复制和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

    惯例上图招狼

  • 相关阅读:
    C#与数据库访问技术总结(十一)之数据阅读器(DataReader)1
    C#与数据库访问技术总结(十)之添加&删除
    C#与数据库访问技术总结(九)之实例
    C#与数据库访问技术总结(八)之ExecuteNonQuery方法
    C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例
    C#与数据库访问技术总结(七)综合示例
    C#与数据库访问技术总结(五)之Command对象的常用方法
    OS——进程简答题(1)
    LAMP/LNMP 一键安装脚本
    运维如何延续自己的职业生涯--萧田国2017年GOPS深圳站演讲内容
  • 原文地址:https://www.cnblogs.com/TeyGao/p/3543656.html
Copyright © 2011-2022 走看看