教程:为复制准备 SQL Server(发布服务器、分发服务器、订阅服务器)

适用范围:SQL Server

在配置复制拓扑之前,制定安全计划是非常重要的。 本教程演示如何更好地保护复制拓扑的安全。 它还会演示如何配置分发,这是数据复制的第一步。 开始其他教程之前,必须先完成本教程。

注意

若要在服务器之间安全地复制数据,你应该实施复制安全最佳做法中提出的所有建议。

在本教程中,你将了解如何准备服务器以便用最少的特权安全地运行复制。

本教程介绍如何执行下列操作:

  • 为复制创建 Windows 帐户。
  • 准备快照文件夹。
  • 配置分发。

先决条件

本教程适用于熟悉基本数据库操作,但对复制认识有限的用户。

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

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

    • 任何版本的 SQL Server,SQL Server Express 或 SQL Server Compact 除外。 这些版本不能是复制发布者。

    • AdventureWorks2022 示例数据库。 为了增强安全性,默认情况下不会安装示例数据库。

  • 在订阅服务器(目的地)上,安装任意版本的 SQL Server,SQL Server Compact 除外。 SQL Server Compact 不能是事务复制中的订阅服务器。

  • 安装 SQL Server Management Studio

  • 安装 SQL Server Developer Edition

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

注意

  • 不同版本的 SQL Server 实例不支持复制。 有关详细信息,请参阅 复制向后兼容性

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

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

为复制创建 Windows 帐户

在本部分中,将创建 Windows 帐户以运行复制代理。 你将在本地服务器上为以下代理创建一个单独的 Windows 帐户:

Agent 位置 帐户名
快照代理 发布者 <machine_name>\repl_snapshot
日志读取器代理 发布者 <machine_name>\repl_logreader
分发代理 发布服务器和订阅服务器 <machine_name>\repl_distribution
合并代理 发布服务器和订阅服务器 <machine_name>\repl_merge

注意

在复制教程中,发布服务器和分发服务器共享同一 SQL Server 实例 (NODE1\SQL2016)。 订阅服务器实例 (NODE2\SQL2016) 是远程实例。 发布服务器和订阅服务器可能共享 SQL Server 的同一实例,但这不是必需的。 如果发布服务器和订阅服务器共享同一实例,则不需要在订阅服务器上创建帐户的步骤。

在发布服务器上为复制代理创建本地 Windows 帐户

  1. 在发布服务器上,从“控制面板”的“管理工具”中打开“计算机管理”

  2. 在“系统工具”中,展开“本地用户和组”

  3. 右键单击“用户”,然后选择“新建用户”

  4. 在“用户名”框中,输入 repl_snapshot,提供密码和其他相关信息,然后选择“创建”来创建 repl_snapshot 帐户

    “新建用户”对话框的屏幕截图。

  5. 重复上述步骤创建 repl_logreader、repl_distribution 和 repl_merge 帐户:

    复制用户列表的屏幕截图。

  6. 选择“关闭”。

在订阅服务器上为复制代理创建本地 Windows 帐户

  1. 在订阅服务器上,从“控制面板”的“管理工具”中打开“计算机管理”

  2. 在“系统工具”中,展开“本地用户和组”

  3. 右键单击“用户”,然后选择“新建用户”

  4. 在“用户名”框中,输入 repl_distribution,提供密码和其他相关信息,然后选择“创建”来创建 repl_distribution 帐户

  5. 重复上述步骤创建 repl_merge 帐户。

  6. 选择“关闭”。

有关详细信息,请参阅 复制代理概述

准备快照文件夹

在本部分中,你可配置用于创建和存储发布快照的快照文件夹。

为快照文件夹创建共享并分配权限

  1. 在文件资源管理器,浏览到 SQL Server 数据文件夹。 默认位置为 C:\Program Files\Microsoft SQL Server\MSSQL.X\MSSQL\Data。

  2. 创建名为 repldata的新文件夹。

  3. 右键单击该文件夹并选择“属性”

    1. 在“repldata 属性”对话框的“共享”选项卡上,选择“共享”

    2. 在“高级共享”对话框中,选择“共享此文件夹”,然后选择“权限”

    用于共享 repldata 文件夹的选择的屏幕截图。

  4. 在“repldata 的权限”对话框中,选择“添加”。 在“选择用户、计算机、服务帐户或组”框中,键入以前创建的快照代理帐户的名称,例如 <Publisher_Machine_Name>\repl_snapshot。 选择“检查名称”,然后选择“确定”

    用于添加共享权限的选择的屏幕截图。

  5. 重复步骤 6,添加以前创建的两个帐户:<Publisher_Machine_Name>\repl_merge 和 <Publisher_Machine_Name>\repl_distribution

  6. 添加三个帐户后,会分配以下权限:

    • repl_distribution:读取
    • repl_merge:读取
    • repl_snapshot:完全控制

    每个帐户的共享权限的屏幕截图。

  7. 共享权限配置正确后,选择“确定”关闭“repldata 的权限”对话框。 选择“确定”关闭“高级共享”对话框

  8. 选择“repldata 属性”对话框中的“安全性”选项卡,然后选择“编辑”

    “安全性”选项卡上的“编辑”按钮的屏幕截图。

  9. 在“repldata 的权限”对话框中,选择“添加”。 在“选择用户、计算机、服务帐户或组”框中,键入以前创建的快照代理帐户的名称,例如 <Publisher_Machine_Name>\repl_snapshot。 选择“检查名称”,然后选择“确定”

    用于添加安全权限的选择的屏幕截图。

  10. 重复上一步,为分发代理和合并代理添加权限,其格式分别为 <Publisher_Machine_Name>\repl_distribution 和 <Publisher_Machine_Name>\repl_merge

  11. 验证是否允许以下权限:

    • repl_distribution:读取
    • repl_merge:读取
    • repl_snapshot:完全控制

    复制数据的用户权限的屏幕截图。

  12. 再次选择“共享”选项卡,并记下共享的“网络路径”。 稍后在配置快照文件夹时需要此路径。

    “共享”选项卡上的网络路径的屏幕截图。

  13. 选择“确定”关闭“repldata 属性”对话框

有关详细信息,请参阅保护快照文件夹

配置分发

在本部分中,将在发布服务器中配置分发,并设置所需的发布数据库和分发数据库权限。 如果已配置分发服务器,则必须在开始本部分之前禁用发布和分发。 如果必须保留现有的复制拓扑,尤其是在生产环境中,请不要禁用发布和分发。

使用远程分发服务器配置发布服务器不属于本教程讨论的范畴。

在发布服务器中配置分发

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

  2. 右键单击“复制”文件夹,然后选择“配置分发”

    快捷菜单上的“配置分发”命令的屏幕截图。

    • 如果使用 localhost 而不是实际服务器名称连接到 SQL Server,系统会提示你发出警告,指出 SQL Server 无法连接到 localhost 或 IP 地址。 在警告对话框中选择“确定”。 在“连接到服务器”对话框中,将“服务器名称”从 localhost 或 IP 地址更改为你的服务器的名称。 然后选择“连接” 。

    • SQL Server Management Studio (SSMS) 18.0(及更高版本)当前存在一个已知问题,在连接到具有 IP 地址的分发服务器时,不会显示警告消息,但仍无效。 在连接到分发服务器时,应使用实际的服务器名称。

    注意

    可以将服务器名称指定为 <Hostname>,<PortNumber> 默认实例或 <Hostname>\<InstanceName>,<PortNumber> 命名实例。 使用自定义端口在 Linux 或 Windows 上部署 SQL Server 时指定连接的端口号,并禁用浏览器服务。 远程分发服务器的自定义端口号的使用适用于 SQL Server 2019 (15.x) 及更高版本。

    此时分发配置向导启动。

  3. 在“分发服务器”页上,选择 <'ServerName'>“将充当自己的分发服务器;SQL Server 将创建分发数据库和日志”。 然后选择下一步

    使服务器充当其自己的分发服务器的选项的屏幕截图。

  4. 如果SQL Server 代理未运行,请在“SQL Server 代理启动”页上选择“是”,将SQL Server 代理服务配置为自动启动。 选择下一步

  5. 在“快照文件夹”框中输入路径 \\<Publisher_Machine_Name>\repldata,然后选择“下一步”。 此路径应匹配以前配置共享属性后,在 repldata 属性文件夹的“网络路径”下看到的路径。

    “repldata 属性”对话框中和“配置分发向导”中网络路径比较的屏幕截图。

  6. 接受向导剩余页上的默认值。

    向导最后一页的屏幕截图。

  7. 选择“完成”以启用分发

配置分发服务器时,可能会看到以下错误。 这表明用于启动SQL Server 代理帐户的帐户不是系统上的管理员。 需要手动启动SQL Server 代理,向现有帐户授予这些权限,或修改SQL Server 代理使用的帐户。

用于配置SQL Server 代理的错误消息的屏幕截图。

如果正在使用管理权限运行 SQL Server Management Studio 实例,可从 SSMS 中手动启动 SQL 代理:

在 SSMS 中代理的快捷菜单上选择“开始”的屏幕截图。

注意

如果 SQL 代理不启动,右键单击 SSMS 中的 SQL Server 代理,然后选择“刷新”。 如果仍处于停止状态,请从 SQL Server 配置管理器中手动启动它。

设置数据库权限

  1. 在 SQL Server Management Studio 中,展开“安全性”,右键单击“登录名”,然后选择“新建登录名”

    快捷菜单上“新建登录”命令的屏幕截图。

  2. 在“常规”页上,选择“搜索”。 在“输入要选择的对象名称”框中输入 <Publisher_Machine_Name>\repl_snapshot,然后依次选择“检查名称”和“确定”

    用于输入对象名称的选择的屏幕截图。

  3. 在“用户映射”页上,在“映射到此登录名的用户”列表中选择“distribution”和“AdventureWorks2022”数据库。

    在“数据库角色成员身份”列表中,为这两个数据库的登录名选择“db_owner”角色。

    选择数据库及其角色的屏幕截图。

  4. 选择“确定”创建登录名

  5. 重复步骤 1-4,为其他本地帐户(repl_distribution、repl_logreader 和 repl_merge)创建登录名。 这些登录名也必须映射到属于“distribution”数据库和“AdventureWorks”数据库中“db_owner”固定数据库角色成员的用户。

    对象资源管理器中所有四个帐户的屏幕截图。

有关详细信息,请参阅 配置分发复制代理安全模型

下一步