你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

自动优化的电子邮件通知

适用于:Azure SQL 数据库Azure SQL 托管实例

Azure SQL 数据库优化建议由 Azure SQL 数据库自动优化生成。 此解决方案持续监视和分析数据库的工作负载,为与索引创建、索引删除和查询执行计划优化相关的每个数据库提供自定义优化建议。

Azure SQL 数据库自动优化建议可在 Azure 门户中查看,使用 REST API 调用或通过 T-SQLPowerShell 命令可以进行检索。 本文立足于使用 PowerShell 脚本检索自动优化建议。

注意

本文使用 Azure Az PowerShell 模块,这是与 Azure 交互时推荐使用的 PowerShell 模块。 若要开始使用 Az PowerShell 模块,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

重要

PowerShell Azure 资源管理器模块仍受 Azure SQL 数据库的支持,但所有未来的开发都是针对 Az.Sql 模块的。 若要了解这些 cmdlet,请参阅 AzureRM.Sql。 Az 模块和 AzureRm 模块中的命令参数大体上是相同的。

自动发送有关自动优化建议的电子邮件通知

以下解决方案可自动发送包含自动优化建议的电子邮件通知。 所述解决方案包括使用 Azure 自动化自动执行 PowerShell 脚本以检索优化建议,以及使用 Microsoft Power Automate 自动计划电子邮件的发送作业。

创建 Azure 自动化帐户

要使用 Azure 自动化,第一步是创建自动化帐户并使用 Azure 资源配置该帐户,以用于 PowerShell 脚本的执行。 要了解 Azure 自动化及其功能的详细信息,请参阅 Azure 自动化入门

请通过从 Azure 市场选择和配置自动化应用的方法,执行以下步骤来创建 Azure 自动化帐户:

  1. 登录到 Azure 门户。

  2. 单击左上角的“+ 创建资源”。

  3. 搜索“自动化”(按 Enter)。

  4. 单击搜索结果中的自动化应用。

    Adding Azure automation

  5. 进入“创建自动化帐户”窗格后,单击“创建”。

  6. 填充所需信息:输入此自动化帐户的名称,选择要用于 PowerShell 脚本执行的 Azure 订阅 ID 和 Azure 资源。

  7. 对于“创建 Azure 运行方式帐户”选项,选择“是”以配置 PowerShell 脚本借助 Azure 自动化来运行所使用的帐户的类型 。 若要详细了解帐户类型,请参阅运行方式帐户

  8. 通过单击“创建”确定自动化帐户的创建。

提示

创建自动化应用时,请完全按照输入内容记录 Azure 自动化帐户名称、订阅 ID 和资源(如复制粘贴到记事本)。 稍后需要使用此信息。

如果要为多个 Azure 订阅生成相同的自动化,则需要为其他订阅重复此过程。

更新 Azure 自动化模块

检索自动优化建议的 PowerShell 脚本使用 Get-AzResourceGet AzSqlDatabaseRecommendedAction 命令,为此需要 Azure 模块版本 4 和更高版本。

创建 Azure 自动化 Runbook

下一步是的 Azure 自动化中创建 Runbook,用于检索优化建议的 PowerShell 脚本也会驻留在 Azure 自动化中。

请按照以下步骤创建新的 Azure 自动化 Runbook:

  1. 访问上一步中创建的 Azure 自动化帐户。

  2. 进入“自动化帐户”窗格后,单击左侧的“Runbook”菜单项,使用 PowerShell 脚本创建新的 Azure 自动化 Runbook。 若要详细了解如何创建自动化 Runbook,请参阅创建新的 Runbook

  3. 要添加新的 Runbook,请单击“+添加 Runbook”菜单选项,然后单击“快速创建 - 创建新的 Runbook” 。

  4. 在“Runbook”窗格中,键入 Runbook 的名称(本示例使用“AutomaticTuningEmailAutomation”),选择“PowerShell”作为 Runbook 类型,并编写此 Runbook 的说明以描述其用途 。

  5. 单击“创建”按钮以完成创建新的 Runbook。

    Add Azure automation runbook

请按照以下步骤在创建的 runbook 中加载 PowerShell 脚本:

  1. 在“编辑 PowerShell Runbook”窗格中,选择菜单树上的“RUNBOOK”并展开视图,直到看到 Runbook 的名称(在本示例中为“AutomaticTuningEmailAutomation”) 。 选择此 runbook。
  2. 在“编辑 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

单击右上角的“保存”按钮保存脚本。 如果对脚本满意,请单击“发布”按钮发布此 Runbook。

在“主 Runbook”窗格中,可选择单击“启动”按钮来测试脚本 。 单击“输出”查看脚本的执行结果。 此输出将是电子邮件的内容。 脚本的示例输出如以下屏幕截图中所示。

Run view automatic tuning recommendations with Azure Automation

确保通过根据需求自定义 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 帐户并登录。 进入解决方案后,请按照以下步骤设置新流

  1. 访问“我的流”菜单项。
  2. 在“我的流”中,选择页面顶部的“+从空白创建”链接。
  3. 单击页面底部的“搜索数百个连接器和触发器”链接。
  4. 在“搜索”字段中键入“定期”,然后从搜索结果中选择“计划 - 定期”,计划要运行的电子邮件发送作业 。
  5. 在“频率”字段的“定期”窗格中,选择执行此流的计划频率,如按每分钟、每小时、每天、每周等间隔自动发送电子邮件。

下一步是向新创建的定期流添加三个作业(创建、获取输出和发送电子邮件)。 要完成向流中添加所需作业,请执行以下步骤:

  1. 创建操作以执行检索优化建议的 PowerShell 脚本

    • 在“定期流”窗格中选择“+ 新建步骤”,然后选择“添加操作” 。
    • 在“搜索”字段中键入“自动化”,然后从搜索结果中选择“Azure 自动化 - 创建作业” 。
    • 在“创建作业”窗格中,配置作业属性。 对于此配置,需要之前在“自动化帐户”窗格上记录的 Azure 订阅 ID、资源组和自动化帐户的详细信息。 要了解本部分提供选项的详细信息,请参阅 Azure 自动化 - 创建作业
    • 单击“保存流”完成创建此操作。
  2. 创建从已执行的 PowerShell 脚本检索输出的操作

    • 在“定期流”窗格中选择“+ 新建步骤”,然后选择“添加操作”
    • 在“搜索”字段中键入“自动化”,然后从搜索结果中选择“Azure 自动化 - 获取作业输出” 。 要了解本部分提供选项的详细信息,请参阅 Azure 自动化 - 获取作业输出
    • 填充所需字段(类似于创建上一个作业)- 填充 Azure 订阅 ID、资源组和自动化帐户(与“自动化帐户”窗格中输入的内容一样)。
    • 单击“作业 ID”字段内部,以便显示“动态内容”菜单 。 从此菜单中选择“作业 ID”选项。
    • 单击“保存流”完成创建此操作。
  3. 创建使用 Office 365 集成发送电子邮件的操作

    • 在“定期流”窗格中选择“+ 新建步骤”,然后选择“添加操作” 。
    • 在“搜索”字段中键入“发送电子邮件”,然后从搜索结果中选择“Office 365 Outlook - 发送电子邮件” 。
    • 在“收件人”字段中,键入需要发送通知电子邮件的电子邮件地址。
    • 在“主题”字段中键入电子邮件的主题,例如“自动优化建议电子邮件通知”。
    • 单击“正文”字段内部,以便显示“动态内容”菜单 。 在此菜单中的“获取作业输出”下,选择“内容” 。
    • 单击“保存流”完成创建此操作。

提示

要将自动电子邮件发送给不同的收件人,请创建单独的流。 在这些附加流中,更改“收件人”字段中的收件人电子邮件地址,以及“主题”字段中的电子邮件主题行。 使用自定义 PowerShell 脚本在 Azure 自动化中创建新的 runbook(例如更改 Azure 订阅 ID)可进一步自定义自动化方案,例如向单独的收件人发送有关单独订阅的自动优化建议的电子邮件。

上面总结了配置电子邮件发送作业工作流所需的步骤。 生成的包含三个操作的整个流如下图所示。

View automatic tuning email notifications flow

要测试流,请单击“流”窗格中右上角的“立即运行”。

从“流分析”窗格中,可以查看运行自动作业、显示已发送电子邮件通知成功与否的统计信息。

Running flow for automatic tuning email notifications

“流分析”窗格对监视作业执行是否成功很有帮助,对故障排除也很有帮助(如果需要)。 对于故障排除,还可能需要检查可通过 Azure 自动化应用访问的 PowerShell 脚本执行日志。

自动电子邮件的最终输出类似于生成和运行此解决方案后接收的以下电子邮件:

Sample email output from automatic tuning email notifications

可以通过调整 PowerShell 脚本来调整输出和自动电子邮件的格式以满足需求。

可进一步自定义解决方案,生成基于特定优化事件、发送给多个收件人或者有关多个订阅或数据库的电子邮件通知,具体取决于自定义方案。

后续步骤