如何配置对等事务复制(复制 Transact-SQL 编程)

本主题介绍如何使用存储过程配置和维护对等复制拓扑。 本主题首先演示如何创建一个三节点拓扑,然后介绍如何添加并连接到新的节点, 并分别介绍了添加运行 SQL Server 2005 的节点和添加运行 SQL Server 2008 或 SQL Server 更高版本的节点的过程。 本主题不包括有关检测对等复制中所产生冲突的参数的信息。 有关冲突检测的信息,请参阅如何为对等事务复制配置冲突检测(复制 Transact-SQL 编程)

配置拓扑与配置一系列标准的事务发布和订阅非常类似。 值得注意的关键点在于:节点的初始化方式以及为 sp_addsubscription@sync_type 参数指定的值:

  • 拓扑中的第一个节点包含原始发布数据库;因此不必使用架构和数据对它进行初始化。 所以,对于将数据从其他节点复制到第一个节点的订阅,应为该订阅指定 replication support only 值。 此选项确保复制所需的对象会复制到第一个节点。

  • 在配置了第一个节点后,其他节点通常从第一个节点的备份进行初始化。 因此,对于将数据从第一个节点复制到其他节点的订阅,应为该订阅指定 initialize with backupreplication support only 值。 如果系统中不存在任何活动,可以使用 replication support only 值,但是如果系统是活动的,则需要使用 initialize with backup 值。 指定 initialize with backup 可确保所有相关事务均会复制到新节点。

  • 某节点初始化后,从其他节点复制数据的订阅不必再次初始化该节点。 因此,可指定 replication support only 值或 initialize from lsn 值。 如果系统中不存在任何活动,可以使用 replication support only 值,但是如果系统是活动的,则需要使用 initialize from lsn 值。 指定 initialize from lsn 可确保所有相关事务均会复制到新节点。

    SQL Server 2005 不支持 initialize from lsn。 如果拓扑包括 SQL Server 2005 节点,可以将新节点连接到一个现有节点,但是必须让系统静止后才能连接到更多节点。 使系统静止包括停止对所有节点上已发布的表执行的活动,并确保每个节点都已收到来自所有其他节点的所有更改。 本主题的最后一部分详细介绍了此过程。

过程

如果要为活动的数据库配置一个拓扑,可使用以下过程添加第一和第二个节点(节点 A 和节点 B)。 然后,使用后续过程添加节点 C 及任何附加节点。 后续过程使用的 @sync_type 的值为 initialize from lsn。 通过此选项,可以在系统处于活动状态时配置拓扑,而不会丢失任何事务。

在三个节点之间建立对等复制

  1. 将每个节点配置为一个发布服务器,并且将其与本地或远程分发服务器关联起来。 如果使用远程分发服务器,建议您不要为所有节点使用同一个远程分发服务器,因为这样可能会导致单点故障。 有关详细信息,请参阅如何配置发布和分发(复制 Transact-SQL 编程)

  2. 在节点 A 上,执行 sp_addpublication。 分别将 @enabled_for_p2p@status@allow_initialize_from_backup 的值指定为 true、active 和 true。 若要向发布添加项目,请执行 sp_addarticle

  3. 在配置拓扑之前,每个节点上必须存在初始数据。 可使用 SQL Server 的备份和还原功能在拓扑的每个节点上初始化发布的数据。 备份应来自所配置的第一个节点;在本例中,即为节点 A。必须创建了节点 A 上的发布并使其支持对等复制之后,再获取该备份。 本主题假定:在添加完所有节点之前,所有新节点上没有发生任何活动;因此,可以使用相同的备份来初始化每个节点。

    如果在添加完所有节点之前,任意新节点上发生了活动,则必须在每个节点被添加并与节点 A 至少同步一次之后再获取新的备份。这样可确保来自节点 A 的备份包含有关所有其他节点的元数据。 例如,如果添加了节点 B 和节点 C 并且这两个节点上发生了活动:用来自节点 A 的备份初始化节点 B;配置并同步节点 B;从节点 A 获取新备份;用新备份初始化节点 C;然后配置并同步节点 C。

    有关如何备份和还原数据库的更多信息,请参阅在 SQL Server 中备份和还原数据库

    重要说明重要提示

    还原数据库时,请勿指定 KEEP_REPLICATION 选项(对于 Transact-SQL)或“保留复制设置”选项(对于 SQL Server Management Studio)。 运行配置对等拓扑向导时,复制会相应配置数据库。

    备份包含完整的数据库,因此每个对等数据库初始化后都包含发布数据库的完整副本。 备份可能包含并未指定为发布项目的表。 应由管理员或应用程序在还原备份后删除任何不需要的对象或数据。 在后续同步过程中,只会复制那些应用于指定为项目的表的数据更改。

  4. 在节点 A 上,执行 sp_addsubscription。 将 @publication 指定为在节点 A 上创建发布的名称,将 @subscriber 指定为节点 B 的名称,将 @destination_db 指定为节点 B 上的目标数据库的名称,将 @sync_type 的值指定为 initialize with backup,同时为 @backupdevicetype@backupdevicename 参数指定相应的值。

  5. 在节点 A 上,再次执行 sp_addsubscription。 这一次,将 @publication@subscriber@destination_db 分别指定为发布的名称、节点 C 的名称和节点 C 上目标数据库的名称,将 @sync_type 的值指定为 initialize with backup,同时为 @backupdevicetype@backupdevicename 参数指定相应的值。

  6. 在节点 B 上,执行 sp_addpublication。 将 @publication@enabled_for_p2p@status@allow_initialize_from_backup 的值分别指定为发布的名称、true、active 和 true。 若要向发布添加项目,请执行 sp_addarticle

  7. 在节点 B 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db@sync_type 的值分别指定为发布的名称、节点 A 的名称、节点 A 上目标数据库的名称和 replication support only

  8. 在节点 B 上,再次执行 sp_addsubscription。 这一次,将 @publication@subscriber@destination_db@sync_type 的值分别指定为发布的名称、节点 C 的名称、节点 C 上目标数据库的名称和 replication support only

  9. 在节点 C 上,执行 sp_addpublication。 将 @publication@enabled_for_p2p@status@allow_initialize_from_backup 的值分别指定为发布的名称、true、active 和 true。 若要向发布添加项目,请执行 sp_addarticle

  10. 在节点 C 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db@sync_type 的值分别指定为发布的名称、节点 A 的名称、节点 A 上目标数据库的名称和 replication support only

  11. 在节点 C 上,再次执行 sp_addsubscription。 这一次,将 @publication@subscriber@destination_db@sync_type 的值分别指定为发布的名称、节点 B 的名称、节点 B 上目标数据库的名称和 replication support only

  12. 如果发布的表中有标识列,在执行还原操作之后,为节点 A 上的表分配的标识范围也将用于节点 B 和节点 C 上的表。必须使用 DBCC CHECKIDENT,对节点 B 和节点 C 上的表重设种子,以确保每个节点上的表都使用不同的范围。

    有关如何管理标识范围的更多信息,请参阅复制标识列的“为手动标识范围管理分配范围”部分。

如果组成拓扑的节点运行的是 SQL Server 2008 或 SQL Server 的更高版本,可使用以下过程向拓扑添加一个或多个节点。

向拓扑添加运行 SQL Server 2008 或更高版本的节点

  1. 将节点 D 配置为发布服务器,并且将其与本地或远程分发服务器关联起来。

  2. 将来自节点 A 的备份还原到节点 D。

  3. 在节点 D 上,执行 sp_addpublication。 将 @publication@enabled_for_p2p@status@allow_initialize_from_backup 的值分别指定为发布的名称、true、active 和 true。 若要向发布添加项目,请执行 sp_addarticle

  4. 在节点 D 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db@sync_type 的值分别指定为发布的名称、节点 A 的名称、节点 A 上目标数据库的名称和 replication support only

  5. 在节点 A 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db 分别指定为发布的名称、节点 D 的名称和节点 D 上目标数据库的名称,将 @sync_type 的值指定为 initialize with backup,同时为 @backupdevicetype@backupdevicename 参数指定相应的值。

    节点 D 可能会通过节点 A 从节点 B 和节点 C 接收事务。下面的步骤中考虑到了这些事务。

  6. 在节点 D 上,对 MSpeer_lsns 表进行查询。 使用 originatororiginator_lsn 列来确定节点 D 从节点 B 接收的最近一次事务的日志序列号 (LSN)。

  7. 在节点 D 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db@sync_type 的值分别指定为发布的名称、节点 B 的名称、节点 B 上目标数据库的名称和 replication support only

  8. 在节点 B 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db 分别指定为发布的名称、节点 D 的名称和节点 D 上目标数据库的名称,将 @sync_type 的值指定为 initialize from lsn,并且将 @subscriptionlsn 指定为为节点 B 检索到的 LSN。

  9. 在节点 D 上,对 MSpeer_lsns 表进行查询。 使用 originatororiginator_lsn 列来确定节点 D 从节点 C 接收的最近一次事务的 LSN。

  10. 在节点 D 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db@sync_type 的值分别指定为发布的名称、节点 C 的名称、节点 C 上目标数据库的名称和 replication support only

  11. 在节点 C 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db 分别指定为发布的名称、节点 D 的名称和节点 D 上目标数据库的名称,将 @sync_type 的值指定为 initialize from lsn,并且将 @subscriptionlsn 指定为为节点 C 检索到的 LSN。

  12. 如果发布的表中有标识列,在执行还原操作之后,为节点 A 上的表分配的标识范围也将用于节点 D。必须使用 DBCC CHECKIDENT 节点 D 上的表重设种子,以确保每个节点上的表都使用不同的范围。

    有关如何管理标识范围的更多信息,请参阅复制标识列的“为手动标识范围管理分配范围”部分。

正如在本主题的简介中所提到的,添加 SQL Server 2005 节点与添加运行 SQL Server 更高版本的节点的主要差异在于:为了将新节点连接到所有现有节点,SQL Server 2005 需要系统保持静止。 下面的过程演示如何分阶段将一个 SQL Server 2005 节点添加到现有拓扑:

  • 步骤 1 到步骤 5 为第一阶段。通过在节点 A 和节点 D 之间创建订阅,此阶段可部分地将节点 D 连接到拓扑。这样,可以继续在节点 A、节点 B 和节点 C 上进行更改。一旦在节点 A 和节点 D 之间创建了订阅,就可以开始在节点 D 上进行更改。节点 B 和节点 C 上发生的更改会通过节点 A 复制到节点 D。

  • 步骤 6 到步骤 9 为第二阶段。通过在节点 B 和节点 D 以及节点 C 和节点 D 之间创建订阅,此阶段可将节点 D 全面连接到拓扑。在此阶段中,必须让系统保持静止。

    第二阶段不是必需的,但是与仅仅在节点 A 和节点 D 间建立一条连接相比,它可以提供更强的容错能力。

向拓扑添加 SQL Server 2005 节点

  1. 将节点 D 配置为发布服务器,并且将其与本地或远程分发服务器关联起来。

  2. 将来自节点 A 的备份还原到节点 D。

  3. 在节点 D 上,执行 sp_addpublication。 将 @publication@enabled_for_p2p@status@allow_initialize_from_backup 的值分别指定为发布的名称、true、active 和 true。 若要向发布添加项目,请执行 sp_addarticle

  4. 在节点 D 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db@sync_type 的值分别指定为发布的名称、节点 A 的名称、节点 A 上目标数据库的名称和 replication support only

  5. 在节点 A 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db 分别指定为发布的名称、节点 D 的名称和节点 D 上目标数据库的名称,将 @sync_type 的值指定为 initialize with backup,同时为 @backupdevicetype@backupdevicename 参数指定相应的值。

  6. 通过以下步骤使拓扑静止:

    1. 停止对等拓扑中所有已发布表上的所有活动。

    2. Server AServer BServer CServer D 的数据库执行 sp_requestpeerresponse,并检索输出参数 @request_id

    3. 默认情况下,分发代理设置为连续运行;因此,令牌应该自动发送到所有节点。 如果分发代理未以连续模式运行,请运行该代理。 有关详细信息,请参阅复制代理可执行文件概念如何启动和停止复制代理 (SQL Server Management Studio)

    4. 执行 sp_helppeerresponses,并提供在步骤 2 中检索到的 @request_id 值。请稍候片刻,直到所有节点均指示它们已收到对等方的请求。

    5. 如有必要,在节点 D 上分配新的标识范围。 现在可以通过添加其余订阅来完全连接拓扑了。

  7. 在节点 D 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db@sync_type 的值分别指定为发布的名称、节点 B 的名称、节点 B 上目标数据库的名称和 replication support only

  8. 在节点 D 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db@sync_type 的值分别指定为发布的名称、节点 C 的名称、节点 C 上目标数据库的名称和 replication support only

  9. 在节点 B 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db@sync_type 的值分别指定为发布的名称、节点 D 的名称、节点 D 上目标数据库的名称和 replication support only

  10. 在节点 C 上,执行 sp_addsubscription。 将 @publication@subscriber@destination_db@sync_type 的值分别指定为发布的名称、节点 D 的名称、节点 D 上目标数据库的名称和 replication support only