适用于:Azure SQL 数据库
Azure SQL 托管实例
Azure 虚拟机中的 SQL Server
SQL Server enabled by Azure Arc
本文介绍如何执行以下操作:
- 用一个PowerShell脚本审查并转换多个SQL产品到按需付费许可。
- 用 Azure Policy 持续强制执行一种资源类型的按用量付费许可。
本文中的自动化适用于由 Azure Arc 启用的 SQL Server、Azure 虚拟机中的 SQL Server、Azure SQL 数据库 以及 Azure SQL 托管实例。 该脚本还可以处理 Azure 数据工厂 中的 Azure-SSIS 集成运行时(Azure-SSIS IR)。
更改许可协议并不会改变你SQL资源所配置的许可证类型。 本文中的工作流可帮助您在具有软件保障权益的 SQL 许可证、SQL 订阅许可证或服务提供商许可协议 (SPLA) 许可不再适用后,将资源转换为按使用量计费。
先决条件
- 一个有权访问包含 SQL 资源的租户和订阅的 Azure 帐户。
- PowerShell 5 或更高版本,搭配 Az PowerShell 模块。
- 使用 PowerShell 脚本更新 SQL 资源时使用的 Azure CLI。
- 你所修改的每个订阅中的 参与者 角色。 对于最小权限的替代方案,请按 资源类型查看权限。
- 对于计划模式,需要在目标订阅范围内创建角色分配的权限,或者为自动化帐户的托管标识预先分配所需的角色。
- 更改计费设置并确认目标资源的许可条款的权力。
为了避免本地安装工具,可以在 Azure Cloud Shell 中运行脚本。 Cloud Shell 包含 Azure PowerShell 和 Azure CLI,并负责会话认证。 指定 -TenantId 你的账户何时可以访问多个租户。
选择自动化方法
请选择其一:
- PowerShell,用于跨资源转换为即付即用的许可。
- Azure Policy,用于对一种资源类型持续强制执行即付即用模式。
下表详细介绍了每种自动化方法:
| 情景 | 推荐的方法 |
|---|---|
| 查看或应用多个 SQL 资源类型的即用即付更改 | manage-payg-transition.ps1 |
| 将订阅或租户中所有受支持的资源转换为即用即付许可 | manage-payg-transition.ps1 |
| 按定期计划运行即付即用的转换 | 计划模式下的 manage-payg-transition.ps1 |
| 持续强制实施针对一种资源类型的即用即付许可,并修正偏差 | 特定于资源的 Azure Policy 示例 |
| 手动更改一个资源 | 产品特定授权条款 |
请审核支持的资源和许可价值
本文中的步骤将 -TargetLicenseType 设置为 PAYG。 脚本将该值转换为每个资源提供者所需的现用付费值。 源值显示了过渡可以替换的常见许可证配置。
| 资源 | 按需付费目标值 | 共同源值 | 由脚本支持 | Azure Policy 示例 |
|---|---|---|---|---|
| 由Azure Arc启用的SQL Server | PAYG |
Paid、LicenseOnly |
是的 | Arc 支持的 SQL Server 许可证类型合规性 |
| Azure 虚拟机中的 SQL Server | PAYG |
AHUB |
是的 | Azure 虚拟机上的 SQL Server 许可证类型合规性 |
| Azure SQL 数据库和弹性池 | LicenseIncluded |
BasePrice |
是的 | Azure SQL 数据库 许可证类型合规性 |
| Azure SQL 托管实例和实例池 | LicenseIncluded |
BasePrice、HybridFailoverRights |
是的 | SQL 托管实例 许可证类型合规 |
| Azure-SSIS IR | LicenseIncluded |
BasePrice |
是的 | 本文未涵盖 |
策略示例可以覆盖其他源值,例如 Azure VM 上的 SQL Server 的 DR。 在部署策略分配前,请先审查所选样本。
理解PowerShell脚本的工作原理
你可以用PowerShell脚本修改资源组内的所有资源、订阅内的所有资源,以及整个租户中一个或多个订阅之间的所有资源。
该脚本自包含,能够跨支持的 SQL 资源运行。 当 -TargetLicenseType 设置为默认 PAYG值时,该值转换为每种资源类型所需的按需付费值,如 查看支持资源和许可值所示。
默认情况下,生成的工作文件夹在脚本结束后依然保留。 要在运行后移除该标记,请指定 -cleanDownloads $true。
脚本按资源类型打印摘要,并列出每个失败或跳过资源的原因。 当脚本找到匹配的资源时,它还会生成一份带有 UpdateResult 和 UpdateError 列的 ModifiedResources_<timestamp>.csv 报告。
以下参数控制脚本的范围和执行:
| 参数 | 接受值或默认值 | Purpose |
|---|---|---|
-Target |
Arc,或 AzureBoth (默认) |
选择已启用 Azure Arc 的 SQL Server 资源、Azure SQL 资源和 Azure-SSIS IR,或同时选择两组。 |
-RunMode |
Single (默认值) 或 Scheduled |
运行一次过渡,或配置每日 Azure 自动化 运行手册。 |
-TargetLicenseType |
PAYG |
本文选择按需付费作为相关程序的目标许可模式。 |
-targetSubscription |
订阅 ID;默认显示租户中所有可访问的订阅 | 将过渡限制为仅限一个订阅。 |
-targetResourceGroup |
资源组名称;默认所有资源组 | 将过渡限制为一个资源组。 |
-TenantId |
租户ID;默认为当前Az PowerShell上下文 | 选择 Microsoft Entra 租户。 |
-ReportOnly |
Switch;默认被禁用 | 列出符合条件的资源,而不对其进行更改。 |
-WaitForCompletion |
Switch;默认被禁用 | 等待提交的更改达到终止状态(如果支持)。 |
-UsePcoreLicense |
No (默认值) 或 Yes |
控制由Azure Arc启用的SQL Server物理核心许可。 |
-AutomationAccResourceGroupName |
需与 -RunMode Scheduled 配合使用 |
选择自动化账户的资源组。 |
-AutomationAccountName |
aaccAzureArcSQLLicenseType 默认 |
设置自动化帐户名称。 |
-Location |
需搭配 -RunMode Scheduled |
为自动化帐户和资源组选择 Azure 区域。 |
-cleanDownloads |
$false (默认值) 或 $true |
脚本完成后会移除生成的工作文件夹。 |
默认执行行为取决于资源类型:
| 资源 | 默认行为 | 有 -WaitForCompletion |
|---|---|---|
| Azure SQL 数据库,Azure SQL 托管实例 | 提交异步请求并报告 RequestSubmitted |
等待并报告 Updated |
| 由Azure Arc启用的SQL Server | 提交扩展程序的异步更新并报告 RequestSubmitted |
轮询扩展程序并报告 Succeeded、Failed 或 TimedOut |
| Azure 虚拟机中的 SQL Server | 提交直接的 Azure 资源管理器 请求和报告RequestSubmitted |
运行 az sql vm 更新、等待和报告 Updated |
| Azure-SSIS IR | 等待与报告 Updated |
同样的行为 |
预览即用即付过渡流程
该manage-payg-transition.ps1脚本为Azure SQL和SQL Server提供了一个入口点,这些入口由Azure Arc资源支持。
使用PowerShell脚本,你可以指定一个订阅来扫描。 如果你没有指定订阅,脚本会扫描你的职位能访问的所有订阅。
下载脚本:
$scriptUri = "https://raw.githubusercontent.com/microsoft/sql-server-samples/master/samples/manage/manage-payg-transition/manage-payg-transition.ps1" Invoke-WebRequest -Uri $scriptUri -OutFile ".\manage-payg-transition.ps1"登录到包含资源的租户:
Connect-AzAccount -TenantId "<tenant-id>"为单一订阅运行只读预览。 即使你已经有 Azure 上下文,也要指定
-TenantId,这样脚本不会使用错误的租户:.\manage-payg-transition.ps1 ` -Target Both ` -TenantId "<tenant-id>" ` -targetSubscription "<subscription-id>" ` -TargetLicenseType PAYG ` -ReportOnly如果脚本找到匹配的资源,打开最新的
ModifiedResources_<timestamp>.csv报告。 确认所有列出的资源都应该发生变化:$report = Get-ChildItem -Filter "ModifiedResources_*.csv" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 Import-Csv $report.FullName | Format-Table
已经使用按用量付费许可的资源不会出现在报告中。 如果脚本找不到匹配的资源,它就不会生成CSV文件。 为了缩小范围,指定 -targetResourceGroup。 将-Target设置为Azure以处理 Azure SQL 资源和 Azure-SSIS IR。 将其设置为 Arc,以便仅处理已启用 Azure Arc 的 SQL Server 资源。
用PowerShell执行一次性按需付费的过渡
只有在确认目标范围并批准预览报告中的所有资源后,才执行按用付费过渡。
删除
-ReportOnly,并添加-WaitForCompletion以在资源提供程序支持的情况下等待已确认的结果:.\manage-payg-transition.ps1 ` -Target Both ` -TenantId "<tenant-id>" ` -targetSubscription "<subscription-id>" ` -TargetLicenseType PAYG ` -WaitForCompletion请查看生成的CSV报告。 调查每个
Failed或TimedOut结果,并确认每项已提交更改的资源状态。
PAYG 值将目标许可模式设置为即用即付。
如果省略 -WaitForCompletion,大多数已接受的更改的 UpdateResult 为 RequestSubmitted。 这个结果意味着 Azure 接受了请求,而不是许可证类型已经完成更改。 Azure-SSIS IR 总是等待,因为它的更新命令不支持异步执行。
使用 PowerShell 安排定期的即付即用转换
计划模式为每个选定目标创建或更新一个 Azure 自动化 运行手册,将每个运行手册与每日计划绑定,并立即启动一次性作业。 指定自动化帐户所在的资源组和 Azure 区域。 默认的自动化账户名称是 aaccAzureArcSQLLicenseType。 计划模式使用自动化账户的托管标识。
为一个订阅中的 Azure SQL 以及由 Azure Arc 启用的 SQL Server 资源安排转换:
.\manage-payg-transition.ps1 ` -Target Both ` -RunMode Scheduled ` -TenantId "<tenant-id>" ` -targetSubscription "<subscription-id>" ` -TargetLicenseType PAYG ` -AutomationAccResourceGroupName "<automation-resource-group>" ` -AutomationAccountName "<automation-account>" ` -Location "<azure-region>"在自动化帐户中,确认运行簿已发布、已链接到每日计划,并且能够使用所选参数启动作业。
如果 Azure 目标包含 SQL 托管实例池,请向自动化帐户的托管标识分配 参与者 角色,或分配具有 Microsoft.Sql/instancePools/read 和 Microsoft.Sql/instancePools/write 的自定义角色。 计划设置并没有分配一个内置角色来授予这些权限。
用 Azure Policy 强制执行按用付费许可
使用资源特定的 Azure Policy 示例来持续强制执行按需付费许可并修复配置漂移问题。 每个示例包含策略定义、部署脚本和修复脚本。
Warning
策略赋值可以更改其作用域内所有匹配的资源。 从范围较窄的测试订阅开始,只选择你打算替换的当前许可证类型。
下表链接了每个资源的策略包和部署脚本:
| 资源 | 策略包 | 部署脚本 |
|---|---|---|
| 由Azure Arc启用的SQL Server | Arc 支持的 SQL Server 许可证类型合规性 | deployment.ps1 |
| Azure 虚拟机中的 SQL Server | Azure 虚拟机上的 SQL Server 许可证类型合规性 | deployment.ps1 |
| Azure SQL 托管实例 | SQL 托管实例 许可证类型合规 | deployment.ps1 |
| Azure SQL 数据库 | Azure SQL 数据库 许可证类型合规性 | deployment.ps1 |
使用所选资源类型对应的值和角色:
| 资源 | 按需付费目标值 | 可被覆盖的源值 | 主要必需角色 | 重要限制 |
|---|---|---|---|---|
| 由Azure Arc启用的SQL Server | PAYG |
Paid;门户定义还支持 LicenseOnly |
Azure Extension for SQL Server Deployment | 该分配会将同一个目标应用于所有匹配的主机,且不区分版本。 将混合地产单独划定范围。 |
| Azure 虚拟机中的 SQL Server | PAYG |
AHUB、DR |
虚拟机贡献者 | 目标必须满足 Azure 混合权益 或被动高可用性或灾难恢复(HA/DR)许可条件。 |
| Azure SQL 托管实例 | LicenseIncluded |
BasePrice、HybridFailoverRights |
SQL 托管实例参与者 |
HybridFailoverRights 将 licenseType 设置为 BasePrice,并将 hybridSecondaryUsage 设置为 Passive。 |
| Azure SQL 数据库 | LicenseIncluded |
BasePrice |
SQL DB 参与者 | 该政策不适用于 master 和基本数据库。 Azure SQL 数据库 仅支持对预配 vCore 数据库更改许可类型,因此应将其他基于数据库事务单位(DTU)的数据库和无服务器数据库排除在分配范围之外。 |
每项分配还需要 读者 和 资源策略参与者。 当登录身份有权限创建角色分配时,部署脚本会授予所需的角色。 使用 -GrantMissingPermissions 配合修复脚本来检查并添加缺失的角色。
当目标值需要许可证明时,SQL VM、SQL 托管实例 和 SQL Database 部署脚本会提示确认。
-SkipLicenseConfirmation仅在运营商已确认资格并承担合规责任的自动化管道中使用。
对于已启用 Arc 的 SQL Server,PAYG 策略还会配置周期性计费同意设置。 如果后续分配将许可类型从 PAYG 更改为其他类型,则扩展上仍保留同意状态。
策略包使用共享的部署流程:
按照其 README 中的说明下载该软件包的
policy和scripts文件夹。登录到包含分配范围的租户:
Connect-AzAccount -TenantId "<tenant-id>"从下载的包文件夹中部署定义和赋值。 使用上表中与你的资源类型对应的按需付费目标值。 以下示例在订阅范围内分配了该策略:
.\scripts\deployment.ps1 ` -SubscriptionId "<subscription-id>" ` -TargetLicenseType "<pay-as-you-go-value>"如果你省略
-SubscriptionId了 ,脚本将使用管理组的作用域。 在运行部署前,先检查一下包的默认设置。确认策略分配具有系统分配的管理身份以及分配范围内所需的角色。
开始对现有不合规资源进行修复:
.\scripts\start-remediation.ps1 ` -SubscriptionId "<subscription-id>" ` -TargetLicenseType "<pay-as-you-go-value>" ` -GrantMissingPermissions在 Azure Policy 中,查看任务的合规结果和修复任务。 然后确认已修复资源的许可证类型。
确认向按需付费模式的转换
CSV报告中每个选定资源都包含一个 UpdateResult 和一个 UpdateError 。 常见结果的解释如下:
| Result | Meaning | 后续操作 |
|---|---|---|
ReportOnly |
脚本在只读模式下识别了一个合格资源,没有提交更改。 | 在执行转换之前,请确认该资源应使用即用即付许可。 |
RequestSubmitted |
Azure 接受了异步请求。 | 等待资源操作完成,然后验证资源状态。 |
Updated 或 Succeeded |
脚本观察到成功的终止结果。 | 请确认资源上的许可证类型。 |
Failed |
服务拒绝了更新或返回了失败的终端状态。 | 检查 UpdateError,更正问题,然后重新运行预览。 |
TimedOut |
Arc扩展在投票限制前未达到终端状态。 | 检查扩展程序状态。 更新可能会在脚本停止等待后完成。 |
要确认Azure Arc启用的SQL Server当前许可证类型和配置状态,请运行以下Azure Resource Graph查询:
Search-AzGraph -Query @"
resources
| where type =~ 'microsoft.hybridcompute/machines/extensions'
| where properties.type in~ ('WindowsAgent.SqlServer', 'LinuxAgent.SqlServer')
| project name = split(id, '/')[8],
licenseType = properties.settings.LicenseType,
state = properties.provisioningState
"@
已提交的操作完成后,使用 -ReportOnly 重新运行相同的作用域:
.\manage-payg-transition.ps1 `
-Target Both `
-TenantId "<tenant-id>" `
-targetSubscription "<subscription-id>" `
-TargetLicenseType PAYG `
-ReportOnly
该脚本会排除已使用即用即付许可的资源。 完全融合的范围报告没有资源可更新。 在你认为过渡完成之前,先调查任何仍然存在的资源。
审查限制和计费保障
- Azure 虚拟机上的 SQL Server 必须正在运行。 脚本跳过已停止或解除分配的虚拟机,也不会启动它们。
- 该脚本在使用
DRAzure 许可证类型的虚拟机中排除 SQL Server,因此不会覆盖被动 HA/DR 副本的许可证设置。 - 该脚本不提供其内嵌 Arc 处理程序中的周期性扣费同意选项。 对于需要定期计费同意的CSP管理的Arc资源,请使用Arc支持的SQL Server许可类型合规策略,该策略在适用
PAYG时配置同意。 - 默认的异步运行优先考虑可扩展性,而非即时确认。 当你需要脚本在退出前查看终端结果时,请使用
-WaitForCompletion。 - 默认情况下,SQL Server在Azure虚拟机更新时使用异步Azure 资源管理器请求。 如果请求失败,脚本会退回到
az sql vm update,等待操作完成。
排查自动化故障
利用生成的报告和 Azure 操作状态来识别未更新的资源。
- 如果报告是空的,确认租户、订阅和资源组。 当所有纳入范围的资源都已使用即用即付许可时,报告应为空。
- 如果某个已启用 Arc 的资源被跳过,请恢复 Azure Connected Machine 代理的连接,确认 SQL Server 的 Azure 扩展的预配状态为
Succeeded,然后重新运行预览。 - 如果
UpdateResult是RequestSubmitted,不要把请求视为完成。 检查资源状态,或者在 Azure 操作结束后重新运行预览。 - 如果 Azure SQL 或 Azure VM 上的 SQL Server 的某项操作失败,请确认已安装 Azure CLI,并且已登录到同一租户,且拥有目标订阅的访问权限。
- 如果调度模式失败,请确认自动化账户的管理身份是否包含源样本中列出的角色。
- 如果策略修正返回
PolicyAuthorizationFailed,请确认分配标识在分配范围内拥有产品特定角色、读取者和资源策略参与者角色。 重新运行部署脚本,或者在登录标识能够创建角色分配后使用-GrantMissingPermissions重新运行修正脚本。
完整来源请参见 manage-payg-transition.ps1。 有关当前限制和测试结果,请参见测试计划。manage-payg-transition.ps1
按资源类型划分的权限
PowerShell脚本的权限
贡献者角色是本文脚本所需权限的超集,是最简单的选项。 为了实现最小权限访问,请分配指定范围内资源类型所需的角色:
| 资源类型 | 角色或所需权限 |
|---|---|
| Azure 虚拟机中的 SQL Server | 虚拟机贡献者 |
| Azure SQL 托管实例 | SQL 托管实例 贡献者 |
| Azure SQL 数据库 | SQL DB 参与者 |
| Azure SQL 数据库弹性池 | SQL Server 参与者 |
| Azure SQL 托管实例池 |
贡献者,或带有 Microsoft.Sql/instancePools/read 和 Microsoft.Sql/instancePools/write 的自定义角色 |
| 由Azure Arc启用的SQL Server | Azure连接的计算机资源管理员 |
| Azure-SSIS IR | 数据工厂参与者 |
| 阅读与列举订阅及资源 | 读取器,除非其他分配的角色赋予所需的读取权限 |
Azure Policy 的权限
运行 deployment.ps1 的身份需要权限在所选管理组创建策略定义,并在分配范围内创建策略分配、修复任务、管理身份和角色分配。 如果无法创建角色分配,请在开始修正之前为策略分配的托管标识分配所需角色,然后使用 -SkipManagedIdentityRoleAssignment 运行 deployment.ps1。
默认情况下,deployment.ps1 会为策略分配创建一个系统分配的托管标识,并在分配范围内授予三个角色。 产品特定的角色取决于所选政策样本:
| 政策示例 | 产品特定角色 |
|---|---|
| 由Azure Arc启用的SQL Server | Azure Extension for SQL Server Deployment |
| Azure 虚拟机中的 SQL Server | 虚拟机贡献者 |
| Azure SQL 托管实例 | SQL 托管实例参与者 |
| Azure SQL 数据库 | SQL DB 参与者 |
每个策略分配标识还需要被授予 Reader 和 Resource Policy Contributor。 部署脚本只有在指定 -SkipManagedIdentityRoleAssignment时才跳过自动分配角色。
在开始修复前, start-remediation.ps1 检查所有三个必要角色的策略分配身份。 如果缺少一个角色,剧本就会停止。 手动分配角色,或者用一个身份来重新运行修复脚本 -GrantMissingPermissions ,该身份可以在分配范围内创建角色分配。