SQLServer可更新订阅数据在线架构更改(增加字段)方案
2016-08-26 15:49
204 查看
(http://www.2cto.com/database/201508/432182.html)
之前一直查找冲突发布和订阅数据不一致的原因,后来发现多少数据库升级引起,因为一直以来都是在发布数据库增加字段,订阅也会自动同步。在此时如果订阅队列有数据,这些数据将丢失。参考上一篇说明: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.删除新创建的发布
测试完成!~个人测试正常,还未应用到生产库中。其中最麻烦的是要初始化表数据,这是主要耗时的。
=====================================================================
是不是可以在alt table之前可以将trigger disable掉?
之前一直查找冲突发布和订阅数据不一致的原因,后来发现多少数据库升级引起,因为一直以来都是在发布数据库增加字段,订阅也会自动同步。在此时如果订阅队列有数据,这些数据将丢失。参考上一篇说明: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.删除新创建的发布
测试完成!~个人测试正常,还未应用到生产库中。其中最麻烦的是要初始化表数据,这是主要耗时的。
=====================================================================
是不是可以在alt table之前可以将trigger disable掉?
相关文章推荐
- SQLServer 可更新订阅数据在线架构更改(增加字段)方案
- SQLServer 可更新订阅数据在线架构更改(增加字段)方案
- SqlServer 禁止架构更改的复制中手动修复使发布和订阅中分别增加的字段同步
- SqlServer 禁止架构更改的复制中手动修复使发布和订阅中分别增加的字段同步
- SqlServer 可更新订阅升级字段队列数据丢失原因
- SqlServer 可更新订阅升级字段队列数据丢失原因
- SQLServer 数据去重的一种处理方法(增加一个自增字段,利用自增,删除重复数据)
- 无唯一性字段情况下,双表关联更新数据方案
- SQLServer 可更新订阅数据冲突的一个原因
- SqlServer不允许更改字段类型(表中已有数据)
- 本博客停止更新,请订阅“大数据在线”微信公共号
- SQLServer 可更新订阅的订阅库数据未同步到发布库查看
- SQLServer 可更新订阅数据冲突的一个原因
- Sqlserver更新数据表xml类型字段内容某个节点值的脚本
- 在发布订阅中增加rowversion数据类型字段引发错误(or bug)
- 获取SqlServer数据表所有字段的信息
- 在SQL Server 2005数据库中更改数据架构
- 解决项目需求变化:如何应对数据表中字段的增加
- openerp 增加明细行时更新主表的汇总字段
- 更新数据库所有表的某一个指定字段 ,附加对‘将 varchar 值转换为数据类型为 int 的列时发生语法错误’处理方法