全部產品
Search
文件中心

Database Autonomy Service:SQL洞察

更新時間:Jul 27, 2024

SQL洞察功能可對SQL進行健康情況診斷、效能問題排查。本文介紹在SQL洞察和審計中進行SQL洞察的操作步驟。

前提條件

  • 已在DAS中接入對應的資料庫執行個體,並且接入狀態顯示為串連正常

  • 執行個體已開啟SQL洞察和審計,詳情請參見開啟SQL洞察和審計

功能說明

開啟SQL洞察功能可以記錄所有DQL、DML和DDL操作資訊,這些資訊是通過資料庫核心輸出,對系統CPU消耗極低。

支援的資料庫和地區

開啟DAS企業版後,才可以使用該企業版提供的SQL洞察和審計功能,不同的企業版支援的資料庫和地區不同。各個企業版支援的資料庫和地區請參見各個版本支援的資料庫和地區

注意事項

  • SQL洞察功能中分析和統計資料(不包括SQL詳細資料)的儲存時間長度為30天。

  • SQL洞察功能中SQL詳細資料的儲存時間長度與DAS企業版設定的儲存時間長度一致。

  • 關閉SQL洞察和審計功能後,不會對業務產生影響,但是SQL洞察和審計的所有儲存資料會被清空,請將資料匯出並儲存至本地後,再關閉SQL洞察和審計功能。詳情請參見關閉SQL洞察和審計

  • 掛載到PolarDB-X 1.0(DRDS)的RDS MySQL執行個體執行一條SQL語句時,由於水平分割(分庫分表)原因,會在RDS MySQL執行個體上產生多條SQL日誌。

  • 資料庫執行個體的資料移轉會引起閃斷,遷移期間SQL洞察丟失部分資料是符合預期的。

  • 當資料庫執行個體負載非常高時,會丟失少量記錄,因此通過SQL洞察來統計增量資料可能會出現不準確的情況。

  • SQL洞察中記錄的SQL語句最大長度為8192位元組,超過部分不再記錄。其中RDS MySQLPolarDB MySQL版執行個體記錄的SQL語句最大長度受參數控制:

    • 當參數取值小於等於8192位元組時,SQL語句最大長度為參數設定值,超過部分不再記錄。由於資訊採集處理時會增加首碼標註,實際記錄的SQL語句最大長度略小於參數設定值。

    • 當參數取值大於8192位元組時,SQL語句最大長度為8192位元組,超過部分不再記錄。由於資訊採集處理時會增加首碼標註,實際記錄的SQL語句最大長度略小於8192位元組。

    說明
    • RDS MySQLPolarDB MySQL版的5.6、5.7版本由loose_rds_audit_max_sql_size參數控制記錄長度。

    • RDS MySQLPolarDB MySQL版的8.0版本由loose_rds_audit_log_event_buffer_size參數控制記錄長度。

  • 對於RDS PostgreSQL執行個體,如果啟用了PgBouncer串連池,通過PgBouncer執行的SQL不會被SQL洞察記錄。

操作步驟

  1. 登入DAS控制台

  2. 在左側導覽列中,單擊執行個體監控

  3. 找到目標執行個體,單擊執行個體ID,進入目標執行個體詳情頁。

  4. 在左側導覽列單擊請求分析 > SQL洞察和審計,然後在右側開啟的頁面單擊SQL洞察

  5. 根據需要選擇對應的功能項:

    說明

    選擇時間範圍時,查詢結束時間需晚於查詢開始時間,且查詢開始時間和查詢結束時間的間隔不能超過1天。您可以查詢資料庫執行個體開啟DAS企業版後,SQL洞察儲存時間長度範圍內任意一天的資料。

    • 區間查看:選擇需要查看SQL洞察結果的時間範圍,您可以查看選定時間範圍內所有SQL的執行耗時分布執行耗時執行次數。您還可以在全量請求統計地區內查看選定時間範圍內所有SQL的詳細資料,並可以將其匯出到本地。

      說明

      最多支援匯出1000條SQL日誌,如果您需要擷取時間範圍更大、數量更多的SQL日誌,可以通過搜尋(審計)功能。

    • 對比查看:選擇需要對比SQL洞察結果的時間點,您可以查看所有SQL執行耗時分布執行耗時執行次數的對比結果。您還可以在請求對比列表地區內查看詳細的對比結果。

    • 來源統計:選擇需要統計SQL來源的時間範圍,你可以查看選定時間範圍內所有SQL的來源資訊。

    • SQL Review:對選定區間與基準區間內的資料庫執行個體進行workload分析,並且對資料庫執行個體中啟動並執行SQL進行深度分析,展示資料庫執行個體的索引最佳化建議、SQL改寫建議、TOP SQL、新增SQL、失敗SQL、SQL特徵分析、執行變化SQL、效能惡化SQL和TOP流量表。詳情請參見SQL Review

    • 相關SQL識別:選擇需要查看的指標,單擊分析按鈕,經過1~5分鐘的時間,即可以定位到在選定時間範圍內和相關指標變化趨勢最相似的SQL及其詳細資料。

    重要
    • 對於採用冷熱混合儲存的SQL洞察和審計,超過7天的SQL洞察和審計資料採用冷儲存,分析7天前的SQL詳細資料時,系統會建立對應的任務重新進行計算和分析,您可以在工作清單頁面,查看任務進度及歷史任務。

    • 查詢分析超過7天的SQL洞察和審計資料,會按量收取查詢費用,詳情請參見產品計費

說明

  • 執行耗時分布:展示了選定時間範圍內,所有SQL的執行耗時分布,將執行耗時分為了7個區間,每分鐘計算一次,分別是:

    • [0,1]ms 是指滿足0ms ≤ 執行耗時 ≤ 1ms SQL執行次數佔比

    • (1,2]ms 是指1ms < 執行耗時 ≤ 2ms SQL執行次數佔比

    • (2,3]ms 是指2ms < 執行耗時 ≤ 3ms SQL執行次數佔比

    • (3,10]ms 是指3ms < 執行耗時 ≤ 10ms SQL執行次數佔比

    • (10,100]ms 是指10ms < 執行耗時 ≤ 100ms SQL執行次數佔比

    • (0.1,1]s 是指0.1s < 執行耗時 ≤ 1s SQL執行次數佔比

    • >1s 是指1s < 執行耗時 SQL執行次數佔比

    說明

    如果一個執行個體的執行耗時分布越接近藍色,代表這個執行個體的SQL健康情況越好,越接近橙色和紅色,代表這個執行個體的SQL健康情況越差。

  • 執行耗時(SQL RT):通過執行耗時,可以方便地查看在選定的時間範圍內,SQL的執行耗時。

  • 全量請求統計:展示了選定時間範圍內每一類SQL的SQL文本、耗時比例、平均執行耗時、執行趨勢等資訊。

    說明

    耗時比例=(該類SQL執行耗時 × 執行次數)/(所有SQL執行耗時 × 總執行次數)× 100%。耗時比例越高的SQL,佔用MySQL資源越多。

  • SQL ID:單擊SQL ID,您可查看該類SQL效能趨勢、SQL樣本等。

  • SQL樣本:通過SQL樣本,查看該SQL是由哪個應用端發起。

    說明

    SQL樣本的編碼採用UTF-8字元集。

常見問題

Q:SQL洞察全量請求統計地區中的logout!語句是什嗎?

A:logout!是指串連斷開。logout!的耗時,是指上一次互動時間到logout!發生時間的差值,可以理解為串連閒置時間長度。狀態列的1158是指網路連結斷開,其可能的原因是:

  • 用戶端連線逾時。

  • 服務端異常斷開。

  • 服務端串連Reset(超過interactive_timeout或wait_timeout時間長度)。

Q:SQL洞察來源統計中,為什麼會出現%訪問來源

A:該情況可能在您使用預存程序時出現。按如下樣本可以複現這種情況:

說明

樣本中資料庫執行個體為RDS MySQL,測試帳號為test_user,測試資料庫為testdb。

  1. 在RDS控制台建立普通許可權帳號及其授權的資料庫,詳細操作請參見建立資料庫和帳號

  2. 使用測試帳號通過命令列方式串連資料庫執行個體,詳細操作請參見通過用戶端、命令列串連RDS MySQL執行個體

  3. 切換到測試資料庫,並建立如下預存程序。

    -- 切換到測試資料庫
    USE testdb;
    
    -- 建立預存程序
    DELIMITER $$
    DROP PROCEDURE IF EXISTS `das` $$
    CREATE DEFINER=`test_user`@`%` PROCEDURE `das`()
    BEGIN
    SELECT * FROM information_schema.processlist WHERE Id = CONNECTION_ID();
    END $$
    DELIMITER;
  4. 使用高許可權帳號串連資料庫執行個體,詳細操作請參見通過用戶端、命令列串連RDS MySQL執行個體

  5. 調用預存程序。

    -- 切換到測試資料庫
    USE testdb;
    
    -- 調用預存程序
    CALL das();
    
    +--------+-----------+--------+--------+---------+------+-----------+-------------------------------------------------------------------------+
    | ID     | USER      | HOST   | DB     | COMMAND | TIME | STATE     | INFO                                                                    |
    +--------+-----------+--------+--------+---------+------+-----------+-------------------------------------------------------------------------+
    | 487818 | test_user | %:2065 | testdb | Query   |    0 | executing | SELECT * FROM information_schema.processlist WHERE Id = CONNECTION_ID() |
    +--------+-----------+--------+--------+---------+------+-----------+-------------------------------------------------------------------------+

Q:為什麼日誌列表中展示的資料庫名稱和SQL語句中的不一致?

A:日誌列表中所展示的資料庫名稱是從會話中擷取的,而SQL語句中的資料庫名稱則由使用者指定,取決於使用者的輸入或查詢的設計,例如跨資料庫查詢、動態SQL等情境。兩者之間可能存在不一致的情況。

相關API

API

描述

GetErrorRequestSample

非同步查詢資料庫執行個體SQL洞察結果中執行錯誤的SQL樣本資料,最多返回指定時間範圍內20條資料。

GetAsyncErrorRequestStatResult

非同步擷取資料庫執行個體SQL洞察結果中指定SQL的執行錯誤次數。

GetAsyncErrorRequestListByCode

非同步查詢資料庫執行個體SQL洞察結果中產生指定MySQL錯誤碼的SQL ID。

GetAsyncErrorRequestStatByCode

非同步查詢資料庫執行個體SQL洞察結果中的MySQL錯誤碼以及每個錯誤碼對應的SQL數量。

GetFullRequestOriginStatByInstanceId

按照訪問來源統計資料庫執行個體SQL洞察結果中的全量請求資料。

GetFullRequestStatResultByInstanceId

按照SQL ID非同步統計資料庫執行個體SQL洞察結果中的全量請求資料。

GetFullRequestSampleByInstanceId

按照SQL ID查詢資料庫執行個體SQL洞察結果中的SQL樣本資料,最大返回20條樣本資料。

GetDasSQLLogHotData

查詢資料庫執行個體7天內SQL洞察和審計的熱儲存資料明細。

最佳實務

處理慢SQL問題