你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

故障排除链接 - Azure SQL 托管实例

适用于:Azure SQL 托管实例

本文介绍如何监视和排查 SQL Server 与 Azure SQL 托管实例之间的链接问题。

可以使用 Transact-SQL(T-SQL)、Azure PowerShell 或 Azure CLI 检查链接的状态。 如果遇到问题,可以使用错误代码来解决问题。

可以通过检查两个实例之间的网络和验证已针对链接正确准备好环境来解决创建链接的许多问题。

初始播种

在 SQL Server 和 Azure SQL 托管实例之间建立链接时,数据复制开始前会出现初始种子设定阶段。 初始种子设定阶段是操作过程中耗时最长且开销最大的阶段。 初始种子设定完成后,数据将会同步,但只会复制后续的数据更改。 初始种子设定完成所需的时间取决于数据大小、主数据库上的工作负荷强度以及主要副本和次要副本网络之间的链接速度。

如果两个实例之间的链接速度比所需速度慢,则种子设定时间可能会受到明显影响。 可以使用有说明的种子设定速度、总数据大小以及链接速度来估计初始种子设定阶段在数据复制开始前需要多长时间。 例如,对于单个 100 GB 的数据库,如果链接每小时能够推送 84 GB 数据,并且没有其他数据库正在进行向不同链接的种子设定,则初始种子设定阶段需要花费大约 1.2 小时。 如果链路每小时只能传输 10 GB,则为 100 GB 数据库设定种子需要大约 10 小时。 如果有多个数据库可以通过多个链接进行复制,则会并行执行种子设定,并且当与慢速链接速度相结合时,初始种子设定阶段可能需要相当长的时间,尤其是当来自所有数据库的并行种子设定超过可用链接带宽时。

重要

初始分发阶段可能会因为极低的速度或繁忙的链接而持续数天。 在这种情况下,创建链接可能会超时。创建链接会在 6 天后自动取消。

如果链接出现问题,可以使用 SQL Server Management Studio(SSMS)、Transact-SQL(T-SQL)、Azure PowerShell 或 Azure CLI 获取有关链接的当前状态的信息。

使用 T-SQL 获取链接状态的快速状态详细信息,然后使用 Azure PowerShell 或 Azure CLI 获取有关链接当前状态的完整信息。

从 SQL Server Management Studio(SSMS)21.0(预览版)开始,可以使用链接监视。

若要检查 SSMS 中的链接状态,请执行以下步骤:

  1. 连接到托管链接的副本。

  2. 在“对象资源管理器”中,展开“Always On 高可用性”,并展开“可用性组”。

  3. 右键单击链接的名称,然后选择“ 属性 ”以打开 “链接属性 ”窗口:

    SSMS 中链接的右键单击菜单的屏幕截图,其中突出显示了属性。

  4. 链接属性 ”窗口显示有关链接的有用信息,例如副本信息、链接状态和终结点证书过期日期:

    SSMS 中链接属性窗口的屏幕截图。

replicaState 值描述当前链接。 如果状态还包括“错误”,则在状态中列出的操作期间已发生错误。 例如,LinkCreationError 指示创建链接时出错。

一些可能的 replicaState 值为

  • CreatingLink:初始种子设定
  • LinkSynchronizing:数据复制正在进行
  • LinkFailoverInProgress:故障转移正在进行

有关链接状态属性的完整列表,请查看 分布式可用性组 - GET REST API 命令。

使用链接时可能会遇到两个不同的错误类别 - 尝试初始化链接时出错,尝试创建链接时出错。

初始化链接时,可能会出现以下错误(链接状态:LinkInitError):

  • 错误 41962:操作中止,因为链接未在 5 分钟内启动。 检查 网络连接,然后重试。
  • 错误 41973:无法建立链接,因为 SQL Server 中的 终结点证书未正确导入 Azure SQL 托管实例。
  • 错误 41974:无法建立链接,因为 SQL 托管实例中的 终结点证书 未正确导入 SQL Server。
  • 错误 41976:可用性组未响应。 检查名称和配置参数,然后重试。
  • 错误 41986:由于连接失败或辅助副本未响应,无法建立链接。 请检查名称、配置参数和网络连接,然后重试。
  • 错误 47521:无法建立链接,因为辅助服务器未收到请求。 请确保可用性组和数据库在主服务器上正常运行,然后重试。

创建链接时可能会发生以下错误(链接状态: LinkCreationError

  • 错误 41977:目标数据库未响应。 检查链接参数,然后重试。

  • 过早截断日志:如果在初始播种完成之前截断事务日志,则可能会看到以下错误之一:

    • 错误 1408:数据库“%.*ls”的远程副本无法恢复,无法启用数据库镜像或将其加入可用性组。
    • 错误 1412:数据库“%.*ls”的远程副本尚未前滚到包含在数据库日志的本地副本中的时间点。

    若要解决此问题,必须 删除 并重新创建链接。
    为了避免此问题,请在 SQL Server 上暂停事务日志备份,以便在初始种子设定阶段复制数据库。

强制故障转移后的状态不一致

在强制故障转移后,可能会遇到两个副本处于主要角色的脑裂场景,导致链接处于不一致状态。 如果在灾难期间故障转移到辅助副本,并且主副本重新联机,则可能发生这种情况。

首先,确认你处于脑裂场景。 可以使用 SQL Server Management Studio(SSMS)或 Transact-SQL(T-SQL)执行此操作。

连接到 SSMS 中的 SQL Server 和 SQL 托管实例,然后在“对象资源管理器”中,在“Always On 高可用性”中的“可用性组”节点下,展开“可用性副本”。 如果两个不同的副本列为“(主要)”,则表示处于脑裂场景

或者,可以在 SQL Server 和 SQL 托管实例上运行以下 T-SQL 脚本,以检查副本的角色:

-- Execute on SQL Server and SQL Managed Instance 
USE master
DECLARE @link_name varchar(max) = '<DAGName>'
SELECT
   ag.name [Link name], 
   rs.role_desc [Link role] 
FROM
   sys.availability_groups ag 
   JOIN sys.dm_hadr_availability_replica_states rs 
   ON ag.group_id = rs.group_id 
WHERE 
   rs.is_local = 1 AND ag.is_distributed = 1 AND ag.name = @link_name 
GO

如果两个实例的“链接角色”列中列出“主要”,则表示处于脑裂场景

要解决脑裂状态,请首先对曾是原始主要副本的任意副本进行备份。 如果原始主服务器为 SQL Server,则请进行结尾日志备份。 如果原始主要副本是 SQL 托管实例,则可进行仅复制完整备份。 备份完成后,将分布式可用性组设置为曾用作原始主要副本(但现在将作为新辅助副本)的副本的辅助角色。

例如,如果发生真正灾难,假设已强制将 SQL Server 工作负载故障转移到 Azure SQL 托管实例,并且打算继续在 SQL 托管实例上运行工作负载,在 SQL Server 上执行结尾日志备份,然后将分布式可用性组设置为 SQL Server 上的辅助角色,例如以下示例:

--Execute on SQL Server 
USE master
ALTER AVAILABILITY GROUP [<DAGName>] 
SET (ROLE = SECONDARY) 
GO 

接下来,使用链接执行从 SQL 托管实例到 SQL Server 的计划手动故障转移,例如以下示例:

--Execute on SQL Managed Instance 
USE master
ALTER AVAILABILITY GROUP [<DAGName>] FAILOVER 
GO 

证书已过期

用于链接的证书可能会过期。 如果证书过期,则链接会失败。 若要解决此问题, 请轮换证书

测试网络连接

需要 SQL Server 和 SQL 托管实例之间的双向网络连接才能使链接正常工作。 在 SQL Server 端打开端口并在 SQL 托管实例端配置 NSG 规则后,请使用 SQL Server Management Studio(SSMS)或 Transact-SQL 测试连接。

通过在 SQL Server 和 SQL 托管实例上创建临时 SQL 代理作业来测试网络,以检查两个实例之间的连接。 在 SSMS 中使用 网络检查器 时,作业会自动为你创建,并在测试完成后删除。 如果使用 T-SQL 测试网络,则需要手动删除 SQL 代理作业。

注意

目前不支持通过 Linux 上的 SQL Server 上的 SQL Server 代理执行 PowerShell 脚本,因此目前无法从 Linux 上的 SQL Server 上的 SQL Server 代理作业执行 Test-NetConnection

若要使用 SQL 代理测试网络连接,需要满足以下要求:

  • 执行测试的用户必须对 SQL Server 和 SQL 托管实例具有创建作业权限(作为 sysadmin 或属于 的 SQLAgentOperator 角色)msdb
  • SQL Server 代理服务必须在 SQL Server 上运行。 由于代理默认在 SQL 托管实例上处于打开状态,因此无需执行其他操作。

若要在 SSMS 中测试 SQL Server 与 SQL 托管实例之间的网络连接,请执行以下步骤:

  1. 连接到将在 SSMS 中作为主要副本的实例。

  2. 在“对象资源管理器”中,展开数据库,右键单击要链接到辅助副本的数据库。 选择“任务”“Azure SQL 托管实例链接”>“测试连接”以打开“网络检查器”向导>

    SSMS 中“对象资源管理器”的屏幕截图,数据库链接的右键菜单中选择了“测试连接”。

  3. 在“网络检查器”向导的“简介”页上选择“下一步”

  4. 如果满足“先决条件”页上的所有要求,请选择“下一步”。 否则,请解决所有未满足的先决条件,然后选择“重新运行验证”

  5. 登录 页上,选择 登录 以连接到将作为次要副本的另一个实例。 选择“下一步”

  6. 查看 “指定网络选项” 页的详细信息,并在必要时提供 IP 地址。 选择“下一步”

  7. 摘要 页上,查看向导执行的操作,然后选择 完成 以测试两个副本之间的连接。

  8. 查看“结果”页以验证两个副本之间的连接,然后选择 “关闭” 以完成。

谨慎

仅当已验证源环境和目标环境之间的网络连接时,才继续执行后续步骤。 否则,在继续操作之前排查网络连接问题。

有关链接功能的详细信息,请查看以下资源: