阅读本文之前请参考http://www.cnblogs.com/stswordman/p/3258897.html

最近又做了一个case,环境是sql server 2008 R2. 客户添加了一个'replication support only'的订阅,之后发现现存订阅出现了更新丢失。 丢失的数据恰巧是添加订阅前的几秒钟内生成的。

我开始以为是log reader没有开启造成的,检查了distribution database的MSlogreader_history

,发现期间log reader并没有停止过。

如果Log reader停止,那么添加订阅前的更新肯定是丢失了。因为产生的数据的LSN小于"添加订阅"的LSN, 并且distribution agent把"添加订阅"的LSN先传递到了订阅。可是log reader一直处于运行状态,那么还有什么可能呢? 如果log reader的效率很低,没有即时地将数据更新传递到distribution agent,那么也会产生这个问题吧?我想理论上是这样的,如果效率非常低,可以等同于log reader没有运行! 那么如何证明这一点呢?reproduce的过程可能会很复杂,而且客户的磁盘性能也很好…

我想到了另外一种可能,这个问题实际上和log reader的工作方式有关系:

当log reader启动后,会去读取publication database的日志,如果一次读取完后,如果publication database的日志中仍然有需要处理的数据,log reader会继续读;如果读取后没有数据需要处理,log reader会休息一段时间, 时间长度为PollingInterval的值(默认为5秒中)。 那么我们假设这样的情景。

PollingInterval为五秒。Log reader启动后发现没有数据需要读取,开始休息。

在第1秒的时候,其中的article a产生了数据更新

在第2秒的时候,其中的article b产生了数据更新

在第3秒的时候,添加了一个非snapshot方式初始化的订阅。

在第4秒的时候,其中的article c产生了数据更新

在第5秒的时候,其中的article d产生了数据更新

同时log reader开始继续扫描日志, 我们就会发现第一秒和第二秒的数据更新丢失了。

更多信息

1 向任意一个包含'replication support only' 订阅的发布添加article时都可能会导致这个发布库的所有发布的所有现存订阅出现更新丢失的问题。

向不包含'replication support only'订阅的发布添加不会有这个问题。

2 如果在添加一个'replication support only'的订阅时 ,该发布对应的发布数据库的所有已存在订阅也会出现更新丢失的情况,无论这些都订阅通过何种方式初始化,或属于那个发布。

解决方法之前文章介绍的相同

解决办法

===

升级至sql servr 2012

如果您暂时没有办法升级,可以采用以下两种方法:

  1. 添加一个新的发布,将新的article或订阅添加到发布中。
  2. 在添加article前将Log reader和Distribution agent停止。添加完成后,启动Log reader,确认Log reader已经将之前的数据传送到了Distribution数据库后(可以使用tracer token来确认Log reader是否已经完成同步), 启动Distribution agent。这样就可以避免数据丢失了。

更多信息

========

1 向任意一个包含’replication support only’ 订阅的发布添加article时,  都可能导致这个发布库的所有发布的所有现存订阅出现更新丢失的问题。 向不包含’replication support only’订阅的发布添加article不会有这个问题。

2 如果在添加一个’replication support only’的订阅时 ,该发布对应的发布数据库的所有发布的所有已存在订阅都会受到影响,无论这些订阅是通过何种方式初始化,或属于哪个发布。

一个事务复制的bug--更新丢失 续的更多相关文章

  1. 一个事务复制的bug--更新丢失

    有两种情况会造成更新丢失,第一种是不正确的设置,例如外键或触发器的“Not For Replication” (NFR)属性没有开启.详情请参考http://blogs.msdn.com/b/apgc ...

  2. SqlServer 使用脚本创建分发服务及事务复制的可更新订阅

    原文:SqlServer 使用脚本创建分发服务及事务复制的可更新订阅 [创建使用本地分发服务器] /************************[使用本地分发服务器配置发布]*********** ...

  3. sqlserver 2000事务复制问题

    2000现在用的估计不多了,把之前收集的一些复制问题整理发布出来.可能都是些很白很二的问题,但人总是由最初的无知不断成长,不对之处欢迎指正. sqlserver 2000事务复制问题服务器A(发布) ...

  4. SQL Server 2000事务复制问题

    2000现在用的估计不多了,把之前收集的一些复制问题整理发布出来.可能都是些很白很二的问题,但人总是由最初的无知不断成长●-● SQL Server 2000事务复制问题服务器A(发布) 服务器B(分 ...

  5. sqlserver 2005 分布式架构 对等事务复制 .

    http://www.cnblogs.com/qanholas/archive/2012/03/22/2412444.html     一.为什么要使用对等事务复制 首先要说明的是使用sqlserve ...

  6. 【数据库-Azure SQL Database】如何创建事务复制将本地数据同步到 SQL Azure

    Azure SQL DB 可以被配置成为 SQL Server 事务复制的一个订阅者( subscriber ). 主要应用场景有两种: 将您的数据迁移到 Azure SQL DB, 并且没有宕机时间 ...

  7. Mysql锁机制--并发事务带来的更新丢失问题

    Mysql 系列文章主页 =============== 刚开始学习 Mysql 锁的时候,觉得 Mysql 使用的是行锁,再加上其默认的可重复读的隔离级别,那就应该能够自动解决并发事务更新的问题.可 ...

  8. 一个简易的四则运算单元...(15.12.15 BUG更新)

    网上找的, 没有作者信息, 只能在这里感谢一下了, 支持标准写法的四则运算 --2015-12-15 修改了一个内存泄漏的BUG - Pop方法没有释放申请的内存 unit Base.Calculat ...

  9. 事务复制5: Transaction and Command

    事务复制使用 dbo.msrepl_transactions 和 dbo.MSrepl_commands 存储用于数据同步的Transaction和Command.在replication中,每个co ...

随机推荐

  1. IIS上虚拟目录下站点的web.config与根站点的web.config冲突解决方法

    IIS7.5上在站点下部署虚拟目录,访问虚拟目录下的项目提示与父节点配置冲突.,节点与的<system.web>节点与主站点的<system.web>冲突解决方法: 在站点下的 ...

  2. EF6配合MySQL或MSSQL(CodeFirst模式)配置指引

    一.新建一个解决方案,包含两个项目:EF6CodeFirstMySQL.Model(动态库项目),EF6CodeFirstMySQL.Tests(控制台应用) 二.通过NuGet将EntityFram ...

  3. 基于webmagic的爬虫小应用--爬取知乎用户信息

    听到“爬虫”,是不是第一时间想到Python/php ? 多少想玩爬虫的Java学习者就因为语言不通而止步.Java是真的不能做爬虫吗? 当然不是. 只不过python的3行代码能解决的问题,而Jav ...

  4. win7+vs2010+opencv2.4.6配置

    记录一下配置,省的以后还到处去找: (一) 添加环境变量://第一次使用opencv的话需要加环境变量:” %opencv%\build\x86\vc10\bin”和”%opencv%\build\c ...

  5. angularjs 分页精华代码

    //pageinfo $scope.pageSize=10;$scope.currentType={{ current_type }};$scope.currentPage={{ json_encod ...

  6. 对于大数据量的Json解析

    近几天做了一个项目,需要解析大量的json数据,有一万多条,以前我用的都是Gson包去自动解析,但是速度真是不敢恭维,于是我又去查了其它的方法,发现fastjson的解析,发现速度直的是很快,在此我不 ...

  7. hdu 1142(DFS+dijkstra)

    #include<iostream> #include<cstdio> #include<cmath> #include<map> #include&l ...

  8. Centos 7下mysql的安装与配置

    1,先下载好MySQ安装包并解压(不做详细说明). 2,上传解压后的MySQL安装包到虚拟机上. 3,安装MySQL [root@localhost /]# yum install mysql5.7. ...

  9. java 获取本地电脑的分辨率代码

    1.代码: java.awt.Toolkit tk=java.awt.Toolkit.getDefaultToolkit();       java.awt.Dimension screenSize= ...

  10. Area区域

    1.mvc4.0新增的area区域机制,可以协助你在架构较为大型的项目,让独立性较高的部分功能独立成一个MVC子网站,以降低网站与网站之间的耦合性,也可以通过area的切割,让多人同时开发同一个项目时 ...