通过


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

applies to:SQL Server

本文将协助您为通过 Azure Arc 启用的 SQL Server 实例在 Azure 门户中迁移到 Azure SQL 托管实例托管实例 链接迁移 准备环境。

使用该链接,您可以通过实时复制和分布式可用性组(在线迁移)将 SQL Server 数据库迁移到 Azure SQL 托管实例。

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

注释

  • 可以直接向 产品组提供有关迁移体验的反馈。
  • 从 SQL Server 版本 1.1.3348.364 Azure 扩展开始,一次最多迁移 10 个数据库。

先决条件

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

  • 活动的 Azure 订阅。 如果没有帐户,请创建一个免费帐户
  • 支持的 SQL Server 实例由 Azure Arc 启用,适用于 SQL Server 版本 1.1.3238.349 的 Azure 扩展支持一次仅迁移一个数据库。 SQL Server版本 1.1.3348.364 或更高版本的Azure扩展需要同时迁移多达 10 个数据库。 可以使用 Azure 门户Azure CLI 升级扩展。

支持的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 之前的版本。

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

Permissions

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

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

  • 如果启用最小特权,则数据库迁移过程中会根据需要授予所需的权限,例如 sysadmin
  • 如果无法使用最低权限,则执行迁移的人员需要对源SQL Server实例具有 sysadmin 权限。 此外,如果需要取消迁移,还手动向帐户分配 NT AUTHORITY\SYSTEM 权限。

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

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

注释

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

匹配副本之间的性能容量

使用链接功能时,请务必匹配SQL Server和SQL 托管实例之间的性能容量。 如果辅助副本无法与主副本的复制保持同步,或者在故障转移后,这种匹配有助于避免性能问题。 性能容量包括 CPU 核心(或 Azure 中的 vCore)、内存和 I/O 吞吐量。

准备SQL Server实例

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

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

安装服务更新

确保SQL Server版本已安装相应的服务更新,如 version 可支持性表中所列。 如果需要安装任何更新,则必须在更新期间重启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),必须完成链接的 Prepare 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 Services

  3. 右键单击SQL Server服务,然后选择Properties

    显示 SQL Server 配置管理器的屏幕截图,其中选择了打开服务的属性。

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

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

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

    • 如果您正在使用 SQL Server 2016(13.x),并且启用 AlwaysOn 可用性组选项被禁用,并出现消息This computer is not a node in a failover cluster,请按照准备 SQL Server 2016 的先决条件中所述的步骤进行操作。 完成这些步骤后,返回到此步骤,然后重试。
  6. 在对话框中选择“确定”

  7. 重启SQL Server服务。

启用启动跟踪标志

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

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

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

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

  2. 从左窗格中选择 SQL Server Services

  3. 右键单击SQL Server服务,然后选择Properties

    Screenshot, 显示 SQL Server 配置管理器.

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

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

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

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

重启SQL Server并验证配置

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

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

  1. 打开 SQL Server 配置管理器

  2. 从左窗格中选择 SQL Server Services

  3. 右键单击SQL Server服务,然后选择Restart

    这是一个显示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

小窍门

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

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

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

启用加速数据库恢复

对于 SQL Server 2019 及更高版本,请启用 accelerated 数据库恢复,并确保持久性版本存储 (PVS) 设置为 PRIMARY。 如果未在源SQL Server数据库上启用加速数据库恢复,则迁移数据库后无法在目标 SQL 托管实例上启用它。 如果未将永久性版本存储(PVS)设置为 PRIMARY,则可能会遇到目标 SQL 托管实例上的还原作问题。

对于 SQL Server 2017 和更早版本,不支持加速数据库恢复,因此不需要执行此步骤。

若要在源SQL Server数据库上正确配置加速数据库恢复,请执行以下步骤:

  1. 通过在SQL Server上运行以下Transact-SQL脚本来启用加速数据库恢复:

    ALTER DATABASE [<database name>] SET ACCELERATED_DATABASE_RECOVERY = ON;
    
  2. 永久性版本存储(PVS)必须设置为 PRIMARY 源数据库,这是默认配置。 如果之前已更改,则必须在开始迁移之前 将其更改回 PRIMARY

启用 Service Broker

默认为所有版本的 SQL Server 启用 Service Broker。 如果 Service Broker 已禁用,并且你计划在SQL 托管实例上使用,请在迁移到SQL 托管实例之前在源SQL Server数据库上启用 Service Broker。 如果未在源SQL Server数据库上启用 Service Broker,则无法在目标 SQL 托管实例上使用它。

若要检查 Service Broker 是否已启用,请在 SQL Server 实例上运行以下Transact-SQL脚本:

SELECT name AS [Database Name], is_broker_enabled AS [Service Broker Enabled]
FROM sys.databases
WHERE name = '<database name>';

如果禁用 Service Broker,请在源SQL Server数据库上运行以下Transact-SQL脚本来启用它:

USE master;
GO

ALTER DATABASE [<database name>]
    SET ENABLE_BROKER;
GO

配置网络连接

若要使链接正常工作,必须在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 是最简单的方法,因为两个实例之间自动存在网络连接。 有关详细信息,请参阅 Quickstart:配置Azure VM 以连接到 Azure SQL 托管实例

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

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

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

环境之间的网络端口

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

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

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

在SQL 托管实例上无法更改 5022 端口。

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

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

可以在SQL Server端自定义 5022 端口,但端口范围 11000-11999 必须按原样打开。

Diagram 显示设置SQL Server与 SQL 托管实例之间的链接的网络要求。

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

环境 怎么办
SQL Server(Azure外) 在网络防火墙上打开端口 5022 的入站和出站流量,以覆盖整个子网 IP 范围的 SQL 托管实例。 如有必要,在SQL Server主机 OS Windows防火墙上执行相同的操作。
SQL Server(Azure) 在网络防火墙上打开端口 5022 的入站和出站流量,以覆盖 SQL 托管实例的整个子网 IP 范围。 如有必要,在SQL Server主机 OS Windows防火墙上执行相同的操作。 若要允许端口 5022 上的通信,请在托管虚拟机(VM)的虚拟网络中创建网络安全组(NSG)规则。
SQL 托管实例 在 Azure 门户中创建 NSG 规则,以允许来自 IP 地址和 5022 端口及 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 防火墙以及任何企业防火墙和网关:

Diagram 显示网络基础结构,用于设置 SQL Server 与 SQL 托管实例之间的链接。

重要

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

将 URL 添加到允许列表

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

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

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

按照 配置适用于政府云的 SSMS 部分中的步骤,访问 SQL Server Management Studio (SSMS) 中的 Tools 接口,并确定需要添加到允许列表的资源的特定 URL。

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

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

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

注释

Linux 上的 SQL Server 从 SQL Server 2022 的累积更新第 14 版 开始支持 Azure 密钥保管库。

测试网络连接

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

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

  1. 数据库迁移 窗格中为 SQL Server 实例资源选择 迁移数据

  2. 选择 MI 链接 选项。

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

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

    这是一个截图,显示“托管实例”链接测试连接按钮。

请考虑以下几点:

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

局限性

请考虑以下限制:

  • 托管实例 链接的限制适用于通过 Azure 门户进行的迁移。
  • Azure SQL Server 版本 1.1.3238.349 及更早版本扩展仅支持通过链接一次迁移一个数据库。 若要同时迁移多个数据库,请升级到 SQL Server 版本 1.1.3348.364 或更高版本的 Azure 扩展。
  • 取消迁移需要对源SQL Server实例具有 sysadmin 权限。 如果SQL Server实例未使用最低权限,请手动将 sysadmin 权限分配给 NT AUTHORITY\SYSTEM 帐户。
  • 出于迁移目的,通过 Azure 门户配置链接与通过SQL Server Management Studio(SSMS)或Transact-SQL(T-SQL)手动创建的链接不兼容。 查看 已知问题 以了解详细信息。
  • 通过 Azure 门户监视迁移仅适用于符合监视许可要求的 SQL Server 实例。

排查常见问题

若要排查迁移到 Azure SQL 托管实例 时的常见问题,请参阅 排查迁移问题