自動微調的電子郵件通知

適用於: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。

重要

Azure SQL 資料庫仍然支援 PowerShell Azure Resource Manager 模組,但所有未來的開發都是針對 Az.Sql 模組。 如需這些 Cmdlet,請參閱 AzureRM.Sql \(英文\)。 Az 模組和 AzureRm 模組中命令的引數本質上完全相同。

自動微調建議的電子郵件通知自動化

下列解決方案實現了包含自動微調建議的電子郵件通知的傳送自動化。 所述解決方案包含自動執行 PowerShell 指令碼,以使用 Azure 自動化擷取微調建議,並使用 Microsoft Power Automate 自動排程電子郵件傳遞作業。

建立 Azure 自動化帳戶

若要使用 Azure 自動化,第一個步驟是建立自動化帳戶,並使用 Azure 資源進行設定,以用於執行 PowerShell 指令碼。 若要深入了解 Azure 自動化及其功能,請參閱開始使用 Azure 自動化

請遵循下列步驟,透過從 Azure Marketplace 選取和設定自動化應用程式的方法,建立 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 自動化 Runbook:

  1. 存取您在上一個步驟中建立的 Azure 自動化帳戶。

  2. 在自動化帳戶窗格中,按下左側的 [Runbook] 功能表項目,以使用 PowerShell 指令碼建立新的 Azure 自動化 Runbook。 若要深入了解如何建立自動化 Runbook,請參閱建立新的 Runbook

  3. 若要新增 Runbook,按下 [+新增 Runbook] 功能表選項,然後按下 [快速建立 – 建立新的 Runbook]

  4. 在 [Runbook] 窗格中,輸入 Runbook 的名稱 (在本範例中,使用 [AutomaticTuningEmailAutomation]),選取 Runbook 類型作為 PowerShell,並撰寫此 Runbook 的描述來說明其用途。

  5. 按下 [建立] 按鈕以完成建立新的 Runbook。

    Add Azure automation runbook

請遵循下列步驟,在建立的 Runbook 內載入 PowerShell 指令碼:

  1. 在 [編輯 PowerShell Runbook] 窗格中,選取功能表樹上的 [RUNBOOKS],然後展開檢視,直至看到 Runbook 的名稱為止 (在本範例中,為 [AutomaticTuningEmailAutomation])。 選取此 Runbook。
  2. 在「編輯 PowerShell Runbook」的第一行上 (從數字 1 開始),拷貝並貼上下列 PowerShell 指令碼程式碼。 此 PowerShell 指令碼會依目前狀況提供,以協助您開始使用。 根據您的需求修改指令碼。

在提供的 PowerShell 指令碼標頭中,需要將 <SUBSCRIPTION_ID_WITH_DATABASES> 替換為您的 Azure 訂用帳戶 ID。 若要了解如何擷取您的 Azure 訂用帳戶 ID,請參閱取得您的 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 指令碼,調整內容。

執行上述步驟時,用於擷取自動微調建議的 PowerShell 指令碼將載入 Azure 自動化。 下一個步驟是自動化並排程電子郵件傳遞作業。

使用 Microsoft Power Automate 實現工作流程自動化

完成解決方案的最後一個步驟是,在 Microsoft Power Automate 中建立包含三個動作 (作業) 的自動化流程:

  • Azure 自動化 - 建立作業」- 用於執行 PowerShell 指令碼,以擷取 Azure 自動化 Runbook 內的自動微調建議。
  • Azure 自動化 - 取得作業輸出」- 用於從執行的 PowerShell 指令碼擷取輸出。
  • Office 365 Outlook – 傳送電子郵件」– 用於傳送電子郵件。 電子郵件使用建立流程之個人的公司或學校帳戶傳送。

若要了解有關 Microsoft Power Automate 功能的更多資訊,請參閱 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 指令碼,您可以視需要調整自動化電子郵件的輸出和格式設定。

您可以進一步自訂解決方案,以根據特定的微調事件建立電子郵件通知,並針對多個訂用帳戶或資料庫向多個收件者建立電子郵件通知,具體取決於您的自訂案例。

下一步