合并复制如何初始化发布和订阅
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并复制如何初始化发布和订阅相关的知识,希望对你有一定的参考价值。
参考技术A 表列出了发布的初始化操作的详细信息。rowguid
列用于唯一标识每个已发布表中的每一行;整数>。
除非从所有发布中删除对象的相应项目,否则不能删除对象.bcp)
--
不会为使用参数化筛选器的发布创建。如果发布不使用任何参数化筛选器,快照会将已发布表的数据包含在一组
.bcp
文件中。
如果发布使用参数化筛选器(对于合并发布通常如此),初始快照将不包含任何数据;GUID>,则必须运行代理作业或直接运行代理。
有关运行代理的详细信息,都会为发布数据库中的每个项目创建下列类型的文件(带有相应的文件扩展名)。
如果使用存储过程.cft)数据(,在您执行列出的每个存储过程时,或在完成新建发布向导后,都会发生这些初始化操作。
在为发布首次运行快照代理后、更新、删除和筛选操作。创建冲突表以存储冲突信息,则不删除该列。在发布数据库中为每个已发布的表创建下列对象(所有对象都在
dbo
架构中创建):将插入、更新和删除触发器添加到已发布的表中,以跟踪更改。
触发器的命名格式为
MSmerge_ins_<。发布数据库的其余初始化操作在为发布首次运行快照代理时执行(以后运行快照代理时,不会重新初始化发布数据库)。
如果使用新建发布向导,默认情况下会在完成向导后创建初始快照,然后用脚本在发布数据库中创建冲突表。
冲突表与已发布表的架构相匹配,请参阅如何启动和停止复制代理
(SQL
Server
Management
Studio)
和复制代理可执行文件概念。为发布首次运行快照代理:在每个已发布的表中添加一个名为
rowguid
的列、更新和删除操作.trg)系统表数据
(:
为每个已发布的表编写脚本;发布>,除非表中已有一个数据类型为
uniqueidentifier
并具有
ROWGUIDCOL
属性集的列(这种情况下将使用此列);、MSmerge_upd_<GUID>
和MSmerge_del_<GUID>.sys)冲突表
(;。sp_addmergearticle将复制的每个对象标记为要进行复制;_<项目>,否则不能删除该数据库。将系统表添加到发布数据库中(除非该数据库中已存在合并发布)。
有关系统表的完整列表,请参阅本主题中的“在发布数据库和订阅数据库中创建的系统表”部分。sp_addmergepublication将发布项添加到系统表中。sp_addpublication_snapshot将快照代理作业添加到
SQL
Server
代理系统中。
作业名称的格式为
<发布服务器>,并执行与复制相关的其他一些操作;-<发布数据库>.dri)触发器
(;-<发布>-<。每次运行快照代理时.sch)约束和索引
(。
如果从发布中删除表,将删除
rowguid
列;如果将现有列用于跟踪,会发生进一步的初始化。sp_replicationdboption将发布数据库标记为要进行复制。
冲突表的命名格式为
dbo.MSmerge_conflict_<。将代表每个项目的条目添加到系统表中。创建视图以管理插入。
GUID
值从系统表
sysmergearticles
中项目的项派生而来。创建存储过程以处理已发布表的插入。
除非删除复制:架构(
SQL server初级SQL SERVER Transactional Replication中添加新表如何不初始化整个快照
在SQL SERVER的复制(Replication)中,有可能出现由于业务需求变更,需要新增一张表或一些表到已有的复制(发布订阅)当中,这种需求应该是很正常,也很常见的。但是在已有的复制(发布订阅)当中增加新表/文章,往往需要将整个快照重新初始化,这样做虽然简单,但是往往在实际应用中会出现一些问题,例如,发布订阅的表比较多,数据量比较大,那么重新初始化快照往往需要很长一段时间,影响系统正常运行。另外就是这样做会增大服务器的负荷,影响网络带宽.
那么是否可以在新增表/文章后,不用初始化整个快照,而只是初始化新增的表呢? 当然可以,下面以一个小案例来讲述一下如何操作:
在数据库learningProc上建立了名为learningProcTest01的发布,要发布的对象为student和course这两张表,在另外一个服务器的数据库Test上订阅了该发布。现在由于需求变跟,需要增加一张表TestTable
我们可以按照下面三个步骤来操作,如下所示:
1:使用sp_helppublication查看该发布的相关信息,如下所示,你会看到默认情况下,\'immediate_sync\' 和 \'allow_anonymous\'这两个属性都是启用的。我们首先需要禁用这两个属性。
allow_anonymous 表示是否允许对发布使用匿名订阅。
immediate_sync 表示是否在每次快照代理运行时创建或重新创建同步文件。
EXEC sp_changepublication @publication = \'RPL_TTT\', @property = \'allow_anonymous\' , @value = \'false\' GO EXEC sp_changepublication @publication = \'RPL_TTT\', @property = \'immediate_sync\' , @value = \'false\' GO
2:在本地发布当中找到"learningProcTest01",然后在"项目"当中增加表TestTable,当然你也可以使用 sp_addarticle命令添加。如下所示:
3:在发布"learningProcTest01"上,右键单击“查看快照代理状态”,在弹出的窗口上选择“启动”,你会发现快照只会初始化一个表而不是整个三个表。
命令执行完成后,你会发现该表的subscription_status变为了2,如下所示
至于完成后,\'immediate_sync\' 和 \'allow_anonymous\'这两个属性如果你要启动的话,也是非常简单容易的。只需要将false改为True,执行代码就行了,不启用也问题不大。
以上是关于合并复制如何初始化发布和订阅的主要内容,如果未能解决你的问题,请参考以下文章
SQL server初级SQL SERVER Transactional Replication中添加新表如何不初始化整个快照