为托管实例链接迁移准备环境 - Azure Arc 中的 SQL Server 迁移

适用范围:SQL Server

本文将帮助您为启用 Azure Arc 的 SQL Server 实例准备环境,以在 Azure 门户中进行托管实例链接迁移Azure SQL 托管实例

通过链接,可以将 SQL Server 数据库迁移到 Azure SQL 托管实例,方法是使用分布式可用性组的实时复制(联机迁移):

图表显示托管实例连接迁移。

注释

可以直接向 产品组提供有关迁移体验的反馈。

先决条件

若要通过 Azure 门户将 SQL Server 数据库迁移到 Azure SQL 托管实例,需要满足以下先决条件:

支持的 SQL Server 版本

Azure SQL 托管实例的“常规用途”和“业务关键”服务层级都支持托管实例链接。 使用链接功能的迁移适用于 Windows Server 上的 SQL Server 企业版、开发人员版和标准版。

下表列出了链接支持的最低 SQL Server 版本:

SQL Server 版本 最低要求的维护更新
SQL Server 2025 (17.x) SQL Server 2025 RTM (17.0.1000.7)
SQL Server 2022 (16.x) SQL Server 2022 RTM (16.0.1000.6)
SQL Server 2019 (15.x) SQL Server 2019 CU20 (15.0.4312.2)
SQL Server 2017 (14.x) SQL Server 2017 CU31(14.0.3456.2) 或更高版本和匹配的 SQL Server 2017 Azure Connect 包(14.0.3490.10) 版本
SQL Server 2016 (13.x) SQL Server 2016 SP3(13.0.6300.2) 和匹配的 SQL Server 2016 Azure Connect 包(13.0.7000.253) 构建
SQL Server 2014 (12.x) 和更早版本 不支持 SQL Server 2016 之前的版本。

仅支持从具有相应 更新策略的 SQL 托管实例到 SQL Server 2025 和 SQL Server 2022 的反向迁移。 可以通过其他工具(例如 本机备份和还原)手动撤消迁移,或者在 SSMS 中手动配置链接

Permissions

本部分介绍需要通过 Azure 门户将 SQL Server 实例迁移到 SQL 托管实例的权限。

在源 SQL Server 实例上,需要以下权限:

  • 如果启用最小特权,则数据库迁移过程中会根据需要授予所需的权限,例如 sysadmin
  • 如果无法使用最低权限,则需要对源 SQL Server 实例拥有 sysadmin 权限。

若要使用托管实例链接进行迁移,需要对 SQL 托管实例目标具有以下权限之一:

有关最低权限,请参阅 自定义权限

注释

在 Azure 中,具有 SqlServerAvailabilityGroups_CreateManagedInstanceLinkSqlServerAvailabilityGroups_failoverMiLinkSqlServerAvailabilityGroups_deleteMiLink 权限的用户可以在迁移过程中,在 数据库迁移 窗格中执行操作,以提升扩展使用的帐户的 SQL Server 权限,包括 sysadmin 角色。

准备 SQL Server 实例

若要准备 SQL Server 实例,请完成以下步骤:

需要 重启 SQL Server 才能使这些更改生效。

安装服务更新

确保 SQL Server 版本已安装相应的服务更新,如版本可支持性表中所列。 如果需要安装任何更新,则必须在更新期间重启 SQL Server 实例。

若要检查 SQL Server 版本,请在 SQL Server 上运行以下 Transact-SQL (T-SQL) 脚本:

-- Run on SQL Server
-- Shows the version and CU of the SQL Server
USE master;
GO
SELECT @@VERSION as 'SQL Server version';

在 master 数据库中创建数据库主密钥

该链接使用证书加密 SQL Server 与 SQL 托管实例之间的身份验证和通信。 数据库主密钥保护链接使用的证书。 如果已有数据库主密钥,则可以跳过此步骤。

master 数据库中创建数据库主密钥。 在下面的脚本中插入密码替代 <strong_password>,并将其保存在机密且安全的地方。 在 SQL Server上运行此 T-SQL 脚本:

-- Run on SQL Server
-- Create a master key
USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong_password>';

为确保你有数据库主密钥,请在 SQL Server 上使用以下 T-SQL 脚本:

-- Run on SQL Server
USE master;
GO
SELECT * FROM sys.symmetric_keys WHERE name LIKE '%DatabaseMasterKey%';

准备 SQL Server 2016 实例

对于 SQL Server 2016(13.x),必须完成 SQL Server 2016 先决条件准备链接中所述的额外步骤。 此链接支持的 SQL Server 2017(14.x)及更高版本不需要执行这些额外步骤。

启用可用性组

链接功能依赖于默认情况下禁用的 Always On 可用性组功能。 有关详细信息,请参阅启用 Always On 可用性组功能

若要确认是否启用了可用性组功能,请在 SQL Server 上运行以下 T-SQL 脚本:

-- Run on SQL Server
-- Is the availability groups feature enabled on this SQL Server
DECLARE @IsHadrEnabled sql_variant = (select SERVERPROPERTY('IsHadrEnabled'))
SELECT
    @IsHadrEnabled as 'Is HADR enabled',
    CASE @IsHadrEnabled
        WHEN 0 THEN 'Availability groups DISABLED.'
        WHEN 1 THEN 'Availability groups ENABLED.'
        ELSE 'Unknown status.'
    END
    as 'HADR status'

如果未启用可用性组功能,请按照以下步骤启用它:

  1. 打开“SQL Server 配置管理器”。

  2. 在左侧窗格中,选择“SQL Server 服务”。

  3. 右键单击 SQL Server 服务,然后选择 “属性

    SQL Server 配置管理器的屏幕截图,其中包括用于打开服务属性的选项。

  4. 转到“AlwaysOn 可用性组”选项卡。

  5. 选中“ 启用 AlwaysOn 可用性组 ”复选框,然后选择“ 确定”。

    显示 Always On 可用性组属性的屏幕截图。

    • 如果您使用的是 SQL Server 2016(13.x),并且“启用 Always On 可用性组”选项被禁用并显示消息,请按照链接中所述的步骤准备 SQL Server 2016 的先决条件。 完成这些步骤后,返回到此步骤,然后重试。
  6. 在对话框中选择“确定”

  7. 重启 SQL Server 服务。

启用启动跟踪标志

若要优化链接的性能,请在启动时启用以下跟踪标志:

  • -T1800:当可用性组中主要副本和次要副本的日志文件位于具有不同扇区大小的磁盘上(例如 512 字节和 4 KB)时,此跟踪标志可优化性能。 如果主要副本和次要副本都使用 4 KB 的磁盘扇区大小,则不需要此跟踪标志。 有关详细信息,请参阅 KB3009974
  • -T9567:此跟踪标志可在自动种子设定期间为可用性组启用数据流压缩。 压缩会增大处理器的负载,但可以显著减少在播种期间的传输时间。

若要在启动时启用这些跟踪标志,请执行以下步骤:

  1. 打开“SQL Server 配置管理器”。

  2. 在左侧窗格中,选择“SQL Server 服务”。

  3. 右键单击 SQL Server 服务,然后选择“ 属性”。

    SQL Server 配置管理器的屏幕截图。

  4. 转到“启动参数”选项卡。在“指定启动参数”中,输入 ,然后选择“添加”以添加启动参数。 然后输入 -T9567 并选择“添加”以添加其他跟踪标志。 选择应用以保存所做的更改。

    启动参数属性的屏幕截图。

  5. 选择“确定”以关闭“属性”窗口。

有关详细信息,请参阅启用跟踪标志的语法

重启 SQL Server 并验证配置

如果不需要升级 SQL Server 的版本、启用可用性组功能或添加启动跟踪标志,则可以跳过本部分。

确保使用的是受支持的 SQL Server 版本后,启用 AlwaysOn 可用性组功能,并添加启动跟踪标志,重启 SQL Server 实例以应用所有这些更改:

  1. 打开“SQL Server 配置管理器”。

  2. 在左侧窗格中,选择“SQL Server 服务”。

  3. 右键单击 SQL Server 服务,然后选择 “重启”。

    SQL Server 重启命令调用的屏幕截图。

重启后,在 SQL Server 上运行以下 T-SQL 脚本以验证 SQL Server 实例的配置:

-- Run on SQL Server
-- Shows the version and CU of SQL Server
USE master;
GO
SELECT @@VERSION as 'SQL Server version';
GO
-- Shows if the Always On availability groups feature is enabled
SELECT SERVERPROPERTY ('IsHadrEnabled') as 'Is Always On enabled? (1 true, 0 false)';
GO
-- Lists all trace flags enabled on SQL Server
DBCC TRACESTATUS;

SQL Server 版本应该是应用了相应服务更新的受支持版本之一。 应该启用 Always On 可用性组功能,并且应启用 -T1800-T9567 跟踪标志。 以下屏幕截图是正确配置的 SQL Server 实例的预期结果示例:

显示 S S M S 中预期结果的屏幕截图。

将数据库设置为完全恢复模式

通过链接迁移的数据库必须处于完整恢复模式,并且至少有一个备份。

针对要迁移的所有数据库在 SQL Server 上运行以下代码。 将 <DatabaseName> 替换为数据库的实际名称。

-- Run on SQL Server
-- Set full recovery model for all databases you want to migrate.
ALTER DATABASE [<DatabaseName>] SET RECOVERY FULL
GO

-- Execute backup for all databases you want to migrate.
BACKUP DATABASE [<DatabaseName>] TO DISK = N'<DiskPath>'
GO

将 Azure 受信任的根证书颁发机构密钥导入到 SQL Server

若要信任 Azure 颁发的 SQL 托管实例公钥证书,需要将 Azure 受信任的根证书颁发机构 (CA) 密钥导入 SQL Server。

可以从 Azure 证书颁发机构详细信息下载根 CA 密钥。 至少下载 DigiCert 全局根 G2Microsoft RSA 根证书颁发机构 2017 证书并将其导入 SQL Server 实例。

注释

SQL 托管实例公钥证书的认证路径中的根证书由 Azure 受信任的根证书颁发机构 (CA) 颁发。 随着 Azure 更新其受信任的 CA 列表,特定的根 CA 可能会随时间而变化。 对于简化的设置,请安装 Azure 根证书颁发机构中列出的所有根 CA 证书。 可以通过标识以前导入的 SQL 托管实例公钥的颁发者来安装所需的 CA 密钥。

将本地证书保存到 SQL Server 实例,例如 C:\certs\<name of certificate>.crt 示例路径,然后使用以下 Transact-SQL 脚本从该路径导入证书。 将 <name of certificate> 替换为实际的证书名称:DigiCert Global Root G2Microsoft RSA Root Certificate Authority 2017,这是这两个证书所需的名称。

-- Run on SQL Server-- Import <name of certificate> root-authority certificate (trusted by Azure), if not already present
CREATE CERTIFICATE [DigiCertPKI] FROM FILE = 'C:\certs\DigiCertGlobalRootG2.crt'
DECLARE @CERTID int
SELECT @CERTID = CERT_ID('DigiCertPKI')
EXEC sp_certificate_add_issuer @CERTID, N'*.database.windows.net';
GO
CREATE CERTIFICATE [MicrosoftPKI] FROM FILE = 'C:\certs\Microsoft RSA Root Certificate Authority 2017.crt'
DECLARE @CERTID int
SELECT @CERTID = CERT_ID('MicrosoftPKI')
EXEC sp_certificate_add_issuer @CERTID, N'*.database.windows.net';
GO

小窍门

sp_certificate_add_issuer如果 SQL Server 环境中缺少存储过程,则 SQL Server 实例可能未安装相应的服务更新

最后,使用以下动态管理视图验证所有创建的证书(DMV):

-- Run on SQL Server
USE master
SELECT * FROM sys.certificates

配置网络连接

要使链接正常工作,SQL Server 与 SQL 托管实例之间必须建立了网络连接。 所选的网络选项取决于 SQL Server 实例是否位于 Azure 网络上。

Azure 外部的 SQL Server

如果在 Azure 外部托管 SQL Server 实例,则可以使用以下任一选项在 SQL Server 和 SQL 托管实例之间建立 VPN 连接:

小窍门

若要在复制数据时获得最佳网络性能,请使用 ExpressRoute。 为用例预配具有足够带宽的网关。

Azure 虚拟机中的 SQL Server

在托管 SQL 托管实例的同一 Azure 虚拟网络中的 Azure 虚拟机上部署 SQL Server 是最简单的方法,因为两个实例之间自动存在网络连接。 有关详细信息,请参阅快速入门:配置 Azure VM 以连接到 Azure SQL 托管实例

如果 Azure 虚拟机实例上的 SQL Server 与 SQL 托管实例位于不同的虚拟网络中,则需要连接这两个虚拟网络。 虚拟网络不必位于同一订阅中,才能使此方案正常工作。

有两个选项可用于连接虚拟网络:

对等互连是可取的,因为它使用Microsoft主干网络。 因此,从连接的角度来看,对等互连虚拟网络和同一虚拟网络中的虚拟机之间的延迟没有明显差异。 同一区域中的网络之间支持虚拟网络对等互连。 2020 年 9 月 22 日之后创建的子网中托管的实例支持全局虚拟网络对等互连。 有关详细信息,请参阅常见问题 (FAQ)

环境之间的网络端口

无论连接机制如何,都必须满足以下要求,才能使网络流量在环境之间流动:

托管 SQL 管理实例的子网上,网络安全组 (NSG) 规则必须允许:

  • 用于接收来自源 SQL Server IP 地址流量的入站端口 5022 和端口范围 11000-11999
  • 出站端口 5022,用于将流量发送到目标 SQL Server IP 地址

托管 SQL Server 的网络上的所有防火墙,主机 OS 必须允许:

  • 入站端口 5022 已打开,以接收来自 MI 子网 /24(例如 10.0.0.0/24)的源 IP 范围的流量
  • 出站端口 5022 和端口范围 11000-11999 已打开,以将流量发送到 MI 子网(例如 10.0.0.0/24)的目标 IP 范围

显示设置 SQL Server 和 SQL 托管实例之间的链接的网络要求的关系图。

下表描述了每个环境的端口操作:

环境 怎么办
SQL Server(Azure 外部) 在网络防火墙端口 5022 上允许流入和流出 SQL 托管实例的整个子网 IP 范围的流量。 如有必要,在 SQL Server 主机的 Windows 操作系统防火墙上进行相同的操作。
SQL Server(在 Azure 之中) 在网络防火墙端口 5022 上允许流入和流出 SQL 托管实例的整个子网 IP 范围的流量。 如有必要,在 SQL Server 主机的 Windows 操作系统防火墙上进行相同的操作。 若要允许端口 5022 上的通信,请在托管虚拟机(VM)的虚拟网络中创建网络安全组(NSG)规则。
SQL 托管实例 在 Azure 门户中创建 NSG 规则,以允许来自 IP 地址的入站和出站流量以及端口范围 11000-11999 上的托管 SQL Server 的网络。

若要在 Windows 防火墙中打开端口,请在 SQL Server 实例的 Windows 主机 OS 上使用以下 PowerShell 脚本:

New-NetFirewallRule -DisplayName "Allow TCP port 5022 inbound" -Direction inbound -Profile Any -Action Allow -LocalPort 5022 -Protocol TCP
New-NetFirewallRule -DisplayName "Allow TCP port 5022 outbound" -Direction outbound -Profile Any -Action Allow -LocalPort 5022 -Protocol TCP

下图显示了本地网络环境的示例,指示 环境中的所有防火墙都需要打开端口,包括托管 SQL Server 实例的 OS 防火墙以及任何企业防火墙和网关:

显示用于设置 SQL Server 和 SQL 托管实例之间的链接的网络基础结构的关系图。

重要

  • 需要在网络环境中每个防火墙中打开端口,包括主机服务器以及网络上的任何企业防火墙或网关。 在企业环境中,可能需要向网络管理员显示本部分中的信息,以帮助在企业网络层中打开其他端口。
  • 虽然可以选择在 SQL Server 端自定义终结点,但不能更改或自定义 SQL 托管实例的端口号。
  • 承载托管实例的子网和 SQL Server 的 IP 地址范围不得重叠。

将 URL 添加到允许列表

根据网络安全设置,可能需要将 URL 添加到 SQL 托管实例 FQDN 和 Azure 使用的一些资源管理终结点的允许列表。

将以下资源添加到允许列表:

  • SQL 托管实例的完全限定域名 (FQDN)。 例如: managedinstance.a1b2c3d4e5f6.database.windows.net
  • Microsoft Entra 颁发机构
  • Microsoft Entra Endpoint 资源 ID
  • 资源管理器终结点
  • 服务终结点

按照“ 为政府云配置 SSMS ”部分中的步骤访问 SQL Server Management Studio (SSMS) 中的 “工具” 接口,并标识云中需要添加到允许列表的资源的特定 URL。

迁移受 TDE 保护的数据库的证书(可选)

如果要将受透明数据加密(TDE)保护的 SQL Server 数据库链接到 SQL 托管实例,则必须在使用链接之前,将相应的加密证书从本地或 Azure VM SQL Server 实例迁移到 SQL 托管实例。 有关详细步骤,请参阅将受 TDE 保护的数据库的证书迁移到 Azure SQL 托管实例

使用服务托管的 TDE 密钥加密的 SQL 托管实例数据库无法链接到 SQL Server。 如果使用客户管理的密钥加密加密了加密数据库,并且目标服务器有权访问用于加密数据库的同一密钥,则只能将加密数据库链接到 SQL Server。 有关详细信息,请参阅使用 Azure Key Vault 设置 SQL Server TDE

注释

SQL Server 2022 累积更新 14 开始,Linux 上的 SQL Server 支持 Azure Key Vault。

测试网络连接

在开始迁移之前,请测试 SQL Server 实例与 SQL 托管实例之间的网络连接。 可以直接从 Azure 门户测试连接,作为迁移过程的一部分。 但是,还可以使用 Transact-SQL 和 SQL Server 代理手动测试连接。 有关详细信息,请参阅 测试网络连接

若要通过 Azure 门户测试连接,请执行以下步骤:

  1. 在 SQL Server 实例资源的“数据库迁移”窗格中选择“迁移数据”。

  2. 选择 MI 链接 选项。

  3. 选择要迁移的目标数据库,然后使用 “下一步:设置 ”转到下一个选项卡。

  4. “设置” 选项卡上,提供链接的名称和源可用性组。 然后使用 测试连接 来验证 SQL Server 和 SQL 托管实例之间的网络连接:

    显示托管实例链接测试连接按钮的屏幕截图。

请考虑以下几点:

  • 为了避免误报,网络路径上的所有防火墙都必须允许 Internet 控制消息协议(ICMP)流量。
  • 为了避免误报,网络路径上的所有防火墙都必须允许专有 SQL Server UCS 协议上的流量。 阻止协议可能会导致连接测试成功,但无法创建链接。
  • 需要正确配置具有数据包级防护措施的高级防火墙设置,以允许 SQL Server 和 SQL 托管实例之间的流量。

局限性

托管实例链接的限制适用于通过 Azure 门户的迁移。

为了迁移目的,通过 Azure 门户配置链接与手动创建的链接不兼容。 如果链接已存在,则需要从源 SQL Server 实例中删除与现有链接相关的 所有证书终结点 ,然后才能通过 Azure 门户创建新链接。 可以列出所有现有证书的 SELECT * FROM sys.certificates 及所有现有终结点的 SELECT * FROM sys.endpoints

然后,通过在 Azure Cloud Shell 或使用 Azure 上下文登录的本地计算机中运行以下 PowerShell 命令,从 Azure SQL 托管实例中删除证书: Get-AzSqlInstanceServerTrustCertificateRemove-AzSqlInstanceServerTrustCertificate

通过 Azure 门户监视迁移仅适用于满足监视 许可要求的 SQL Server 实例。