我正在使用 Azure.sql powershell 模块,我的目标是故障转移到辅助服务器。我希望它是一个切换,并交换主服务器和辅助服务器,无论它们是哪一次。
Switch-AzSqlDatabaseFailoverGroup cmdlet 需要将成为主资源组和服务器名称。我不知道这些值,但我知道故障转移组的名称。我希望脚本找到辅助服务器,并使用它的服务器名称和资源组。
Get-AzSqlDatabaseFailoverGroup cmdlet 将为我提供有关故障转移组的信息,但它还需要资源组和服务器名称。
如何在只知道名称的情况下获得故障转移组?
可能的解决方法:我还知道同一资源组中应用程序服务的主机名。如果我能找到一种从应用程序服务主机名获取资源组的方法,我可以使用它来查找该资源组中的数据库服务器名称。我不喜欢它,但这个解决方法可以解决我当前的问题。
由于PowerShell Az模块与Graph API交互,所以问题来自于API结构。获取故障转移组的 API URI 如下所示:
GET https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<sqlServerName>/failoverGroups/<failoverGroupName>?api-version=2021-11-01
Az 模块已经有一个登录后假定的订阅上下文,因此它可以使用它来替换 API 调用,但不能替换任何其他字段。
可能的解决方法:我还知道同一资源组中应用程序服务的主机名。如果我能找到一种从应用程序服务主机名获取资源组的方法,我可以使用它来查找该资源组中的数据库服务器名称。我不喜欢它,但这个解决方法可以解决我当前的问题。
这是一个可行的选择。我将编写一个仅使用故障转移组名称的脚本,然后我将向您展示如何使用此应用程序服务资源组来加速我们的脚本。
此脚本会遍历所有 SQL Server,检查与提供的名称匹配的可用故障转移组,并执行故障转移。
# Define failover group name
$FailoverGroupName = "Your-Failover-Group"
# Get all SQL servers within the subscription
$servers = Get-AzSqlServer
# Loop through each server
foreach ($server in $servers) {
# Check if the failover group exists in the current server
$failoverGroup = Get-AzSqlDatabaseFailoverGroup -ResourceGroupName $server.ResourceGroupName -ServerName $server.ServerName -FailoverGroupName $FailoverGroupName -ErrorAction SilentlyContinue
# If failover group is found, break the loop
if ($failoverGroup) {
if ($failovergroup.ReplicationRole -eq "Primary") {
break
}
}
}
# Check if failover group was found
if ($failoverGroup) {
# Perform failover using the failover group details
$secondaryServer = $failoverGroup.PartnerServers[0].ServerName
$secondaryResourceGroup = $failoverGroup.PartnerServers[0].ResourceGroupName
Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $secondaryResourceGroup -ServerName $secondaryServer -FailoverGroupName $FailoverGroupName
} else {
Write-Output "Failover group ('$($FailoverGroupName)'), or primary server for group not found."
}
此脚本获取已知的相邻应用服务计划的资源组名称,以细化 SQL Server 搜索的范围。
# Define failover group name
$FailoverGroupName = "Your-Failover-Group"
# Define App Service Plan name
$AppServiceHostname = "Your-Hostname"
# Get the Resource Group name of the App Service Plan
$aspResourceGroupName = (Get-AzAppServicePlan -Name $AppServiceHostname).ResourceGroup
# Get all SQL servers within the App Service Resource Group
$servers = Get-AzSqlServer -ResourceGroup $aspResourceGroupName
# Loop through each server
foreach ($server in $servers) {
# Check if the failover group exists in the current server
$failoverGroup = Get-AzSqlDatabaseFailoverGroup -ResourceGroupName $server.ResourceGroupName -ServerName $server.ServerName -FailoverGroupName $FailoverGroupName -ErrorAction SilentlyContinue
# If failover group is found, break the loop
if ($failoverGroup) {
if ($failovergroup.ReplicationRole -eq "Primary") {
break
}
}
}
# Check if failover group was found
if ($failoverGroup) {
# Perform failover using the failover group details
$secondaryServer = $failoverGroup.PartnerServers[0].ServerName
$secondaryResourceGroup = $failoverGroup.PartnerServers[0].ResourceGroupName
Switch-AzSqlDatabaseFailoverGroup -ResourceGroupName $secondaryResourceGroup -ServerName $secondaryServer -FailoverGroupName $FailoverGroupName
} else {
Write-Output "Failover group ('$($FailoverGroupName)'), or primary server for group not found."
}