博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SqlServer 可更新订阅升级字段队列数据丢失原因
阅读量:5108 次
发布时间:2019-06-13

本文共 927 字,大约阅读时间需要 3 分钟。

原文:

之前简单描述过数据冲突发生的原因: ,但具体内部原理是怎么丢失的还不清楚,今天补充说明。可更新订阅,在订阅数据库操作数据,数据实时同步到发布数据库中。

经测试,有3种情况会导致订阅队列的数据丢失:

1.更改字段类型

2.增加删除字段

3.表对象发布

另:添加默认值约束,存储过程,函数正常!订阅队列数据不丢失!(触发器未设置同步)

具体模拟步骤如下:

1.在发布中添加表

2.停止队列读取器代理

3.此时对订阅数据库对其他已同步的表进行DML操作

4.启动快照代理(新表同步)

5.启动队列读取器代理

6.查看订阅库中的队列表已无数据,但发布数据库表却未变化。

也就是在启用快照后,队列数据消失了!~

打开 profiler跟踪到,在给一个新表创建发布时,订阅队列中的事务和命令都会被清空!

执行的存储过程为:sp_MSreset_queued_reinitsp_repldeletequeuedtran

execsp_MSreset_queued_reinitN'serverName',N'subscriber_db',@artid

execsp_repldeletequeuedtranN'serverName',N'publisher_db',N'publication',N'tranid',@orderkeylow,@orderkeyhigh

订阅队列表数据将被删除:dbo.MSreplication_queuedbo.MSrepl_queuedtraninfo

因此当启用队列读取器的时候,队列已经没有数据了!(启用队列读取器后,后续的同步正常)

订阅变化的数据也就无法同步到发布中,这就导致了订阅数据和发布数据的不一致!

虽然本例是停止队列读取器模拟,但是在生产环境中,队列可以说总是存在数据的,每个表的操作都会有。如果要升级数据库结构,对于这种架构,还得停机维护来升级!或者晚上用户较少的时候,禁止用户访问来升级数据库结构。

posted on
2018-01-26 17:50 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/8360739.html

你可能感兴趣的文章
【iOS越狱开发】如何将应用打包成.ipa文件
查看>>
[NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
查看>>
Yii2 Lesson - 03 Forms in Yii
查看>>
Python IO模型
查看>>
Ugly Windows
查看>>
DataGridView的行的字体颜色变化
查看>>
Java再学习——关于ConcurrentHashMap
查看>>
如何处理Win10电脑黑屏后出现代码0xc0000225的错误?
查看>>
局域网内手机访问电脑网站注意几点
查看>>
c++ STL
查看>>
json数据在前端(javascript)和后端(php)转换
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Groovy中那些神奇注解之ToString
查看>>
Day19内容回顾
查看>>
第七次作业
查看>>
MySql update inner join!MySql跨表更新 多表update sql语句?如何将select出来的部分数据update到另一个表里面?...
查看>>
我最宏大的个人愿望
查看>>
SpringBoot项目打包
查看>>
JSP的3种方式实现radio ,checkBox,select的默认选择值
查看>>
Linux操作系统 和 Windows操作系统 的区别
查看>>