天天看點

使用者指南—診斷與優化—SQL審計與分析—日志分析

前提條件

開啟SQL審計與分析

功能。

注意事項

  • 相同地域下的所有PolarDB-X資料庫的審計日志都會寫入同一個日志服務的Logstore中,是以PolarDB-X的SQL審計與分析搜尋框内會預設為您帶上

    __topic__

    的過濾條件,保證您搜尋到的SQL日志都屬于同一地域下的PolarDB-X資料庫。本文提供的所有查詢語句,都需要在已有的

    __topic__

    過濾條件後追加使用。例如圖中1部分的語句為預設過濾條件,序号2部分的語句為追加的過濾條件。
    使用者指南—診斷與優化—SQL審計與分析—日志分析
    您可以單擊原始日志各個字段後的詳細内容,自動生成包含對應字段查詢語句。

例如您可以單擊

sql_type

後的

Delete

,檢視所有包含

Delete

字段的SQL語句。

使用者指南—診斷與優化—SQL審計與分析—日志分析

快速定位SQL

您可以使用以下指令快速定位問題SQL。

  • 模糊搜尋例如,您可以使用如下指令查詢包含關鍵字為

    200003

    的SQL語句:
and sql: 200003      
  • 字段搜尋依賴預置的索引字段,PolarDB-X SQL審計還支援根據字段搜尋。例如您可以使用如下指令查詢DROP類型的SQL:
and sql_type:Drop      
  • 多條件搜尋您可以通過

    and

    or

    等關鍵字實作多條件的搜尋。例如您可以使用如下指令查詢針對

    id=200003

    行進行的所有DELETE語句:
and sql: 200003 and sql_type: Delete      
  • 數值比較搜尋索引字段中的

    affect_rows

    response_time

    是數值類型,支援比較操作符。例如您可以使用如下指令查詢

    response_time

    大于5秒的DROP語句:
and response_time > 5 and sql_type: Drop      
  • 或者使用如下指令查詢删除100行以上資料的SQL語句:
and affect_rows  > 100 and sql_type: Delete      

SQL執行狀況分析

您可以使用以下指令檢視SQL執行狀況。

  • SQL執行失敗率您可以使用如下指令查詢SQL執行的失敗率:
| SELECT sum(case when fail = 1 then 1 else 0 end) * 1.0 / count(1) as fail_ratio      
  • 查詢結果如下圖所示:
使用者指南—診斷與優化—SQL審計與分析—日志分析

  • 200003

and sql: 200003      
and sql_type:Drop      
  • and

    or

    id=200003

and sql: 200003 and sql_type: Delete      
  • affect_rows

    response_time

    response_time

and response_time > 5 and sql_type: Drop      
and affect_rows  > 100 and sql_type: Delete      

| SELECT sum(case when fail = 1 then 1 else 0 end) * 1.0 / count(1) as fail_ratio      
使用者指南—診斷與優化—SQL審計與分析—日志分析

高代價SQL模闆Top 10

在大多數應用中,SQL通常基于若幹模闆動态生成的,隻是參數不同。您可以使用如下指令通過模闆ID找到應用中高代價的SQL模闆:

| SELECT sql_code as "SQL模闆ID", round(total_time * 1.0 /sum(total_time) over() * 100, 2) as "總體耗時比例(%)" ,execute_times as "執行次數", round(avg_time) as "平均執行時間",round(avg_rows) as "平均影響行數", CASE WHEN length(sql) > 200 THEN  concat(substr(sql, 1, 200), '......') ELSE trim(lpad(sql, 200, ' ')) end as "樣例SQL" FROM  (SELECT sql_code, count(1) as execute_times, sum(response_time) as total_time, avg(response_time) as avg_time, avg(affect_rows) as avg_rows, arbitrary(sql) as sql FROM log GROUP BY sql_code) ORDER BY "總體耗時比例(%)" desc limit 10      

統計結果中包括SQL模闆ID,該模闆SQL占總體SQL的耗時比例、執行次數、平均執行時間、平均影響行數以及樣例SQL等資訊。

使用者指南—診斷與優化—SQL審計與分析—日志分析
  • 說明 上述查詢是按照總體耗時比例%排序,您也可以根據平均執行時間或執行次數進行排序幫助排查問題。
  • 事務平均執行時長對于相同僚務内的SQL,預置的

    trace_id

    字段字首相同,字尾為

    '-' + 序号

    ;非事務的SQL的

    trace_id

    中則不包含

    '-'

    。是以,您可以使用如下指令對事務SQL的性能進行相關分析。說明由于事務分析涉及字首比對操作,查詢效率會低于其它類型的查詢操作。
    • 查詢事務的平均執行耗時您可以使用如下語句查詢事務的平均執行耗時:
| SELECT  sum(response_time) / COUNT(DISTINCT substr(trace_id, 1, strpos(trace_id, '-') - 1)) where strpos(trace_id, '-') > 0      
    • 慢事務Top 10您可以按照事務的執行時間排序查詢慢事務的清單:
| SELECT substr(trace_id, 1, strpos(trace_id, '-') - 1) as "事務ID" , sum(response_time) as "事務耗時" where strpos(trace_id, '-') > 0 GROUP BY substr(trace_id, 1, strpos(trace_id, '-') - 1) ORDER BY "事務耗時" DESC LIMIT 10      
    • 在此基礎上,您可以使用如下指令,根據查到的慢事務ID搜尋該事務下的所有SQL用于分析執行慢的具體原因:
and trace_id: db3226a20402000*      
    • 大批量操作事務Top 10您可以使用如下指令按照事務内SQL影響的行數排序,查詢大批量操作的事務清單:
| SELECT substr(trace_id, 1, strpos(trace_id, '-') - 1) as  "事務ID" , sum(affect_rows) as "影響行數" where strpos(trace_id, '-') > 0 GROUP BY substr(trace_id, 1, strpos(trace_id, '-') - 1) ORDER BY "影響行數" DESC LIMIT 10      

SQL安全性分析

您可以使用以下指令檢視SQL安全性分析情況。

  • 錯誤SQL類型分布您可以使用如下指令檢視錯誤SQL類型分布:
and fail > 0 | select sql_type, count(1) as "錯誤次數" group by sql_type      
  • 高危SQL清單PolarDB-X 2.0中的高危SQL是指DROP或TRUNCATE類型的SQL(您也可以根據業務需求增加更多條件自定義高危SQL)。

    您可以使用如下指令查詢包含DROP或TRUNCATE類型的SQL清單:

and sql_type: Drop OR sql_type: Truncate      
  • 大批量删除SQL清單您可以使用如下指令大批量删除SQL清單:
and affect_rows > 100 and sql_type: Delete | SELECT date_format(from_unixtime(__time__), '%m/%d %H:%i:%s') as time,