如何通过REST API在Azure SQL虚拟机上启用SQL Server实例AUTOPROTECT
排查Azure REST API启用SQL自动备份保护的脚本错误
问题概述
通过Azure REST API调用为Azure虚拟机上的SQL Server实例启用自动保护(autoprotect),使用AzureWorkloadSQLAutoProtectionIntent对象编写的PowerShell脚本运行失败,错误信息:
Error:
"code": "BMSUserErrorInvalidInput",
"message": "Input provided for the call is invalid. Please check the required inputs"
已核对所有资源ID并使用最新API版本,需排查脚本问题并获取正确操作步骤。
脚本问题排查
你的脚本存在以下关键问题:
- 请求URL路径错误:启用自动保护的正确路径应为复数形式
backupProtectionIntents,而非原脚本中的单数backupProtectionIntent。 - 请求体字段错误:
- 自动保护针对整个SQL实例,
workloadItemType应设为SQLInstance而非SQLDataBase; - 自动保护场景下无需手动指定
itemId,该字段应移除; - 缺少必填的
protectionLevel字段,需添加值为"Default"的该字段。
- 自动保护针对整个SQL实例,
- JSON序列化深度不足:
ConvertTo-Json默认深度为2,可能导致嵌套对象序列化不完整,需添加-Depth 10参数。
修正后的PowerShell脚本
$url = "https://management.azure.com/Subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.RecoveryServices/vaults/$vaultName/backupFabrics/Azure/backupProtectionIntents/$intentObjectName`?api-version=$apiVersion" # Create Headers $headers = @{ "Authorization" = "Bearer $accessToken" "Content-Type" = "application/json" } # Request Body $parentID = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.SqlVirtualMachine/SqlVirtualMachines/$serverName" $body = @{ "properties" = @{ "backupManagementType" = "AzureWorkload"; "policyId" = $policyId; "protectionIntentItemType" = "AzureWorkloadSQLAutoProtectionIntent"; "sourceResourceId" = $parentID; "workloadItemType" = "SQLInstance"; "protectionLevel" = "Default" } } | ConvertTo-Json -Depth 10 # Invoke Rest Method Invoke-RestMethod -Uri $url -Method PUT -Headers $headers -Body $body
使用REST API启用自动保护的正确步骤
收集必要资源信息
- 订阅ID、资源组名、Recovery Services Vault名称
- SQL虚拟机的资源ID(作为
sourceResourceId) - 备份策略ID(作为
policyId) - 自定义的保护意图对象名称(
intentObjectName)
构造正确请求URL
确保路径使用复数的backupProtectionIntents,并指定最新稳定API版本(如2024-04-01)。构建合规请求体
- 必须设置
backupManagementType为AzureWorkload - 绑定有效的备份策略ID(
policyId) - 指定
protectionIntentItemType为AzureWorkloadSQLAutoProtectionIntent sourceResourceId指向目标SQL虚拟机资源IDworkloadItemType设为SQLInstance- 添加
protectionLevel字段,值为Default
- 必须设置
发送PUT请求
使用有效的Azure AD访问令牌,设置Content-Type为application/json,发送PUT请求到目标URL。验证保护状态
通过GET请求访问同一URL,检查返回结果中的protectionStatus是否为Protected,确认自动保护已生效。
内容的提问来源于stack exchange,提问作者Bruno Josafa
相关产品推荐
相关产品推荐

