开发者社区> 杰克.陈> 正文

SQLServer 可更新订阅数据在线架构更改(增加字段)方案

简介: 原文:SQLServer 可更新订阅数据在线架构更改(增加字段)方案 之前一直查找冲突发布和订阅数据不一致的原因,后来发现多少数据库升级引起,因为一直以来都是在发布数据库增加字段,订阅也会自动同步。
+关注继续查看
原文:SQLServer 可更新订阅数据在线架构更改(增加字段)方案

之前一直查找冲突发布和订阅数据不一致的原因,后来发现多少数据库升级引起,因为一直以来都是在发布数据库增加字段,订阅也会自动同步。在此时如果订阅队列有数据,这些数据将丢失。参考上一篇说明:SQLServer 可更新订阅数据冲突的一个原因 。当在发布数据库增加一个字段时,系统同步存储过程和触发器都会重新生成,这会导致仍在队列中的数据无法正常同步。订阅队列中的命令将因“同步”后消失,代理有可能出错,但也会自动回复正常!~


这周测试了一些方法,最终算是确定一个方案可行的,虽然麻烦和耗时。

首先看简单的架构图:


上图中,上面为发布服务器,下面为订阅服务器。以一个表为例,正常发布为 Table T1 的可更新订阅发布,数据双向同步,用户都是在订阅数据库操作,都是操作视图。增加字段时,为了使用户能够在订阅正常操作,再创建一个发布订阅,只发布一张表,数据太多时初始化会较久。注意:新的发布不能是同一个数据库!如果是同一个数据库,为了避免和原来的表名一样,更改了新订阅的表名,会导致 发布到原来的订阅数据不同步!所以新的订阅在另一个数据库上,保持表名称一致!因为系统调用的存储过程表结构一致。~如上图,所以一个发布中,在订阅服务器中要求两个数据库订阅,其中一个发布订阅只有一张表,该表将是新增字段的表。此时3张表都同步发布双向同步。


因为用户都是操作视图的,所以视图的定义改为到新的数据库表中,用户操作仍正常,数据同步也正常。对新增加的发布,禁止架构同步,发布数据库增加字段时,不会同步到新订阅表中,但是会同步到原订阅表中。待字段同步完成后,视图定义改回原来的表,此时发布和订阅都有新字段了。而作为中介创建的的发布订阅可以删除了!~


主要步骤如下:

1.  确保发布和订阅数据一致

2.  创建1个可更新订阅发布,只发布1张表 (发布数据库执行)

3.  新发布的“冲突解决策略”: 保留发布服务器更改(发布属性更改)

4.  新发布的“复制架构更改”: false(发布属性更改)

5.  创建订阅(订阅服务器新的数据库)

6.  更改作业所有者;初始化订阅;等待完成…………

7.  发布更改视图定义(会同步到原订阅中),使用另一个数据库的订阅表(发布数据库执行,注意订阅表权限问题)

8.  确定原订阅的队列已经同步完成

9.  发布数据库中对表增加字段(自动同步到原订阅中,新订阅不同步)

10. 订阅队列如无积累,更改发布视图的定义,使用原来数据库的表(发布数据库执行)

11. 最后删除新创建的发布


--1.	确保发布和订阅数据一致
--2.	创建可更新订阅(筛选)发布,只发布1表(发布数据库执行)
--3.	新发布的“冲突解决策略”: 保留发布服务器更改(发布属性)
EXEC sp_changepublication @publication = N'temp02', @property = N'conflict_policy', @value = N'pub wins'
EXEC sp_changepublication @publication = N'temp03', @property = N'conflict_policy', @value = N'pub wins'

--4.	新发布的“复制架构更改”: false(发布属性)
EXEC sp_changepublication @publication = N'temp02', @property = N'replicate_ddl', @value = 0
EXEC sp_changepublication @publication = N'temp03', @property = N'replicate_ddl', @value = 0

--5.	创建订阅(订阅服务器新的数据库)
--6.	更改作业所有者;初始化4个订阅;等待完成…………
--7.	发布更改视图定义,使用另一个数据库的订阅表(发布数据库执行,注意订阅表权限问题)
ALTER VIEW [dbo].[VTestTab]  
as  
SELECT Identifier,Name,value,info  
FROM DemoDB.dbo.TestTab --另一个订阅数据库的表
GO

--8.	确定原订阅的队列已经同步完成
--9.	发布数据库中对表增加字段(自动同步到原订阅中)
ALTER TABLE dbo.TestTab ADD TEST INT

--10.订阅队列无太多,则更改发布视图定义,使用原来数据库的表(发布数据库执行)
ALTER VIEW [dbo].[VTestTab]  
as  
SELECT Identifier,Name,value,info  
FROM dbo.TestTab 
GO

--11.删除新创建的发布


测试完成!~个人测试正常,还未应用到生产库中。其中最麻烦的是要初始化表数据,这是主要耗时的。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 31 章 逻辑复制_31.2. 订阅
31.2. 订阅 31.2.1. 复制槽管理 订阅是逻辑复制的下游端。定义订阅的节点被称为 订阅者。 订阅定义了与另一个数据库的连接以及它想要订阅的一组发布(一个或多个)。 订阅者数据库的行为与任何其他PostgreSQL实例的行为相同, 并且可以通过定义自己的发布来用作其他数据库的发布者。
1302 0
sqlserver数据库查询某个字段 为null的所有行数据
sqlserver数据库查询某个字段 为null的所有行数据
13 0
在Android中实现service动态更新UI界面
之前曾介绍过Android的UI设计与后台线程交互,据Android API的介绍,service一般是在后台运行的,没有界面的。那么如何实现service动态更新UI界面呢?案例:通过service向远程服务器发送请求,根据服务器返回的结果动态更新主程序UI界面,主程序可实时关闭或重启服务。
553 0
HBase数据访问的一些常用方式
类型 特点 场合 优缺点分析 Native Java API 最常规和高效的访问方式 适合MapReduce作业并行批处理HBase表数据     Hbase Shell HBase的命令行工具,最简单的访问方式 适合HBase管理使用   T...
1470 0
PostgreSQL增量订阅方案:利用Logical Decoding订阅增量
PostgreSQL增量订阅方案:利用Logical Decoding订阅增量
529 0
SQL更新部分字段或者插入新数据
SQL更新部分字段或者插入新数据 因为业务的原因,一张表的数据需要整合两张外键关联不强的表数据,这里涉及到更新部分字段或者插入新数据。今天简单的做个笔记,后续有需要再补充完整 测试表结构: CREATE TABLE `test` ( `id` int(10) NOT NULL, `name` v.
1452 0
C#使用SqlBulkCopy将DataTable写入数据库的表中(表不存在则创建新表,数据存在则更新,不存在则插入)
原文:.net使用SqlBulkCopy导入数据(创建新表) .net2.0后ado.net提供了一个快速导入sqlserver的方法sqlbulkcopy.导入效率非常高.  包装了一个简单的sqlbulkcopy类,用于数据从datatable导入到sqlserver.
2589 0
如何保证 Serverless 业务部署更新的一致性?
每一个工具的诞生,都要有一个成长的过程,Serverless Devs 正在不断的成长。
3093 0
SQL Server读写分离神器,发布与订阅(一)
发布订阅主要用来做数据库的读写分离,当单台数据库的压力太大时,可以考虑这种方案。一主多从,主服务器的数据库只管写入,其他的数据库都是只读也是一种很好的方案,当然你也可以用它来实现在线备份数据的功能。
42 0
+关注
杰克.陈
一个安静的程序猿~
10427
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载