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

使用用户启动的手动故障转移重启实例 - Azure SQL 托管实例

适用于:Azure SQL 托管实例

本文介绍如何通过使用 PowerShell、Azure CLI 或 REST API 执行手动用户启动的故障转移来重启 Azure SQL 托管实例

可以对“常规用途”(GP) 和“业务关键”(BC) 服务层级中的主要节点进行故障转移,并且可以手动对 BC 服务层级中的辅助只读副本节点进行故障转移。

本文中的故障转移是指重启 SQL Server 数据库引擎进程,与 故障转移组的跨区域故障转移无关。

何时使用手动故障转移

可用性是 SQL 托管实例平台的基本组成部分,它通过提供本地备用计算节点来托管 SQL Server 数据库引擎进程,它的工作对于数据库应用程序是透明的。 当 SQL Server 数据库引擎进程先脱机,然后又在同一个或另一个计算节点上联机时,就会发生故障转移。 通常,当检测到故障、节点降级或进行服务更新时,Azure 平台会自动管理故障转移。

整个故障转移作包括使 SQL Server 数据库引擎进程联机、验证数据库状态,最后将客户端连接重定向到新的 SQL 进程。 在故障转移操作的最后一步中,客户端连接仅会失败很短的时间(通常不到一分钟)。

你可能会因为以下原因执行手动故障转移以重启引擎进程:

  • 登录失败,或由于性能问题导致速度缓慢。
  • 在部署到生产之前测试应用程序的故障转移复原能力。
  • 测试端到端系统在自动故障转移时的错误复原能力。
  • 测试故障转移如何影响现有数据库会话。
  • 查询性能下降(重启实例有助于缓解性能问题)。

在部署到生产环境之前,请确保应用程序具有故障转移复原能力,这有助于降低生产环境中出现应用程序故障的风险,且有助于为客户提高应用程序可用性。 通过以下视频了解有关测试应用程序的云就绪情况的详细信息:

下表描述了故障转移操作期间基于服务层和可用性模型的 SQL 托管实例预期行为:

服务层 可用性模型 预期的故障转移行为 潜在的故障转移行为(异常)
常规用途 区域冗余
(单一可用性区域)
SQL 进程在同一 VM 上重启。 SQL 进程在不同的 VM 上重启。
常规用途 区域冗余
(多个可用性区域)
SQL 进程在同一 VM 上重启。 SQL 进程在不同的 VM 上重启。
业务关键 区域冗余
(单一可用性区域)
SQL 进程在主要副本上重启,或者随机辅助副本提升为主要副本。 不适用
业务关键 区域冗余
(多个可用性区域)
SQL 进程在主要副本上重启,或者随机辅助副本提升为主要副本,无论是在相同的还是不同的可用性区域。 不适用

权限

启动故障转移的用户需要具有以下 Azure 角色之一:

  • “订阅所有者”角色或
  • SQL 托管实例参与者角色或
  • 具有以下权限的自定义角色:
    • Microsoft.Sql/managedInstances/failover/action

使用手动故障转移重启实例

可以使用 PowerShell、Azure CLI 或 REST API 通过手动故障转移重启实例。

Az.Sql 的最低版本须为 v2.9.0。 请考虑使用 Azure 门户中的 Azure Cloud Shell,其中始终提供最新的 PowerShell 版本。

作为一项先决条件,请使用以下 PowerShell 脚本来安装所需的 Azure 模块。 此外,请选择要进行故障转移的 SQL 托管实例所在的订阅。

$subscription = 'enter your subscription ID here'
Install-Module -Name Az
Import-Module Az.Accounts
Import-Module Az.Sql

Connect-AzAccount
Select-AzSubscription -SubscriptionId $subscription

将 PowerShell 命令 Invoke-AzSqlInstanceFailover 与以下示例结合使用以启动主节点的故障转移(适用于 BC 和 GP 服务层)。

$ResourceGroup = 'enter resource group of your MI'
$ManagedInstanceName = 'enter MI name'
Invoke-AzSqlInstanceFailover -ResourceGroupName $ResourceGroup -Name $ManagedInstanceName

使用以下 PowerShell 命令对可读辅助节点进行故障转移(仅适用于 BC 服务层级)。

$ResourceGroup = 'enter resource group of your MI'
$ManagedInstanceName = 'enter MI name'
Invoke-AzSqlInstanceFailover -ResourceGroupName $ResourceGroup -Name $ManagedInstanceName -ReadableSecondary

监视故障转移

“业务关键”服务层级和“常规用途”服务层级中的实例在监视用户启动的故障转移的进度时有所不同。

若要监视用户启动的故障转移的进度,请按以下方式操作:

  • sys.dm_os_sys_info,用于检查常规用途服务层级的系统运行时间。
  • 使用 sys.dm_hadr_fabric_replica_states 检查“业务关键”服务层级的可用副本。

故障转移过程的最后一步是将客户端连接重定向到新的主节点。 在故障转移期间,无论服务层级如何,客户端短暂的连接中断(通常持续不到一分钟)都表明故障转移已成功。

“常规用途”服务层级

以下 T-SQL 示例显示了常规用途服务层级节点上 SQL 进程的运行时间:

SELECT sqlserver_start_time, sqlserver_start_time_ms_ticks FROM sys.dm_os_sys_info

SQL 进程启动时间是 SQL Server 数据库引擎进程在节点上启动的时间,每次故障转移后都会进行更新。 在“常规用途”服务层级中启动实例的故障转移之前和之后运行此查询,以监视故障转移操作的进度。

“业务关键”服务层级

以下 T-SQL 示例指示哪个节点当前是“业务关键”服务层级的主要副本:

SELECT DISTINCT replication_endpoint_url, fabric_replica_role_desc FROM sys.dm_hadr_fabric_replica_states

故障转移完成后,托管主副本的节点将发生更改。 在“业务关键”服务层中启动实例故障转移之前和之后运行此查询,以监视故障转移操作的进度。

注意

整个故障转移过程在高强度工作负载期间可能需要几分钟才能完成,因为实例引擎确保在启动故障转移之前,辅助节点上的事务能够追赶上主节点上的事务。

限制

请考虑用户启动的手动故障转移的以下功能限制:

  • 每 15 分钟在同一 SQL 托管实例上只能启动一 (1) 次故障转移
  • 以下情况不允许进行故障转移:
    • 在自动备份系统完成新数据库的第一次完全备份之前。
    • 正在进行数据库还原。
  • 对于“业务关键”服务层级中的实例:
    • 在故障转移请求获得接受之前,副本必须具有仲裁。
    • Invoke-AzSqlInstanceFailover 命令会对主要副本进行故障转移,除非指定了 -ReadableSecondary,在指定了此项的情况下,可读辅助副本会进行故障转移。 发出该命令时,不可读辅助副本不会进行故障转移。