教程:配置服务器和移动客户端之间的复制(合并)

适用范围:SQL Server

合并复制是解决中央服务器和偶尔连接的移动客户端之间的数据移动问题的好方法。 使用复制向导可以轻松地配置和管理合并复制拓扑。

本教程演示如何为移动客户端配置复制拓扑。 有关合并复制的详细信息,请参阅合并复制概述

要学习的知识

本教程将教你使用合并复制将数据从中央数据库发布到一个或多个移动用户,以便每个用户都能获得唯一筛选的数据子集。

在本教程中,您将学习如何执行以下操作:

  • 为合并复制配置发布服务器。
  • 为合并发布添加移动订阅服务器。
  • 使订阅与合并发布同步。

先决条件

本教程面向熟悉数据库基本数据库操作但复制经验不足的用户。 在开始本教程的学习之前,必须已完成教程:为复制准备 SQL Server 的学习。

若要完成本教程,需要 SQL Server、SQL Server Management Studio (SSMS) 以及 AdventureWorks 数据库:

  • 在发布服务器(源)上,安装:

    • 任何版本的 SQL Server,SQL Server Express 或 SQL Server Compact 除外。 这些版本不能充当复制发布服务器。
    • AdventureWorks2022 示例数据库。 为了增强安全性,默认情况下不会安装示例数据库。
  • 在订阅服务器(目标)上,安装任意版本的 SQL Server,SQL Server Express 或 SQL Server Compact 除外。 本教程中创建的发布不支持 SQL Server Express 或 SQL Server Compact。

  • 安装 SQL Server Management Studio。

  • 安装 SQL Server 2017 Developer 版本

  • 下载 AdventureWorks 示例数据库。 有关在 SSMS 中还原数据库的说明,请参阅还原数据库

注意

在相差两个版本以上的 SQL Server 实例上不支持复制。

在 SQL Server Management Studio 中,必须使用属于 sysadmin 固定服务器角色成员的登录名连接到发布服务器和订阅服务器。 有关此角色的详细信息,请参阅服务器级别角色

本教程的预计学时:60 分钟

为合并复制配置发布服务器

在本部分中,将使用 SQL Server Management Studio 创建合并发布,用于在 AdventureWorks2022 示例数据库中发布 EmployeeSalesOrderHeaderSalesOrderDetail 表的子集。 这些表用参数化行筛选器进行筛选,以便每个订阅都包含唯一的数据分区。 你还要将合并代理使用的 SQL Server 登录名添加到发布访问列表 (PAL) 中。

创建合并发布并定义项目

  1. 在 SQL Server Management Studio 中连接到发布服务器,然后展开服务器节点。

  2. 通过在对象资源管理器中右键单击“SQL Server 代理”并选择“启动”,来启动“SQL Server 代理”。 如果此步骤未启动代理,则需要从“SQL Server 配置管理器”手动启动。

  3. 展开“复制”文件夹,右键单击“本地发布”,再选择“新建发布”。 新建发布向导将启动:

    用于启动新建发布向导的选择

  4. 在“发布数据库”页上,选择 AdventureWorks2022,然后选择“下一步”

  5. 在“发布类型”页上,选择“合并发布”,然后选择“下一步”

  6. 在“订阅服务器类型”页上,确保仅选中了 SQL Server 2008 (10.0.x) 或更高版本,然后选择“下一步”

    “发布类型”和“订阅服务器类型”页

  7. 在“项目”页上,展开“表”节点。 然后选择以下三个表:Employee、SalesOrderHeader 和 SalesOrderDetail。 选择下一步

    “项目”页上的表选择

    注意

    “Employee”表包含数据类型为 hierarchyid 的列 (OrganizationNode)。 仅 SQL Server 2017 中支持复制该数据类型。

    如果使用低于 SQL Server 2017 的内部版本,屏幕底部会显示一条消息,通知在双向复制中使用此列可能出现数据丢失。 对于此教程,可以忽略此消息。 但是,除非使用受支持的内部版本,否则不应在生产坏境中复制此数据类型。

    有关如何复制 hierarchyid 数据类型的详细信息,请参阅在复制中使用 Hierarchyid 列

  8. 在“筛选表行”页上,选择“添加”,然后选择“添加筛选器”

  9. 在“添加筛选器”对话框中,在“选择要筛选的表”中选择“Employee (HumanResources)”。 选择 LoginID 列,再选择向右键以将此列添加到筛选查询的 WHERE 子句,并将 WHERE 子句修改如下

     WHERE [LoginID] = HOST_NAME()  
    

    选择“此表中的行将仅转到一个订阅”,再选择“确定”

    用于添加筛选器的选择

  10. 在“筛选表行”页上,选择“Employee (Human Resources)”,选择“添加”,然后选择“添加联接以扩展所选筛选器”

    a. 在“添加联接”对话框的“联接的表”下,选择“Sales.SalesOrderHeader”。 在“手动编写联接语句”框中,按如下所示完成联接语句

    ON [Employee].[BusinessEntityID] =  [SalesOrderHeader].[SalesPersonID] 
    

    b. 在“指定联接选项”中,选择“唯一键”,然后选择“确定”

    用于将联接添加到筛选器的选择

  11. 在“筛选表行”页上,选择“SalesOrderHeader”,选择“添加”,然后选择“添加联接以扩展所选筛选器”

    a. 在“添加联接”对话框的“联接的表”下,选择“Sales.SalesOrderDetail”
    b. 选择“使用生成器创建语句”
    c. 在“预览”框中,确认联接语句如下所示

    ON [SalesOrderHeader].[SalesOrderID] = [SalesOrderDetail].[SalesOrderID] 
    

    d. 在“指定联接选项”中,选择“唯一键”,然后选择“确定”。 选择下一步

    用于为销售订单添加其他联接的选择

  12. 选中“立即创建快照”,清除“计划在以下时间运行快照代理”,然后选择“下一步”

    用于立即创建快照的选择

  13. 在“代理安全性”页上,选择“安全设置”。 在“进程帐户”框中输入 <Publisher_Machine_Name>\repl_snapshot,为此帐户提供密码,然后选择“确定”。 选择下一步

    用于设置快照代理安全性的选择

  14. 在“完成该向导”页的“发布名称”框中,输入 AdvWorksSalesOrdersMerge,然后选择“完成”

    带发布名称的“完成向导”页

  15. 创建发布后,选择“关闭”。 在“对象资源管理器”中的“复制”节点下,右键单击“本地复制”并选择“刷新”,以查看新的合并复制

查看快照的生成状态

  1. 在 SQL Server Management Studio 中连接到发布服务器,然后依次展开服务器节点和“复制”文件夹。

  2. 在“本地发布”文件夹中,右键单击 AdvWorksSalesOrdersMerge,再选择“查看快照代理状态”

    用于查看快照代理状态的选择

  3. 将显示该发布的快照代理作业的当前状态。 继续下一课之前,请确保快照作业已成功完成。

将合并代理登录名添加到 PAL

  1. 在 SQL Server Management Studio 中连接到发布服务器,然后依次展开服务器节点和“复制”文件夹。

  2. 在“本地发布”文件夹中,右键单击 AdvWorksSalesOrdersMerge,再选择“属性”

    a. 选择“发布访问列表”页,选择“添加”

    b. 在“添加发布访问项”对话框中,选择 <Publisher_Machine_Name>\repl_merge,然后选择“确定”。 再次选择确定

    用于添加合并代理登录名的选择

有关详细信息,请参阅:

创建合并发布的订阅

在此节中,介绍如何将订阅添加到先前创建的合并发布中。 本教程将使用远程订阅服务器 (NODE2\SQL2016)。 然后,为订阅数据库设置权限,并手动生成新订阅的筛选数据快照。

添加合并发布订阅服务器

  1. 在 SQL Server Management Studio 中连接到订阅服务器,并展开服务器节点。 展开“复制”文件夹,右键单击“本地订阅”文件夹,然后选择“新建订阅”。 新建订阅向导将启动:

    用于启动新建订阅向导的选择

  2. 在“发布”页上,选择“发布服务器”列表中的“查找 SQL Server 发布服务器”

    在“连接到服务器”对话框的“服务器名称”框中,输入发布服务器实例的名称,然后选择“连接”

    用于添加发布服务器的选择

  3. 选择“AdvWorksSalesOrdersMerge”,然后选择“下一步”

  4. 在“合并代理位置”页上,选择“在其订阅服务器上运行每个代理”,然后选择“下一步”

    “在其订阅服务器上运行每个代理”选项

  5. 在“订阅服务器”页上,选择订阅服务器实例名称。 然后在“订阅数据库”下,从列表中选择“新建数据库”

    在“新建数据库”对话框的“数据库名称”框中输入 SalesOrdersReplica。 选择“确定”,然后选择“下一步”。

    用于将数据库添加到订阅服务器的选择

  6. 在“合并代理安全性”页中,选择省略号 (…) 按钮。 在“进程帐户”框中输入 <Subscriber_Machine_Name>\repl_merge,并提供此帐户的密码。 选择“确定”,选择“下一步”,然后再一次选择“下一步”

    用于合并代理安全性的选择

  7. 在“同步计划”页上,将“代理计划”设置为“仅按需运行”。 选择下一步

    用于代理的“仅按需运行”选择

  8. 在“初始化订阅”页上,从“初始化时间”列表中选择“首次同步时”,单击“下一步”。 选择“下一步”,继续进入到“订阅类型”页,然后选择适当的订阅类型。 本教程使用客户端。 选择订阅类型后,再一次选择“下一步”

    用于首次同步时初始化订阅的选择

  9. 在“HOST_NAME 值”页的“HOST_NAME 值”框中,输入值 adventure-works\pamela0。 然后选择完成

    “HOST_NAME 值”页

  10. 再一次选择“完成”。 创建订阅后,选择“关闭”

在订阅服务器上设置服务器权限

  1. 连接到 SQL Server Management Studio 中的订阅服务器。 展开“安全性”,右键单击“登录名”,然后选择“新建登录名”

    在“常规”页上,选择“搜索”并在“输入对象名称”框中输入 <Subscriber_ Machine_Name>\repl_merge。 选择“检查名称”,然后选择“确定”

    用于设置登录名的选择

  2. 在“用户映射”页上,依次选择“SalesOrdersReplica”数据库和“db_owner”角色。 在“安全对象”页上,向“更改跟踪”授予“显式”权限。 选择“确定”

    “用户映射”和“安全对象”页

创建订阅的筛选数据快照

  1. 在 SQL Server Management Studio 中连接到发布服务器,然后依次展开服务器节点和“复制”文件夹。

  2. 在“本地发布”文件夹中,右键单击“AdvWorksSalesOrdersMerge”发布,然后选择“属性”

    a. 选择“数据分区”页,然后选择“添加”
    b. 在“添加数据分区”对话框的“HOST_NAME 值”框中,输入 adventure-works\pamela0,然后选择“确定”
    c. 选择新添加的分区,选择“立即生成所选快照”,然后选择“确定”

    用于添加分区的选择

有关详细信息,请参阅:

使订阅与合并发布同步

在本部分中,你将使用 SQL Server Management Studio 启动合并代理以初始化订阅。 还将使用此过程与发布服务器同步。

启动同步并初始化订阅

  1. 连接到 SQL Server Management Studio 中的订阅服务器。

  2. 确保 SQL Server 代理正在运行。 如果未运行,在对象资源管理器中右键单击 SQL Server 代理并选择“启动”。 如果此步骤未启动代理,则需要使用 SQL Server 配置管理器手动启动。

  3. 展开“复制”节点。 在“本地订阅”文件夹中,右键单击 SalesOrdersReplica 数据库中的订阅,再选择“查看同步状态”

    选择“启动”以初始化订阅

    使用“启动”按钮同步状态