SqlServer 可更新订阅升级字段队列数据丢失原因

Posted lonelyxmas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SqlServer 可更新订阅升级字段队列数据丢失原因相关的知识,希望对你有一定的参考价值。

原文:SqlServer 可更新订阅升级字段队列数据丢失原因

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


经测试,有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




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

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

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






















以上是关于SqlServer 可更新订阅升级字段队列数据丢失原因的主要内容,如果未能解决你的问题,请参考以下文章

SQLServer 可更新订阅数据冲突的一个原因

SqlServer 可更新订阅队列读取器代理错误:试图进行的插入或更新已失败

SqlServer 禁止架构更改的复制中手动修复使发布和订阅中分别增加的字段同步

SqlServer & Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC)

Sqlserver 备份和订阅的区别

SqlServer 无法为可更新的订阅设置发布服务器登录名 sp_link_publication