你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于:Azure SQL 数据库
Azure SQL 托管实例
Azure SQL 数据库优化建议由 Azure SQL 数据库自动优化生成。 此解决方案持续监视和分析数据库的工作负载,为与索引创建、索引删除和查询执行计划优化相关的每个数据库提供自定义优化建议。
Azure SQL 数据库自动优化建议可在 Azure 门户中查看,使用 REST API 调用或通过 T-SQL 和 PowerShell 命令可以进行检索。 本文立足于使用 PowerShell 脚本检索自动优化建议。
注意
本文使用 Azure Az PowerShell 模块,这是与 Azure 交互时推荐使用的 PowerShell 模块。 若要开始使用 Az PowerShell 模块,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az。
重要
PowerShell Azure 资源管理器(AzureRM)模块已于 2024 年 2 月 29 日弃用。 所有未来的开发都应使用 Az.Sql 模块。 建议用户从 AzureRM 迁移到 Az PowerShell 模块,以确保持续支持和更新。 不再维护或支持 AzureRM 模块。 Az PowerShell 模块和 AzureRM 模块中命令的参数基本相同。 有关兼容性的详细信息,请参阅 介绍新的 Az PowerShell 模块。
自动发送有关自动优化建议的电子邮件通知
以下解决方案可自动发送包含自动优化建议的电子邮件通知。 所述解决方案包括使用 Azure 自动化自动执行 PowerShell 脚本以检索优化建议,以及使用 Microsoft Power Automate 自动计划电子邮件的发送作业。
创建 Azure 自动化帐户
要使用 Azure 自动化,第一步是创建自动化帐户并使用 Azure 资源配置该帐户,以用于 PowerShell 脚本的执行。 若要了解有关 Azure 自动化及其功能的详细信息,请参阅 Azure 自动化入门。
请通过从 Azure 市场选择和配置自动化应用的方法,执行以下步骤来创建 Azure 自动化帐户:
登录到 Azure 门户。
在资源菜单中选择 + 创建资源 。
搜索“自动化”。
在搜索结果中选择 Automation 应用程序。
进入“创建自动化帐户”窗格后,选择 “创建”。
选择要用于 PowerShell 脚本执行的订阅和资源组。 输入此自动化帐户的名称。
选择“高级”。 验证是否选中 了 System assigned (系统分配 ),以便创建系统分配的托管标识 (SAMI) 以对 Azure 资源进行身份验证。
选择“标记”。 考虑使用 Azure 标记。 例如,用于确定资源创建者的“所有者”或“创建者”标记,以及确定此系统是生产环境还是开发环境等的“环境”标记。有关详细信息,请参阅为 Azure 资源开发命名和标记策略。
选择“查看 + 创建”。
通过选择 Create 完成自动化帐户的创建。
将 Azure 角色分配给系统分配的托管标识帐户
自动化帐户可以使用其系统分配的托管标识来获取令牌,以访问受 Microsoft Entra ID 保护的其他资源,例如 Azure SQL 数据库。 这些令牌不代表应用程序的任何特定用户。 它们代表访问资源的应用程序。 例如,在本例中,令牌表示自动化帐户。
在创建 Azure 自动化 Runbook 之前,请务必遵循最低特权原则向自动化帐户授予适当级别的权限。 使用系统分配的托管标识时,将 SQL DB 参与者和SQL Server 参与者 角色添加到 SAMI 就足以自动执行 Azure SQL 数据库任务。 在大多数情况下,如果您的自动化仅针对特定数据库,请使用资源组级别范围。 如果它必须在整个订阅中运行,请使用订阅级别范围。
以下示例使用 Azure PowerShell 将当前订阅中的 SQL DB 参与者 角色分配给系统分配的托管标识帐户。
$roleAssignmentParams = @{
ObjectId = "<automation-Identity-object-id>"
Scope = "/subscriptions/<subscription-id>"
RoleDefinitionName = "SQL DB Contributor"
}
New-AzRoleAssignment @roleAssignmentParams
若要从 Azure 门户中将这些角色添加到系统分配的托管标识,请执行以下步骤:
- 登录到 Azure 门户。
- 找到新创建的 Azure 自动化帐户。
- 在 Account Settings (账户设置) 下,选择 Identity (身份)。
- 在 “权限” 下,选中 “Azure 角色分配 ” 框。
- 选择添加角色分配(预览版)。
- 在 Scope 下拉列表中,选择角色分配适用的资源集 - Subscription (订阅)、Resource group (资源组)、Role (角色) 和 Scope(范围)。
- 在 Role (角色) 下拉列表中,选择一个角色作为 SQL DB Contributor (SQL 数据库参与者)。
- 选择“保存”。
重复 Add role assignment 步骤中的步骤,以添加 SQL Server Contributor 角色。
提示
创建自动化应用时,请完全按照输入内容记录 Azure 自动化帐户名称、订阅 ID 和资源(如复制粘贴到记事本)。 稍后需要使用此信息。
如果要为多个 Azure 订阅生成相同的自动化,则需要为其他订阅重复此过程。
更新 Azure 自动化模块
检索自动优化建议的 PowerShell 脚本使用 Get-AzResource 和 Get AzSqlDatabaseRecommendedAction 命令,为此需要 Azure 模块版本 4 和更高版本。
- 若要更新 Azure 模块,请参阅 Azure 自动化中的 Az 模块支持。
创建 Azure 自动化 Runbook
下一步是的 Azure 自动化中创建 Runbook,用于检索优化建议的 PowerShell 脚本也会驻留在 Azure 自动化中。
请按照以下步骤创建新的 Azure 自动化 Runbook:
- 访问上一步中创建的 Azure 自动化帐户。
- 进入自动化帐户窗格后,选择左侧的 Runbooks 菜单项,以使用 PowerShell 脚本创建新的 Azure 自动化 Runbook。 若要详细了解如何创建自动化 Runbook,请参阅创建新的 Runbook。
- 要添加新的 Runbook,请选择 +Add a runbook (+添加运行手册 ) 菜单选项,然后选择 Quick create – create a new runbook (快速创建 – 创建新运行手册)。
- 在 Runbook 窗格中,键入 Runbook 的名称(在本例中,使用 AutomaticTuningEmailAutomation ),选择 Runbook 的类型作为 PowerShell,并编写此 Runbook 的说明以描述其用途。
- 选择 Create (创建 ) 以完成新 Runbook 的创建。
请按照以下步骤在创建的 runbook 中加载 PowerShell 脚本:
- 在 Edit PowerShell Runbook (编辑 PowerShell Runbook ) 窗格中,选择菜单树上的 RUNBOOKS 并展开视图,直到看到 Runbook 的名称(在此示例中 为 AutomaticTuningEmailAutomation)。 选择此 runbook。
- 在“编辑 PowerShell Runbook”的第一行(从数字 1 开始)中,复制粘贴以下 PowerShell 脚本代码。 此 PowerShell 脚本按原样提供,可帮助你入门。 修改脚本以满足需求。
在提供的 PowerShell 脚本的标头中,需要使用 Azure 订阅 ID 替换 <SUBSCRIPTION_ID_WITH_DATABASES>
。 要了解如何检索 Azure 订阅 ID,请参阅 Getting your Azure Subscription GUID(获取 Azure 订阅 GUID)。
如果有多个订阅,则可将它们以逗号分隔的形式添加到脚本头中的“$subscriptions”属性。
# PowerShell script to retrieve Azure SQL Database automatic tuning recommendations.
#
# Provided "as-is" with no implied warranties or support.
# The script is released to the public ___domain.
#
# Replace <SUBSCRIPTION_ID_WITH_DATABASES> in the header with your Azure subscription ID.
#
# Microsoft Azure SQL Database team, 2018-01-22.
# Set subscriptions : IMPORTANT – REPLACE <SUBSCRIPTION_ID_WITH_DATABASES> WITH YOUR SUBSCRIPTION ID
$subscriptions = ("<SUBSCRIPTION_ID_WITH_DATABASES>", "<SECOND_SUBSCRIPTION_ID_WITH_DATABASES>", "<THIRD_SUBSCRIPTION_ID_WITH_DATABASES>")
# Get credentials
$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Connect-AzAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint
# Define the resource types
$resourceTypes = ("Microsoft.Sql/servers/databases")
$advisors = ("CreateIndex", "DropIndex");
$results = @()
# Loop through all subscriptions
foreach ($subscriptionId in $subscriptions) {
Select-AzSubscription -SubscriptionId $subscriptionId
$rgs = Get-AzResourceGroup
# Loop through all resource groups
foreach ($rg in $rgs) {
$rgname = $rg.ResourceGroupName;
# Loop through all resource types
foreach ($resourceType in $resourceTypes) {
$resources = Get-AzResource -ResourceGroupName $rgname -ResourceType $resourceType
# Loop through all databases
# Extract resource groups, servers and databases
foreach ($resource in $resources) {
$resourceId = $resource.ResourceId
if ($resourceId -match ".*RESOURCEGROUPS/(?<content>.*)/PROVIDERS.*") {
$ResourceGroupName = $matches['content']
}
else {
continue
}
if ($resourceId -match ".*SERVERS/(?<content>.*)/DATABASES.*") {
$ServerName = $matches['content']
}
else {
continue
}
if ($resourceId -match ".*/DATABASES/(?<content>.*)") {
$DatabaseName = $matches['content']
}
else {
continue
}
# Skip if master
if ($DatabaseName -eq "master") {
continue
}
# Loop through all automatic tuning recommendation types
foreach ($advisor in $advisors) {
$recs = Get-AzSqlDatabaseRecommendedAction -ResourceGroupName $ResourceGroupName -ServerName $ServerName -DatabaseName $DatabaseName -AdvisorName $advisor
foreach ($r in $recs) {
if ($r.State.CurrentValue -eq "Active") {
$object = New-Object -TypeName PSObject
$object | Add-Member -Name 'SubscriptionId' -MemberType Noteproperty -Value $subscriptionId
$object | Add-Member -Name 'ResourceGroupName' -MemberType Noteproperty -Value $r.ResourceGroupName
$object | Add-Member -Name 'ServerName' -MemberType Noteproperty -Value $r.ServerName
$object | Add-Member -Name 'DatabaseName' -MemberType Noteproperty -Value $r.DatabaseName
$object | Add-Member -Name 'Script' -MemberType Noteproperty -Value $r.ImplementationDetails.Script
$results += $object
}
}
}
}
}
}
}
# Format and output results for the email
$table = $results | Format-List
Write-Output $table
选择 Save 以保存脚本。 如果对脚本感到满意,请选择 Publish (发布 ) 以发布此 Runbook。
在主 Runbook 窗格中,您可以选择 Start (启动 ) 以 测试 脚本。 选择 Output (输出 ) 以查看执行的脚本的结果。 此输出将是电子邮件的内容。
确保通过根据需求自定义 PowerShell 脚本来调整内容。
通过上述步骤,Azure 自动化中已加载用于检索自动优化建议的 PowerShell 脚本。 下一步是自动化和计划电子邮件发送作业。
使用 Microsoft Power Automate 自动化电子邮件作业
要完成作为最后一步的该解决方案,请在 Microsoft Power Automate 中创建包含三个操作(作业)的自动化流:
- Azure 自动化 - 创建作业 – 用于执行 PowerShell 脚本以检索 Azure 自动化 Runbook 中的自动优化建议。
- Azure 自动化 - 获取作业输出 - 用于从执行的 PowerShell 脚本中检索输出。
- Office 365 Outlook – 发送电子邮件 – 用于发送电子邮件。 电子邮件使用创建此流的个人的工作或学校帐户发送。
要了解有关 Microsoft Power Automate 功能的详细信息,请参阅 Microsoft Power Automate 入门。
此步骤的先决条件是注册 Microsoft Power Automate 帐户并登录。 进入解决方案后,请按照以下步骤设置新流
- 访问 My flows 菜单项。
- 在 My flows (我的流) 中,选择页面顶部的 +Create from blank (从空白创建 ) 链接。
- 选择链接 Search for hundreds of connectors and triggers(搜索数百个连接器和触发器)。
- 在搜索字段中,键入 recurrence,然后从搜索结果中选择 Schedule - Recurrence 以计划要运行的电子邮件传递作业。
- 在“频率”字段的“定期”窗格中,选择执行此流的计划频率,如按每分钟、每小时、每天、每周等间隔自动发送电子邮件。
下一步是将三个作业(创建、获取输出和发送电子邮件)添加到新创建的定期流中。 要完成向流中添加所需作业,请执行以下步骤:
创建操作以执行检索优化建议的 PowerShell 脚本
- 选择 +新建步骤,然后在 Recurrence flow (定期流程) 窗格中选择 Add an action (添加作 )。
- 在搜索字段中,键入 automation ,然后从搜索结果中选择 Azure Automation – Create job 。
- 在“创建作业”窗格中,配置作业属性。 对于此配置,您需要 之前在Automation Account 窗格中记录的 Azure 订阅 ID、资源组和自动化帐户的详细信息。 要了解本部分提供选项的详细信息,请参阅 Azure 自动化 - 创建作业。
- 选择“保存流”。
创建一个作以从执行的 PowerShell 脚本中检索输出。
- 选择 +新建步骤,然后在 Recurrence flow (定期流程) 窗格中选择 Add an action (添加作 )
- 在搜索字段中,键入 automation 并选择 Azure Automation – Get job output from the search results. 要了解本部分提供选项的详细信息,请参阅 Azure 自动化 - 获取作业输出。
- 填充所需字段(类似于创建上一个作业)- 填充 Azure 订阅 ID、资源组和自动化帐户(与“自动化帐户”窗格中输入的内容一样)。
- 在字段 Job ID 中选择 Dynamic content 菜单。 从此菜单中,选择选项 Job ID.
- 选择“保存流”。
创建使用 Office 365 集成发送电子邮件的操作
- 选择 +新建步骤,然后在 Recurrence flow (定期流程) 窗格中选择 Add an action (添加作 )。
- 在搜索字段中,键入 send an email(发送电子邮件 ),然后选择 Office 365 Outlook – Send an email from the search(Office 365 Outlook – 从搜索结果发送电子邮件 )。
- 在 To 字段中,键入您需要将通知电子邮件发送到的电子邮件地址。
- 在 Subject 字段中,键入电子邮件的主题,例如“Automatic tuning recommendations email notification”。
- 在字段 Body 中进行选择,以显示 Dynamic content 菜单。 在此菜单中的 Get job output (获取作业输出) 下,选择 Content (内容)。
- 选择“保存流”。
提示
要将自动电子邮件发送给不同的收件人,请创建单独的流。 在这些附加流程中,更改 To 字段中的收件人电子邮件地址,以及 Subject 字段中的电子邮件主题行。 使用自定义的 PowerShell 脚本(例如更改 Azure 订阅 ID)在 Azure 自动化中创建新的 Runbook 可以进一步自定义自动化方案,例如,就单独订阅的自动优化建议向单独的收件人发送电子邮件。
前面的步骤配置电子邮件投放作业工作流。 生成的包含三个操作的整个流如下图所示。
要测试流,请选择 Run Now (立即运行)。 从“流分析”窗格中,可以查看运行自动作业、显示已发送电子邮件通知成功与否的统计信息。
Flow analytics (流分析) 窗格有助于监控任务执行的成功,并在必要时进行故障排除。 对于故障排除,还可能需要检查可通过 Azure 自动化应用访问的 PowerShell 脚本执行日志。
自动电子邮件的最终输出类似于生成和运行此解决方案后接收的以下电子邮件:
可以通过调整 PowerShell 脚本来调整输出和自动电子邮件的格式以满足需求。
可进一步自定义解决方案,生成基于特定优化事件、发送给多个收件人或者有关多个订阅或数据库的电子邮件通知,具体取决于自定义方案。