Share via


適用於 MySQL 的 Azure 資料庫中的慢速查詢記錄

適用於: 適用於 MySQL 的 Azure 資料庫 - 單一伺服器

重要

適用於 MySQL 的 Azure 資料庫單一伺服器位於淘汰路徑上。 強烈建議您升級至適用於 MySQL 的 Azure 資料庫彈性伺服器。 如需移轉至適用於 MySQL 的 Azure 資料庫彈性伺服器的詳細資訊,請參閱適用於 MySQL 的 Azure 資料庫單一伺服器會發生什麼事?

在適用於 MySQL 的 Azure 資料庫中,使用者可以使用慢速查詢記錄檔。 不支援存取交易記錄。 慢速查詢記錄檔可以用來找出效能瓶頸,以進行疑難排解。

如需 MySQL 慢速查詢記錄的詳細資訊,請參閱 MySQL 參考手冊的慢速查詢記錄章節

在您的伺服器上啟用查詢存放區時,您可能會看到「CALL mysql.az_procedure_collect_wait_stats (900, 30);」之類的查詢記錄在慢速查詢記錄中。 這是預期的行為,因為查詢存放區功能會收集查詢的相關統計資料。

設定慢速查詢記錄

預設會停用慢速查詢記錄。 若要加以啟用,請將 slow_query_log 設定為「開啟」。 這可使用 Azure 入口網站 或 Azure CLI 加以啟用。

您可以調整的其他參數包含:

  • long_query_time:如果查詢所需的時間比記錄該查詢的 long_query_time (秒) 還要久。 預設值是 [10 秒]。
  • log_slow_admin_statements:如果 ON 在寫入至 slow_query_log 的陳述式中包含 ALTER_TABLE 和 ANALYZE_TABLE 這類管理陳述式。
  • log_queries_not_using_indexes:決定是否將未使用索引的查詢記錄至 slow_query_log
  • log_throttle_queries_not_using_indexes:這個參數會限制可寫入至慢速查詢記錄的非索引查詢次數。 log_queries_not_using_indexes 設為 ON 時,這個參數會生效。
  • log_output:如果為「檔案」,允許慢速查詢記錄同時寫入本機伺服器儲存體和 Azure 監視器診斷記錄。 如果為「無」,則慢速查詢記錄只會寫入 Azure 監視器診斷記錄。

重要

如果您的資料表未編製索引,將 log_queries_not_using_indexeslog_throttle_queries_not_using_indexes 參數設定為 ON 可能會影響 MySQL 的效能;因為對這些未編制索引的資料表執行的所有查詢都會寫入慢速查詢記錄。

如果您打算記錄長時間的慢速查詢,建議將 log_output 設定為「無」。 如果設為「檔案」,這些記錄會寫入本機伺服器儲存體,並可能影響 MySQL 效能。

如需慢速查詢記錄參數的完整描述,請參閱 MySQL 慢速查詢記錄文件

存取慢速查詢記錄

在適用於 MySQL 的 Azure 資料庫中存取慢速查詢記錄的選項有兩個:本機伺服器儲存體或 Azure 監視器診斷記錄。 這是使用 log_output 參數來設定的。

針對本機伺服器儲存體,您可使用 Azure 入口網站或 Azure CLI 列出和下載慢速查詢記錄。 在 Azure 入口網站中,瀏覽至 Azure 入口網站中的伺服器。 在 [監視] 標題下方,選取 [伺服器記錄] 頁面。 如需 Azure CLI 的詳細資訊,請參閱使用 Azure CLI 設定和存取慢速查詢記錄

Azure 監視器診斷記錄可讓您將慢速查詢記錄輸送至 Azure 監視器記錄 (Log Analytics)、Azure 儲存體或事件中樞。 如需詳細資訊,請參閱下方內容。

本機伺服器儲存體記錄保留

記錄到伺服器的本機儲存體時,記錄從其建立起最多可使用七天。 如果可用記錄的總大小超過 7 GB,則會刪除最舊的檔案,直到空間可用為止。伺服器記錄的 7 GB 儲存體限制是免費的,無法擴充。

記錄會每隔 24 小時或 7 GB 旋轉一次,先到者先用。

注意

上述記錄保留不適用於使用 Azure 監視器診斷記錄輸送的記錄。 您可以變更發出至 (如 Azure 儲存體) 的資料接收保留期期間。

診斷記錄

適用於 MySQL 的 Azure 資料庫會與 Azure 監視器診斷記錄整合。 在 MySQL 伺服器上啟用慢速查詢記錄後,您即可選擇將它們發出至 Azure 監視器記錄、事件中樞或 Azure 儲存體。 若要深入了解如何啟用診斷記錄,請參閱診斷記錄文件的操作說明一節。

注意

如果透過診斷和設定將記錄傳送至 Azure 儲存體,則不支援進階儲存體帳戶

下表描述每個記錄的內容。 視輸出方法而定,包含的欄位及其出現的順序可能有所不同。

屬性 說明
TenantId 您的租用戶識別碼
SourceSystem Azure
TimeGenerated [UTC] 以 UTC 記錄記錄時的時間戳記
Type 記錄的類型。 一律為 AzureDiagnostics
SubscriptionId 伺服器所屬訂用帳戶的 GUID
ResourceGroup 伺服器所屬資源群組的名稱
ResourceProvider 資源提供者名稱。 一律為 MICROSOFT.DBFORMYSQL
ResourceType Servers
ResourceId 資源 URI
Resource 伺服器的名稱
Category MySqlSlowLogs
OperationName LogEvent
Logical_server_name_s 伺服器的名稱
start_time_t [UTC] 查詢開始時間
query_time_s 執行查詢所花費的總時間 (以秒為單位)
lock_time_s 查詢遭到鎖定的總時間 (以秒為單位)
user_host_s 使用者名稱
rows_sent_d 傳送的資料列數目
rows_examined_s 檢查的資料列數目
last_insert_id_s last_insert_id
insert_id_s 插入識別碼
sql_text_s 完整查詢
server_id_s 伺服器的識別碼
thread_id_s 執行緒 ID
\_ResourceId 資源 URI

注意

對於 sql_text,如果記錄超過 2048 個字元,將會遭到截斷。

分析 Azure 監視器記錄中的記錄

透過診斷記錄將慢速查詢記錄輸送至 Azure 監視器記錄後,您即可對慢速查詢執行進一步分析。 以下是可協助您開始使用的範例查詢。 務必以您的伺服器名稱更新以下內容。

  • 特定伺服器上超過 10 秒的查詢

    AzureDiagnostics
    | where LogicalServerName_s == '<your server name>'
    | where Category == 'MySqlSlowLogs'
    | project TimeGenerated, LogicalServerName_s, start_time_t , query_time_d, sql_text_s 
    | where query_time_d > 10
    
  • 列出特定伺服器上的前 5 個最長查詢

    AzureDiagnostics
    | where LogicalServerName_s == '<your server name>'
    | where Category == 'MySqlSlowLogs'
    | project TimeGenerated, LogicalServerName_s, start_time_t , query_time_d, sql_text_s 
    | order by query_time_d desc
    | take 5
    
  • 依在特定伺服器上的最小、最大、平均和標準差査詢時間總結慢速査詢

    AzureDiagnostics
    | where LogicalServerName_s == '<your server name>'
    | where Category == 'MySqlSlowLogs'
    | project TimeGenerated, LogicalServerName_s, start_time_t , query_time_d, sql_text_s 
    | summarize count(), min(query_time_d), max(query_time_d), avg(query_time_d), stdev(query_time_d), percentile(query_time_d, 95) by LogicalServerName_s
    
  • 繪製特定伺服器上的慢速查詢分佈

    AzureDiagnostics
    | where LogicalServerName_s == '<your server name>'
    | where Category == 'MySqlSlowLogs'
    | project TimeGenerated, LogicalServerName_s, start_time_t , query_time_d, sql_text_s 
    | summarize count() by LogicalServerName_s, bin(TimeGenerated, 5m)
    | render timechart
    
  • 在所有已啟用診斷記錄的 MySQL 伺服器上顯示超過 10 秒的查詢

    AzureDiagnostics
    | where Category == 'MySqlSlowLogs'
    | project TimeGenerated, LogicalServerName_s, start_time_t , query_time_d, sql_text_s 
    | where query_time_d > 10
    

後續步驟