MySQL 慢日誌線上問題分析及功能優化

2021-08-13 09:37:45 字數 1890 閱讀 3776

者:溫正湖

mysql 慢日誌(slow log)是 mysql dba 及其他開發、運維人員需經常關注的一類資訊。使用慢日誌可找出執行時間較長或未走索引等 sql 語句,為進行系統調優提供依據。

本文將結合乙個線上案例,分析如何正確設定 mysql 慢日誌引數和使用慢日誌功能,並介紹下網易雲 rds 對 mysql 慢日誌功能的增強。

首先,我們需要確認該例項是否開啟了慢日誌功能,預設情況下,mysql 慢日誌功能是關閉的。慢日誌開關引數為 slow_query_log,可在 mysqld 啟動命令列或配置檔案中顯式指定,若指定 slow_query_log=1 或不指定值,則表示開啟慢日誌,賦值為 0 表示關閉。使用者可以在執行時動態開啟和關閉。

網易雲 rds 例項預設開啟慢日誌功能,我們確認了該使用者未關閉例項的慢日誌開關。

接下來,需確認慢日誌記錄位置,mysql 使用 log_output 引數指定以檔案(file)還是以表 (table) 的方式來儲存慢日誌。需要強調的是,僅指定 log_output 而將 slow_query_log 置為 0 並不會記錄慢日誌,也就是說 slow_query_log 才是慢日誌的開關。若使用檔案形式記錄慢日誌,則可通過 slow_query_log_file 指定檔名,如果使用者沒有顯式指定 slow_query_log_file,則 mysql 將其初始化為 host_name-slow.log,host_name 即為執行 mysqld 的主機名,慢日誌檔案預設位於 mysql 資料目錄。

網易雲 rds 例項不允許使用者修改日誌檔案路徑,但可以配置 log_output 引數,通過查詢,確認該例項以檔案方式記錄慢日誌,檢視日誌檔案確認沒有使用者所述的 sql 語句。

由於使用者提供了復現語句,我們執行了其 sql 語句,確實 1 分多鐘才返回,通過 explain 命令發現其未走索引,掃瞄了較多的記錄數,再次檢視慢日誌仍沒有記錄該 sql 語句。

mysql 會記錄滿足執行時間超過 long_query_time 秒,掃瞄記錄數超過 min_examined_row_limit 行的 sql 語句。long_query_time 引數最小值和預設值分別為 1 和 10s,該引數可以精確到微秒(ms)。如果選擇將慢日誌記錄到檔案中,那麼所記錄的時間精確到微秒,如果記錄到慢日誌表(mysql.slow_log)中,那麼僅精確到秒,微秒部分被忽略。

網易雲 rds 例項允許使用者設定這兩個引數值,那麼是不是使用者調整了上述兩個閾值,導致無法滿足記錄條件呢,進一步查詢發現也不是問題原因所在。

我們注意到 mysql 還有個名為 log_queries_not_using_indexes 的引數用於控制是否記錄未走索引的 sql 查詢,**如下:

重點關注箭頭所指內容,如果查詢未走索引或者索引無效,且相關引數開啟,那麼 warn_no_index 設定為 true,若同時滿足掃瞄記錄數超過閾值,也會像慢查詢一樣被記錄,那麼是不是該引數未開呢?結果仍是否定的。

log_throttle_queries_not_using_indexes 統計的是所有不走索引的語句,其中有些語句因為不滿足掃瞄記錄數的約束而不會記錄到慢日誌中,這就是為什麼該值為 10 的時候,慢日誌檔案中並沒有 10 條記錄。因為這 10 條中有 8 條 sql 語句由於掃瞄記錄數太少並沒有被記錄。

這也解惑了上圖中 359 這個數字,它是這個時間窗內不走索引的 sql 語句總數。所以,log_throttle_queries_not_using_indexes 是個很關鍵的引數,設定不當會無法正常記錄不走索引的慢查詢,導致慢日誌功能部分失效。所以,使用者首先需盡可能避免出現大量不走索引的 sql 語句,可以通過 rds 健康檢查功能進行優化,再次,若出現慢日誌中存在上述提示,應該調大 log_throttle_queries_not_using_indexes 的值,以便以進一步分析問題。

mysql慢日誌解析 mysql 慢日誌分析

啟用 slow log 有兩種啟用方式 1,在my.cnf 裡 通過 log slow queries file name 2,在mysqld程序啟動時,指定 log slow queries file name 選項 比較的五款常用工具 mysqldumpslow,mysqlsla,myprofi...

mysql慢查詢日誌分析

mysql 有乙個功能就是可以log下來執行的比較慢的sql語句,預設是沒有這個log的,為了開啟這個功能,要修改my.cnf或者在mysql啟動的時候加入一些引數。如果在my.cnf裡面修改,需增加如下幾行 long query time 10 log slow queries long quer...

mysql慢查詢日誌分析

我喜歡做一些系統效能優化事情,覺得這樣有種成就感,實現了自己的價值。所以經常到系統上去top netstat uptime看看系統執行的狀況。今天我對mysql資料庫進行索引建立。mysql的慢查詢日誌是我部署環境時就開啟了的。mysqldumpslow是對慢查詢日誌進行統計的工具,講一下有用的引數...