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

合并复制必须先初始化发布服务器和订阅服务器,然后才能在它们之间传递数据。 本主题提供有关初始化期间所进行的操作的信息。

初始化发布

下表列出了发布的初始化操作的详细信息,在您执行列出的每个存储过程时,或在完成新建发布向导后,都会发生这些初始化操作。 在为发布首次运行快照代理后,会发生进一步的初始化。

  • sp_replicationdboption

    • 将发布数据库标记为要进行复制。 除非删除复制,否则不能删除该数据库。

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

  • sp_addmergepublication

    • 将发布项添加到系统表中。
  • sp_addpublication_snapshot

    • 将快照代理作业添加到 SQL Server 代理系统中。 作业名称的格式为 <发布服务器>-<发布数据库>-<发布>-<整数>
  • sp_addmergearticle

    • 将复制的每个对象标记为要进行复制。 除非从所有发布中删除对象的相应项目,否则不能删除对象。

    • 将代表每个项目的条目添加到系统表中。

发布数据库的其余初始化操作在为发布首次运行快照代理时执行(以后运行快照代理时,不会重新初始化发布数据库)。 如果使用新建发布向导,默认情况下会在完成向导后创建初始快照。 如果使用存储过程,则必须运行代理作业或直接运行代理。 有关运行代理的详细信息,请参阅如何启动和停止复制代理 (SQL Server Management Studio)复制代理可执行文件概念

为发布首次运行快照代理:

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

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

    • 将插入、更新和删除触发器添加到已发布的表中,以跟踪更改。 触发器的命名格式为 MSmerge_ins_<GUID>MSmerge_upd_<GUID>MSmerge_del_<GUID>。 GUID 值从系统表 sysmergearticles 中项目的项派生而来。

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

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

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

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

  • 架构 (.sch)

  • 约束和索引 (.dri)

  • 触发器 (.trg)

  • 系统表数据 (.sys)

  • 冲突表 (.cft)

  • 数据 (.bcp) -- 不会为使用参数化筛选器的发布创建。

    如果发布不使用任何参数化筛选器,快照会将已发布表的数据包含在一组 .bcp 文件中。 如果发布使用参数化筛选器(对于合并发布通常如此),初始快照将不包含任何数据。 将使用订阅服务器分区的快照提供数据,这将在“初始化订阅”部分进行讨论。

初始化订阅

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

如果发布数据库中的任何表都未使用参数化筛选器,则向每个订阅服务器上复制相同的发布快照。 如果使用了一个或多个参数化筛选器,则每个订阅的初始化方式将由下列逻辑决定:

  • 如果在命令行中为合并代理提供了快照位置:

    • 则从此位置应用快照。
  • 否则,如果快照是预生成的:

    • 则从发布数据库中的 MSmerge_dynamic_snapshots 检索快照的位置,并从该位置应用快照。
  • 否则,如果发布允许订阅服务器初始化快照:

    • 如果已经为具有同一分区的其他订阅服务器生成了快照,则将该快照应用于订阅服务器。

    • 否则,将生成快照并将其应用于订阅服务器。

  • 否则,将对发布中的表使用 SELECT 语句初始化订阅服务器。 此方法要比使用订阅服务器分区的快照慢得多。

如果快照传输在任一点中断,它将自动恢复并且不再重新发送已经全部传输的任何文件。 对于每个发布项目,快照代理的传递单位是 bcp 文件,因此已部分传递的文件必须全部重新传递。 不过,恢复快照可以大幅度减少传输的数据量,即便在连接不可靠的情况下也可以确保及时进行快照传递。 有关创建快照的详细信息,请参阅带有参数化筛选器的合并发布的快照

快照位置

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

  • 如果发布使用 UNC,则路径的第一部分为: \\<我的计算机>\<我的文件夹>\unc\。 如果发布使用 FTP,则为: \\<我的计算机>\<我的文件夹>\ftp\。

  • 如果发布使用 UNC 并且未使用参数化筛选器,则路径为: \\<我的计算机>\<我的文件夹>\unc\<发布服务器><发布数据库><发布>

  • 如果发布使用 UNC 并且使用了参数化筛选器,则快照位置取决于快照文件夹的路径和发布的参数化行筛选条件。 例如,如果使用 HOST_NAME() 函数筛选项目,且分区的 HOST_NAME() 值为“SalesLaptop”,则该分区的快照路径为: \\<我的计算机>\<我的文件夹>\unc\<发布服务器><发布数据库><发布>\SalesLaptop_12\,其中,12 是分区在内部使用的 ID。

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

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

说明

MSdynamicsnapshotjobs (Transact-SQL)

包含使用参数化筛选器的发布的快照作业的信息。

MSdynamicsnapshotviews (Transact-SQL)

用于跟踪快照代理创建的所有临时快照视图。 当 SQL Server 代理或快照代理异常关闭时,此表将由系统用来清除视图。

MSmerge_altsyncpartners (Transact-SQL)

用于跟踪当前同步伙伴与发布服务器的关联。

MSmerge_articlehistory (Transact-SQL)

用于跟踪在合并代理同步会话期间对项目所做的更改,更改的每个项目占一行。

MSmerge_conflicts_info (Transact-SQL)

用于跟踪将订阅与合并发布同步时发生的冲突。

MSmerge_contents (Transact-SQL)

当前数据库中自数据库发布以来修改的每一行占一行。 此表由合并过程用来确定已更改的行。

MSmerge_current_partition_mappings

给定更改行所属的每个分区占一行。

MSmerge_dynamic_snapshots (Transact-SQL)

用于跟踪为合并发布定义的每个分区的快照位置。

MSmerge_errorlineage (Transact-SQL)

包含已在订阅服务器上删除但删除未传播到发布服务器的行。

MSmerge_generation_partition_mappings (Transact-SQL)

用于跟踪给定生成是否包含与给定分区相关的更改。

MSmerge_genhistory (Transact-SQL)

每个生成占一行。 生成是指已传递给发布服务器或订阅服务器的更改集合。 每次运行合并代理时都会关闭生成;数据库中的后续更改将添加到一个或多个打开的生成中。

MSmerge_history (Transact-SQL)

包含详细描述以前的合并代理作业会话结果的历史记录行。

MSmerge_identity_range (Transact-SQL)

用于跟踪为标识发布的订阅列而分配的数值范围,复制会自动为此发布管理范围分配。

MSmerge_metadataaction_request (Transact-SQL)

每个必需的补偿操作占一行。 补偿操作用于在某一节点回滚更改(如果更改在另一节点失败)。

MSmerge_partition_groups (Transact-SQL)

给定数据库中的每个预计算分区占一行。

MSmerge_past_partition_mappings (Transact-SQL)

给定更改行曾经属于但目前不再属于的每个分区占一行。

MSmerge_replinfo (Transact-SQL)

每个订阅占一行。 此表用于跟踪有关发送的和接收的生成的内部信息。

MSmerge_sessions (Transact-SQL)

包含以前的合并代理作业会话结果的历史记录行。

MSmerge_settingshistory (Transact-SQL)

包含对项目和发布属性所做更改的历史记录,每项更改占一行。

MSmerge_tombstone (Transact-SQL)

包含有关已删除行的信息并允许将删除传播到其他订阅服务器。

MSrepl_errors (Transact-SQL)

包含有关任何代理失败的详细信息。

sysmergearticles (Transact-SQL)

每个合并项目占一行。

sysmergepartitioninfo (Transact-SQL)

包含有关每个项目的分区的信息,每个项目占一行。

sysmergepartitioninfoview (Transact-SQL)

包含表项目的分区信息。

sysmergepublications (Transact-SQL)

每个合并发布占一行。

sysmergeschemaarticles (Transact-SQL)

用于跟踪仅限于架构的项目,如存储过程。

sysmergeschemachange (Transact-SQL)

包含有关快照代理生成的已发布项目的信息。

sysmergesubscriptions (Transact-SQL)

每个订阅服务器占一行。

sysmergesubsetfilters (Transact-SQL)

包含分区项目的联接筛选器信息。

另外,还在每个订阅数据库中创建 MSsnapshotdeliveryprogress 表,并在使用请求订阅的每个订阅数据库中创建 MSsubscription_properties 表:

说明

MSsnapshotdeliveryprogress (Transact-SQL)

用于跟踪应用快照时成功传递给订阅服务器的文件。 当合并代理无法在会话期间传递所有文件时,此数据可用来恢复文件的传递。

MSsubscription_properties (Transact-SQL)

包含在订阅服务器上运行复制代理所需的参数信息。