PolarDB-X 1.0支持SQL審計與分析功能,依托日志服務產品,提供強大的日志分析能力。本文檔將介紹常見場景的SQL日志分析語句及示例。
背景信息
開啟PolarDB-X 1.0 SQL審計與分析功能之后,您可以在當前頁面通過日志服務的查詢分析語法進行SQL審計與分析。結合日志服務的查詢分析語法,在日志分析頁面,您可以快速定位問題SQL,并針對PolarDB-X 1.0數據庫的SQL執行狀況、性能指標、安全問題進行分析。關于日志服務的查詢分析語法,詳情請參見查詢語法。
注意事項
相同Region下,PolarDB-X 1.0數據庫的審計日志都是寫入同一個日志服務的Logstore里,所以PolarDB-X 1.0 SQL審計與分析的搜索頁面會默認為您帶上__topic__
過濾條件,保證您搜索到的SQL日志是PolarDB-X 1.0數據庫的。因此本文提供的所有的查詢語句,都需要在已有的過濾條件后追加使用。
例如下圖中序號1部分的語句為默認過濾條件,序號2部分的語句為追加的過濾條件。
快速定位問題SQL
您可以使用以下命令快速定位問題SQL。
- 模糊搜索
例如,您可以使用如下命令查詢包含關鍵字為
34
的SQL語句:and sql: 34
查詢結果如下圖所示:
- 字段搜索
依賴預置的索引字段,PolarDB-X 1.0 SQL審計還支持根據字段搜索。例如您可以使用如下命令查詢
Drop
類型的SQL:and sql_type:Drop
查詢結果如下圖所示:
日志服務支持鼠標點擊自動生成查詢語句,如下圖所示。
- 多條件搜索
您可以通過
and
或or
等關鍵字實現多條件的搜索。例如您可以使用如下命令查詢對id=34
行的刪除操作:and sql:34 and sql_type: Delete
- 數值比較搜索
索引字段中的
affect_rows
和response_time
是數值類型,支持比較操作符。例如您可以使用如下命令查詢response_time
大于1s的Insert SQL:and response_time > 1 and sql_type: Insert
或者使用如下命令查詢刪除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錯誤率敏感,可以在此查詢結果的基礎上,定制報警信息。以下報警設置表示每隔15分鐘,檢查15分鐘內SQL執行的錯誤率大于0.01的日志數量。您也可以根據業務需要定制告警。
- SQL累計查詢行數
您可以使用如下命令查詢Select語句累計查詢的行數:
and sql_type: Select | SELECT sum(affect_rows)
- SQL類型分布
您可以使用如下命令查詢SQL類型分布:
| SELECT sql_type, count(sql) as times GROUP BY sql_type
- SQL獨立用戶IP分布
您可以使用如下命令查詢SQL獨立用戶的IP地址分布:
| SELECT user, client_ip, count(sql) as times GROUP BY user, client_ip
SQL性能分析
您可以使用以下命令查看SQL性能分析詳情。
- SELECT平均耗時
您可以使用以下命令查詢SELECT語句的平均耗時:
and sql_type: Select | SELECT avg(response_time)
- SQL執行耗時分布
您可以使用以下命令查詢SQL執行耗時分布。
and response_time > 0 | select case when response_time <= 10 then '<=10毫秒' when response_time > 10 and response_time <= 100 then '10~100毫秒' when response_time > 100 and response_time <= 1000 then '100毫秒~1秒' when response_time > 1000 and response_time <= 10000 then '1秒~10秒' when response_time > 10000 and response_time <= 60000 then '10秒~1分鐘' else '>1分鐘' end as latency_type, count(1) as cnt group by latency_type order by latency_type DESC
說明 上述查詢給出了按照給定時間段的SQL執行時間分布,您也可以調整時間段的范圍,獲取更加精細的結果。 - 慢SQL Top 50
您可以使用以下命令查詢系統排名前50的慢SQL。
SELECT date_format(from_unixtime(__time__), '%m/%d %H:%i:%s') as time, user, client_ip, client_port, sql_type, affect_rows, response_time, sql ORDER BY response_time desc LIMIT 50
查詢結果如下圖所示,結果中包含SQL執行時間、執行的用戶名、IP地址、端口號、SQL類型、影響行數、執行時間以及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(為了顯示效果,該列按照200的長度截斷)。
說明 上述查詢是按照總體耗時比例排序,當然您也可以根據平均執行時間,執行次數進行排序排查問題。 - 事務平均執行時長
對于相同事務內的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列表
高危SQL是指DROP或RUNCATE類型的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, user, client_ip, client_port, affect_rows, sql ORDER BY affect_rows desc LIMIT 50