SQL 托管实例上用户启动的手动故障转移

适用于:Azure SQL 托管实例

本文介绍如何在 SQL 托管实例常规用途 (GP) 和业务关键 (BC) 服务层级上手动对主节点进行故障转移,以及如何仅在 BC 服务层上对辅助只读副本节点进行手动故障转移。

注意

本文与故障转移组上的跨区域故障转移无关。

何时使用手动故障转移

高可用性是 SQL 托管实例平台的基本功能,其运作对数据库应用程序透明。 当节点性能下降或检测到故障时,或在每月定期软件更新期间,在 Azure 中使用 SQL 托管实例的所有应用程序都会发生从主节点到辅助节点的故障转移。

出于以下原因,你可能会考虑在 SQL 托管实例上执行手动故障转移

  • 在部署到生产环境之前,测试应用程序的故障转移复原能力
  • 测试端到端系统在自动故障转移时的错误复原能力
  • 测试故障转移如何影响现有数据库会话
  • 验证故障转移是否由于网络延迟的变化而更改了端到端性能
  • 在某些情况下,查询性能降低,手动故障转移可帮助减轻性能问题。

注意

在部署到生产环境之前,请确保应用程序具有故障转移复原能力,这有助于降低生产环境中出现应用程序故障的风险,且有助于为客户提高应用程序可用性。

在 SQL 托管实例上启动手动故障转移

所需的 Azure RBAC 权限

初始化故障转移的用户需要具有下列 Azure 角色之一:

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

使用 PowerShell

Az.Sql 的最低版本须为 v2.9.0

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

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

Connect-AzAccount -Environment AzureChinaCloud
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

使用 CLI

请确保安装了最新的 CLI 脚本。

将 az sql mi failover CLI 命令用于以下示例,以启动主节点的故障转移(适用于 BC 和 GP 服务层)。

az sql mi failover -g myresourcegroup -n myinstancename

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

az sql mi failover -g myresourcegroup -n myinstancename --replica-type ReadableSecondary

使用 REST API

对于可能需要对其 SQL 托管实例进行自动故障转移以实现持续测试管道的高级用户,或是自动性能缓冲器,可以通过使用 API 调用启动故障转移来实现此功能。 有关详细信息,请参阅 SQL 托管实例 - 故障转移 REST API

若要使用 REST API 调用启动故障转移,请首先使用所选的 API 客户端生成身份验证令牌。 生成的身份验证令牌将用作 API 请求标头中的授权属性,它是必需的。

以下代码是要调用的 API URI 的示例:

POST https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Sql/managedInstances/{managedInstanceName}/failover?api-version=2019-06-01-preview

需要在 API 调用中传递以下属性:

API 属性 参数
subscriptionId 托管实例所部署到的订阅 ID
resourceGroupName 包含托管实例的资源组
managedInstanceName 托管实例的名称
replicaType (可选)(Primary 或 ReadableSecondary)。 这些参数表示要进行故障转移的副本类型:主要副本或可读辅助副本。 如果未指定,则默认情况下,将在主要副本上初始化故障转移。
api-version 静态值,当前需要为“2019-06-01-preview”

API 将以下列两种方式之一作出响应:

  • 202 已接受
  • 400 请求错误之一。

可通过在响应标头中查看 API 响应来跟踪操作状态。 有关详细信息,请参阅异步 Azure 操作状态

监视故障转移

若要监视用户为你的 BC 实例启动的故障转移的进度,请在你喜欢的客户端(例如 SSMS)中对 SQL 托管实例执行以下 T-SQL 查询。 它将读取系统视图 sys.dm_hadr_fabric_replica_states 并报告实例上可用的副本。 启动手动故障转移后刷新相同的查询。

SELECT DISTINCT replication_endpoint_url, fabric_replica_role_desc FROM sys.dm_hadr_fabric_replica_states

初始化故障转移之前,输出将指示 BC 服务层上的当前主要副本,其中包含 Always On 可用性组中的一个主要副本和三个次要副本。 执行故障转移后,再次运行此查询将需要指示主节点的更改。

在 GP 服务层中,将无法看到与上面所示的 BC 输出相同的输出。 这是因为 GP 服务层只基于单个节点。 可以使用可选的 T-SQL 查询来显示在 GP 服务层实例的节点上启动 SQL 进程的时间:

SELECT sqlserver_start_time, sqlserver_start_time_ms_ticks FROM sys.dm_os_sys_info

在故障转移期间,无论服务层级如何,客户端短暂的连接中断(通常持续不到一分钟)都可以表明正在执行故障转移。

注意

高强度工作负载的情况下,完成故障转移过程(不是实际的短暂不可用性)可能需要几分钟的时间。 这是因为实例引擎在能够进行故障转移之前正在处理主节点上的所有当前事务,并跟进辅助节点。

重要

用户启动的手动故障转移的功能限制如下:

  • 同一 SQL 托管实例上每 15 分钟可以初始化一次 (1) 故障转移。
  • 对于 BC 实例,若要使故障转移请求得到接受,必须存在仲裁副本。
  • 对于 BC 实例,不能指定要在其上启动故障转移的可读辅助副本。
  • 在自动备份系统完成对新数据库的第一次完整备份之前,将不允许进行故障转移。
  • 如果正在进行数据库还原,将不允许进行故障转移。

后续步骤