快照复制的工作机制

默认情况下,所有三种复制都使用快照初始化订阅服务器。 SQL Server 快照代理始终生成快照文件,但传递文件的代理因使用的复制类型而异。 快照复制和事务复制使用分发代理传递文件,而合并复制使用 SQL Server 合并代理。 快照代理在分发服务器上运行。 对于推送订阅,分发代理和合并代理在分发服务器上运行;对于请求订阅,则在订阅服务器上运行。 有关推送订阅和请求订阅的详细信息,请参阅订阅发布。 有关代理的详细信息,请参阅复制代理概述

可以在创建订阅后立即生成和应用快照,也可以按照创建发布时制定的计划进行。 快照代理准备快照文件(其中包含已发布表和数据库对象的架构和数据),然后将这些文件存储在发布服务器的快照文件夹中,并在分发服务器上的分发数据库中记录跟踪信息。 配置分发服务器时,可以指定一个默认的快照文件夹,也可以为发布指定一个备用位置,以替代默认位置或与之并存。 有关详细信息,请参阅备用快照文件夹位置

注意注意

除了本主题中描述的标准快照过程外,使用参数化筛选器的合并发布还使用一个由两部分组成的快照过程。 有关详细信息,请参阅带有参数化筛选器的合并发布的快照

下图显示了快照复制的主要组件。

快照复制组件和数据流

快照代理

对于合并复制,每次运行快照代理时都会生成快照。 对于事务复制,是否生成快照取决于复制属性 immediate_sync 的设置。 如果将该属性设置为 TRUE(使用新建发布向导时的默认值),则每次运行快照代理时都会生成快照,而且可以随时将快照应用于订阅服务器。 如果将该属性设置为 FALSE(使用 sp_addpublication 时的默认值),则只有在自上次快照代理运行以来添加了新订阅时才会生成快照;订阅服务器必须等待快照代理完成才能进行同步。

快照代理执行以下操作:

  1. 在分发服务器到发布服务器之间建立连接,然后根据需要在已发布表上使用锁:

    • 对于合并发布,快照代理不使用任何锁。

    • 对于事务发布,默认情况下快照代理只在快照生成的初始阶段使用锁。

    • 对于快照发布,整个快照生成过程中都使用锁。

  2. 将每个项目的表架构副本写入一个 .sch 文件。 如果发布其他数据库对象(如索引、约束、存储过程、视图、用户定义函数等),则生成其他脚本文件。

  3. 从发布服务器上已发布的表中复制数据,然后将数据写入快照文件夹。 快照将以一组大容量复制程序 (BCP) 文件的形式生成。

  4. 对于快照发布和事务发布,快照代理将向分发数据库的 MSrepl_commands 表和 MSrepl_transactions 表中追加行。 MSrepl_commands 表中包含的是命令,这些命令指示 .sch 和 .bcp 文件、其他快照文件以及对快照前或快照后脚本的引用的位置。 MSrepl_transactions 表中包含的是与同步订阅服务器相关的命令。

    对于合并发布,快照代理还执行其他操作。 有关详细信息,请参阅合并复制如何初始化发布和订阅

  5. 释放已发布表上的所有锁。

在快照生成过程中,不能对已发布表进行构架更改。 生成快照文件后,可以使用 Windows 资源管理器在快照文件夹中查看这些快照文件。

分发代理和合并代理

对于快照发布,分发代理每次运行发布时,都会将一个新快照移动到每个尚未同步但已标记为重新初始化或者包含新项目的订阅服务器中。

对于快照复制和事务复制,分发代理执行以下操作:

  1. 与分发服务器建立连接。

  2. 检查分发服务器上分发数据库中的 MSrepl_commandsMSrepl_transactions 表。 代理从第一个表中读取快照文件的位置,并从这两个表中读取订阅服务器同步命令。

  3. 将架构和命令应用于订阅数据库。

对于未筛选的合并复制发布,合并代理将执行以下操作:

  1. 与发布服务器建立连接。

  2. 检查发布服务器上的 sysmergeschemachange 表,确定是否存在应该应用于订阅服务器的新快照。

  3. 如果存在新快照,合并代理则将 sysmergeschemachange 所指定位置处的快照文件应用于订阅数据库。