SqlServer 可更新订阅升级字段队列数据丢失原因
之前简单描述过数据冲突发生的原因: SQLServer 可更新订阅数据冲突的一个原因 ,
但具体内部原理是怎么丢失的还不清楚,今天补充说明.可更新订阅,在订阅数据库操作数据,数据实时同步到发布数据库中.
经测试,有 3 种情况会导致订阅队列的数据丢失:
1. 更改字段类型
2. 增加删除字段
3. 表对象发布
另:添加默认值约束,存储过程,函数正常!订阅队列数据不丢失!(触发器未设置同步)
具体模拟步骤如下:
1. 在发布中添加表
2. 停止队列读取器代理
3.
此时对订阅数据库对其他已同步的表进行
DML
操作
4. 启动快照代理(新表同步)
5. 启动队列读取器代理
6. 查看订阅库中的队列表已无数据,但发布数据库表却未变化.
也就是在启用快照后,队列数据消失了!~
打开 profiler 跟踪到,在给一个新表创建发布时,订阅队列中的事务和命令都会被清空!
执行的存储过程为:
sp_MSreset_queued_reinit 和 sp_repldeletequeuedtran
execsp_MSreset_queued_reinitN'serverName',N'subscriber_db',@artidexecsp_repldeletequeuedtranN'serverName',N'publisher_db',N'publication',N'tranid',@orderkeylow,@orderkeyhigh
订阅队列表数据将被删除:
dbo.MSreplication_queue
和 dbo.MSrepl_queuedtraninfo
因此当启用队列读取器的时候,队列已经没有数据了!(启用队列读取器后,后续的同步正常)
订阅变化的数据也就无法同步到发布中,这就导致了订阅数据和发布数据的不一致!
虽然本例是停止队列读取器模拟,但是在生产环境中,队列可以说总是存在数据的,每个表的操作都会有.如果要升级数据库结构,对于这种架构,还得停机维护来升级!或者晚上用户较少的时候,禁止用户访问来升级数据库结构.
来源: http://www.bubuko.com/infodetail-2476100.html