合并复制如何初始化发布和订阅

合并复制必须同时初始化发布服务器和订阅服务器,然后数据才能在它们之间流动。 本文提供有关初始化期间发生的步骤的信息。

初始化发布

以下列表详细介绍了发布过程的初始化步骤,这些步骤在执行列出的每个存储过程时或完成“新建发布向导”后进行。 快照代理首次运行发布后,会进行进一步的初始化。

  • sp_replicationdboption

    • 发布项数据库标记为用于复制。 除非删除复制,否则无法删除数据库。

    • 系统表将添加到发布数据库中(除非数据库中已存在合并发布)。 有关系统表的完整列表,请参阅本文中的“发布和订阅数据库中创建的系统表”部分。

  • sp_addmergepublication

    • 发布的条目将添加到系统表。
  • sp_addpublication_snapshot

    • 快照代理作业已添加到 SQL Server 代理系统。 作业名称的格式为 <Publisher>-<PublicationDatabase>-<Publication>-<Integer>
  • sp_addmergearticle

    • 每个被复制的对象都被标记为待复制。 除非从所有刊物中移除相应的文章,否则无法删除该对象。

    • 每篇文章的条目都会添加到系统表中。

发布数据库的其余初始化过程发生在发布的快照代理的初始运行期间。 在快照代理的后续运行期间,发布数据库不会重新初始化。 如果使用“新建发布向导”,则完成向导后默认创建初始快照。 如果使用存储过程,则必须运行代理任务或直接运行代理。 有关运行代理的详细信息,请参阅 启动和停止复制代理(SQL Server Management Studio)复制代理可执行文件概念

发布的快照代理首次运行时:

  • 每个已发布的表中都会添加一个名为 rowguid 的列,除非该表已经有一个具有 ROWGUIDCOL 属性集的数据类型 uniqueidentifier 列(在这种情况下使用此列)。 该 rowguid 列用于唯一标识每个已发布表中的每一行。 如果表从发布中删除了,则 rowguid 列会被移除;如果现有列用于跟踪,则不会删除该列。

  • 在发布数据库中为每个已发布表创建以下对象(所有对象均在dbo架构中创建):

    • 将插入触发器、更新触发器和删除触发器添加到已发布的表中以跟踪更改。 触发器以形式 MSmerge_ins_<GUID>命名, MSmerge_upd_<GUID>并且 MSmerge_del_<GUID>。 GUID 值派生自系统表 sysmergearticles 中的条目。

    • 创建存储过程以处理已发布表的插入、更新和删除,以及执行其他与复制相关的多项操作。

    • 创建视图以管理插入、更新、删除和筛选。

    • 创建冲突表来存储冲突信息。 冲突表与已发布表的架构匹配:每个已发布表都编写了脚本,然后使用该脚本在发布数据库中创建冲突表。 冲突表以格式 dbo.MSmerge_conflict_<Publication>_<Article> 命名。

每次运行快照代理时,都会为发布数据库中的每篇文章创建以下类型的文件(具有相应的文件扩展名):

  • 架构(.sch

  • 约束和索引 (.dri)

  • 触发器 (.trg

  • 系统表数据 (.sys)

  • 冲突表 (.cft)

  • 数据(.bcp):未为具有参数化筛选器的出版物创建。

    如果发布项不使用任何参数化筛选器,则快照将在一组 .bcp 文件中包含已发布表的数据。 如果发布使用参数化筛选器(这是合并发布的典型),则初始快照不包含任何数据。 数据是使用订阅者分区的快照提供的,下一节将对此进行讨论。

初始化订阅

当订阅的合并代理运行并将初始快照复制到订阅数据库时,将初始化每个订阅。 除了复制对象的架构和数据外,快照还包含发布数据库中存在的系统表、视图、触发器和存储过程。 还将一个或两个额外的系统表复制到订阅数据库。 若要获取系统表的完整列表,请参阅本文中在发布和订阅数据库中创建的系统表部分。 如果重新初始化订阅,则所有被复制的对象和复制系统的对象都会被覆盖。

如果发布数据库中的所有表都未使用参数化筛选器,则相同的发布快照将复制到每个订阅者。 如果使用了一个或多个参数化筛选器,则每个订阅的初始化方式受以下逻辑控制:

  • 如果将快照位置作为命令行参数提供给合并代理:

    • 从该位置应用快照。
  • 如果快照已预生成,则:

    • 从发布数据库中的 MSmerge_dynamic_snapshots 检索快照的位置,并从该位置应用快照。
  • 否则,如果发布允许订阅者启动快照:

    • 如果已为同一分区的另一个订阅服务器生成快照,请将该快照应用于订阅服务器。

    • 否则,请生成快照并将其应用于订阅者。

  • 否则,对发布中的表使用 SELECT 语句初始化订阅者。 这种方法比为订阅者的分区使用快照慢。

如果快照传输在任何时间点中断,它会自动恢复,并且不会重新发送已完全传输的任何文件。 快照代理的传送单元是每个发布项的 bcp 文件,因此部分传递的文件必须被完全重新传送。 但是,恢复快照可以显著减少传输的数据量,并确保即使连接不可靠,也确保快照及时传递。 有关创建快照的详细信息,请参阅 参数化筛选器 - 参数化行筛选器

快照位置

快照位置取决于:为默认或备用快照位置指定的路径;发布是对快照文件夹使用 UNC 路径还是 FTP 共享;以及发布是否使用参数化筛选器。 在这些示例中,假设快照文件夹位置为: \\<MyComputer>\<MyFolder>

  • 如果发布使用 UNC,路径的第一部分是: \\<MyComputer>\<MyFolder>\unc\。 如果它使用 FTP,则为 \\<MyComputer>\<MyFolder>\ftp\.

  • 如果发布使用 UNC 且不使用参数化筛选器,则路径为\\<MyComputer>\<MyFolder>\unc\<Publisher><Publicationdb><publication>

  • 如果发布使用 UNC 并使用参数化筛选器,则位置基于发布的快照文件夹路径和参数化行筛选条件。 例如,如果使用 HOST_NAME() 函数筛选文章,并且该分区的值 HOST_NAME()SalesLaptop,则该分区的快照路径是 \\<MyComputer>\<MyFolder>\unc\<Publisher><Publicationdb><publication>\SalesLaptop_12,其中 12 是用于分区的内部 ID。

在发布和订阅数据库中创建的系统表

下表是在发布数据库和每个订阅数据库中创建的。

DESCRIPTION
MSdynamicsnapshotjobs 包含有关具有参数化筛选器的发布的快照作业的信息。
MSdynamicsnapshotviews 跟踪快照代理创建的所有临时快照视图。 当 SQL Server 代理或快照代理发生异常关闭时,系统将使用它来清理视图。
MSmerge_altsyncpartners 跟踪当前作为发布者的同步伙伴的关联。
MSmerge_articlehistory 跟踪在合并代理同步会话期间对项目所做的更改,每个更改的项目对应一行。
MSmerge_conflicts_info 跟踪在将订阅同步到合并发布时发生的冲突。
MSmerge_contents 对于自发布以来在当前数据库中修改的每一行,包含一行。 合并进程使用此表来确定已更改的行。
MSmerge_current_partition_mappings 对于给定已更改的行所属的每个分区,包含一行。
MSmerge_dynamic_snapshots 跟踪为合并发布而定义的每个分区的快照位置。
MSmerge_errorlineage 包含已在订阅者上删除但其删除未传播到发布者的行。
MSmerge_generation_partition_mappings 跟踪给定生成是否包含与给定分区相关的任何更改。
MSmerge_genhistory 为每个代包含一行。 一代是传递给发布者或订阅者的更改的集合。 每次运行合并代理时,代系都会被关闭;数据库的后续更改将添加到一个或多个开放代系中。
MSmerge_history 包含历史记录行,其中详细描述了以前合并代理作业会话的结果。
MSmerge_identity_range 跟踪为订阅发布的标识列分配的数字范围,对于这些发布,复制会自动管理范围分配。
MSmerge_metadataaction_request 为所需的每个补偿操作包含一行。 如果某个节点上的更改在另一个节点上失败,则使用补偿操作在该节点回滚更改。
MSmerge_partition_groups 为给定数据库中的每个预计算分区包含一行。
MSmerge_past_partition_mappings 对于给定的已更改行曾经属于但不再属于的每个分区,包含一行。
MSmerge_replinfo 为每个订阅包含一行。 此表跟踪有关发送和接收的代系的内部信息。
MSmerge_sessions 包含具有以前合并代理作业会话结果的历史记录行。
MSmerge_settingshistory 包含对项目和发布属性所做的更改的历史记录,每个更改都有一行。
MSmerge_tombstone 包含有关已删除行的信息,并允许将删除传播到其他订阅者。
MSrepl_errors 包含有关任何代理故障的详细信息。
sysmergearticles 为每个合并项目包含一行。
sysmergepartitioninfo 包含有关每篇文章分区的信息,每个分区都有一行。
sysmergepartitioninfoview 包含表格条目的分区信息。
sysmergepublications 为每个合并发布包含一行。
sysmergeschemaarticles 跟踪仅限架构的项目,例如存储过程。
sysmergeschemachange 包含有关快照代理生成的已发布项目的信息。
sysmergesubscriptions 为每个订阅者包含一行。
sysmergesubsetfilters 包含分区文章的联接筛选器信息。

此外,MSsnapshotdeliveryprogress 表会在每个订阅数据库中创建,而使用拉式订阅的订阅数据库中还会创建 MSsubscription_properties 表。

DESCRIPTION
MSsnapshotdeliveryprogress 跟踪应用快照时成功传递到订阅者的文件。 此数据用于恢复文件传递,以防合并代理在会话期间无法传送所有文件。
MSsubscription_properties 包含在订阅服务器上运行复制代理所需的参数信息