針對 SQL 深入解析 (預覽版) 進行疑難排解

適用于:Azure SQL資料庫 Azure SQL 受控執行個體

若要為 SQL 深入解析 (預覽版) 中的資料收集問題疑難排解,請檢查 [管理設定檔] 索引標籤上的監視機器狀態。狀態如下:

  • 收集
  • 未收集
  • 收集,但有錯誤

選取狀態以查看記錄,以及可協助您解決問題的更多詳細資料。

顯示監視機器狀態的螢幕擷取畫面。

狀態:未收集

如果過去 10 分鐘內,InsightsMetrics 中沒有 SQL 的資料,監視機器的狀態為未收集

注意

請確定您嘗試從支援的 SQL 版本收集資料。 例如,嘗試使用有效的設定檔和連接字串收集資料,但來自不支援的 Azure SQL Database 版本,會造成未收集狀態。

SQL 深入解析 (預覽版) 會使用下列查詢來擷取此資訊:

InsightsMetrics 
    | extend Tags = todynamic(Tags) 
    | extend SqlInstance = tostring(Tags.sql_instance) 
    | where TimeGenerated > ago(10m) and isnotempty(SqlInstance) and Namespace == 'sqlserver_server_properties' and Name == 'uptime' 

檢查 Telegraf 是否有任何記錄可協助找出問題的根本原因。 如果有記錄項目,您可以選取 [未收集],並檢查常見問題的記錄和疑難排解資訊。

如果沒有記錄項目,請檢查監視虛擬機器上的記錄,以取得兩個虛擬機器擴充功能安裝的下列服務:

  • Microsoft.Azure.Monitor.AzureMonitorLinuxAgent
    • 服務:mdsd
  • Microsoft.Azure.Monitor.Workloads.Workload.WLILinuxExtension
    • 服務:wli
    • 服務:ms-telegraf
    • 服務:td-agent-bit-wli
    • 檢查安裝失敗的擴充功能記錄: /var/log/azure/Microsoft.Azure.Monitor.Workloads.Workload.WLILinuxExtension/wlilogs.log

wli 服務記錄

服務記錄:/var/log/wli.log

若要查看最近的記錄:tail -n 100 -f /var/log/wli.log

如果您看到下列錯誤記錄檔,服務發生問題 mdsd2021-01-27T06:09:28Z [Error] Failed to get config data. Error message: dial unix /var/run/mdsd/default_fluent.socket: connect: no such file or directory

Telegraf 服務記錄

服務記錄:/var/log/ms-telegraf/telegraf.log

若要查看最近的記錄:tail -n 100 -f /var/log/ms-telegraf/telegraf.log

若要查看最近的錯誤和警告記錄:tail -n 1000 /var/log/ms-telegraf/telegraf.log | grep "E\!\|W!"

telegraf 使用的設定是由 wli 服務產生,並放在:/etc/ms-telegraf/telegraf.d/wli

如果產生不正確的設定,ms-telegraf 服務可能無法啟動。 使用此命令檢查 ms-telegraf 服務是否正在執行:service ms-telegraf status

若要查看來自 telegraf 服務的錯誤訊息,請使用下列命令手動執行:

/usr/bin/ms-telegraf --config /etc/ms-telegraf/telegraf.conf --config-directory /etc/ms-telegraf/telegraf.d/wli --test 

mdsd 服務記錄

檢查 Azure 監視器代理程式的必要條件

在 Azure 監視器代理程式 v1.12 之前,mdsd 服務記錄位於:

  • /var/log/mdsd.err
  • /var/log/mdsd.warn
  • /var/log/mdsd.info

從 v1.12 開始,服務記錄位於:

  • /var/opt/microsoft/azuremonitoragent/log/
  • /etc/opt/microsoft/azuremonitoragent/

若要查看最近的錯誤:tail -n 100 -f /var/log/mdsd.err

如果您需要連絡支援,請收集下列資訊:

  • 登入 /var/log/azure/Microsoft.Azure.Monitor.AzureMonitorLinuxAgent/
  • 登入 /var/log/waagent.log
  • 登入 /var/log/mdsd*,或登入 /var/opt/microsoft/azuremonitoragent/log/ and /etc/opt/microsoft/azuremonitoragent/
  • /etc/mdsd.d/ 中的檔案
  • File /etc/default/mdsd

無效的監視虛擬機器設定

造成未收集狀態的其中一個原因是監視虛擬機器的設定無效。 以下是最簡單的設定形式:

{
    "version": 1,
    "secrets": {
        "telegrafPassword": {
            "keyvault": "https://mykeyvault.vault.azure.net/",
            "name": "sqlPassword"
        }
    },
    "parameters": {
        "sqlAzureConnections": [
            "Server=mysqlserver.database.windows.net;Port=1433;Database=mydatabase;User Id=telegraf;Password=$telegrafPassword;"
        ],
        "sqlVmConnections": [
        ],
        "sqlManagedInstanceConnections": [
        ]
    }
}

此設定會指定要用於監視虛擬機器上設定檔設定的取代權杖。 它也可讓您參考來自 Azure Key Vault 的密碼,因此,您不需要將密碼值保存在任何設定中 (強烈建議)。

在此設定中,資料庫連接字串包括 $telegrafPassword 取代權杖。 SQL 深入解析會以從 Key Vault 擷取的 SQL 驗證密碼取代此權杖。 Key Vault URI 是在 secrets 下的 telegrafPassword 設定區段中指定。

密碼

密碼是權杖,其值會在執行階段從 Azure Key Vault 擷取。 密碼是由包含金鑰保存庫 URI 和祕密名稱的值組所定義。 此定義可讓 SQL 深入解析在執行階段取得密碼的值,並在下游設定中使用。

您可以視需要定義許多密碼,包括儲存在多個金鑰保存庫中的密碼。

   "secrets": {
        "<secret-token-name-1>": {
            "keyvault": "<key-vault-uri>",
            "name": "<key-vault-secret-name>"
        },
        "<secret-token-name-2>": {
            "keyvault": "<key-vault-uri-2>",
            "name": "<key-vault-secret-name-2>"
        }
    }

存取金鑰保存庫的權限會提供給監視虛擬機器上的受控識別。 此受控識別必須授與監視設定檔設定中所參考之所有 Key Vault 密碼的取得權限。 您可以從 Azure 入口網站、PowerShell、Azure CLI 或 Azure Resource Manager 範本,來完成此作業。

參數

參數是可透過 JSON 範本在設定檔設定中參考的權杖。 參數具有名稱和值。 值可以是任何 JSON 類型,包括物件和陣列。 參數會以其名稱在設定檔設定中參考,使用此慣例:.Parameters.<name>

參數可以使用相同慣例來參考 Key Vault 中的密碼。 例如,sqlAzureConnections 藉由使用慣例 $telegrafPassword 來參考密碼 telegrafPassword

在執行階段,會解析所有參數和密碼,並與設定檔設定合併,以建構電腦上要使用的實際設定。

注意

sqlAzureConnectionssqlVmConnectionssqlManagedInstanceConnections 的參數名稱是設定中的必要項目,即使您未提供其中部分連接字串也是如此。

狀態:收集,但有錯誤

如果至少有一個最近的InsightsMetrics記錄檔,監視電腦的狀態為[收集錯誤],但資料表中 Operation 也有錯誤。

SQL 深入解析會使用下列查詢來擷取此資訊:

InsightsMetrics 
    | extend Tags = todynamic(Tags) 
    | extend SqlInstance = tostring(Tags.sql_instance) 
    | where TimeGenerated > ago(240m) and isnotempty(SqlInstance) and Namespace == 'sqlserver_server_properties' and Name == 'uptime' 
WorkloadDiagnosticLogs
| summarize Errors = countif(Status == 'Error')

注意

如果您沒有看到 WorkloadDiagnosticLogs 中的任何資料,您可能需要更新監視設定檔。 在 Azure 入口網站的 SQL 深入解析中,選取 [管理設定檔]>[編輯設定檔]>[更新監視設定檔]。

對於常見案例,我們會在記錄檢視中提供疑難排解提示:

Azure 監視器頁面的螢幕擷取畫面,用於針對Azure 入口網站中的 SQL 記錄進行疑難排解。

已知問題

在預覽 SQL Insights 期間,您可能會遇到下列已知問題。

  • 連線到伺服器或資料庫時發生「登入失敗」錯誤

    在 SQL 驗證密碼中,使用儲存在監視 VM 設定或 Key Vault 中的特定特殊字元,可能會導致監視 VM 無法連線到 SQL 伺服器或資料庫。 這組字元包括括弧、方括弧和大括弧、貨幣符號、正斜線和反斜線,以及點 ([ { ( ) } ] $ \ / .)。

  • 資料庫連接字串屬性中的空格可能會取代為特殊字元,導致資料庫連線失敗。 例如,如果 User Id 屬性中的空格以特殊字元取代,則連線將會失敗,且會有使用者登入失敗錯誤。 若要解決此問題,請編輯監視設定檔組態,並刪除每個取代空格出現的特殊字元。 某些特殊字元可能看起來與空格難以區分,因此您可能會想要刪除每個空白字元、再次輸入,然後儲存組態。

  • 如果監視 VM 的 OS 電腦名稱稱與監視 VM 名稱不同,資料收集和視覺效果可能無法運作。

最佳作法

  • 確定從監視 VM 存取 Key Vault。 如果您使用 Key Vault 來儲存 SQL 驗證密碼 (強烈建議),您必須確保網路和安全性設定允許監視 VM 存取 Key Vault。 如需詳細資訊,請參閱存取防火牆後方的 Azure Key Vault設定 Azure Key Vault 網路設定。 若要確認監視 VM 可以存取 Key Vault,您可以從連線到 VM 的 SSH 工作階段執行下列命令。 您應該能夠成功擷取存取權杖和密碼。 使用實際值取代 [YOUR-KEY-VAULT-URL][YOUR-KEY-VAULT-SECRET][YOUR-KEY-VAULT-ACCESS-TOKEN]

    # Get an access token for accessing Key Vault secrets
    curl 'http://[YOUR-KEY-VAULT-URL]/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net' -H Metadata:true
    
    # Get Key Vault secret
    curl 'https://[YOUR-KEY-VAULT-URL]/secrets/[YOUR-KEY-VAULT-SECRET]?api-version=2016-10-01' -H "Authorization: Bearer [YOUR-KEY-VAULT-ACCESS-TOKEN]"
    
  • 在監視 VM 上更新軟體。 強烈建議定期更新作業系統和監視 VM 上的延伸模組。 如果延伸模組支援自動升級,請啟用該選項。

  • 儲存先前設定。 如果您想要變更監視設定檔或監視 VM 設定,建議您先儲存設定資料的工作複本。 從 Azure 入口網站的 [SQL Insights] 頁面中,選取 [管理設定檔]>[編輯設定檔],並將 [目前監視設定檔設定] 的文字複製到檔案。 同樣地,為監視 VM 選取 [管理設定檔]>[設定],並將 [目前監視設定] 的文字複製到檔案。 如果在設定變更之後發生資料收集錯誤,您可以使用文字差異工具來比較新的設定與已知的正常運作設定,以協助您找出任何可能影響資料收集的變更。

後續步驟