1. 程式人生 > >關於MySQL慢日誌,你想知道的都在這

關於MySQL慢日誌,你想知道的都在這

作者介紹

鄒鵬,現任職於騰訊雲資料庫團隊,負責騰訊雲資料庫MySQL中介軟體研發,多年的資料庫、網路安全研發經驗,對雲端計算平臺的網路、計算、儲存、安全有著深入的瞭解,在MySQL的高可用、高可靠、中介軟體方面有豐富的經驗。

MySQL

目錄:

  1. 什麼是慢日誌?
  2. 什麼情況下產生慢日誌?
  3. 慢日誌相關引數
  4. 慢日誌輸出內容
  5. 慢日誌分析工具
  6. 慢日誌的清理與備份

一、什麼是慢日誌?

MySQL的慢查詢日誌是MySQL提供的一種日誌記錄,它用來記錄在MySQL中響應時間超過閥值的語句,具體指執行時間超過long_query_time值的SQL,則會被記錄到慢查詢日誌中。long_query_time的預設值為10,意思是執行10s以上的語句。

預設情況下,MySQL資料庫並不啟動慢查詢日誌,需要我們手動來設定這個引數,當然,如果不是調優需要的話,一般不建議啟動該引數,因為開啟慢查詢日誌或多或少會帶來一定的效能影響。慢查詢日誌支援將日誌記錄寫入檔案,也支援將日誌記錄寫入資料庫表。

  • 5.6官方說明:https://dev.mysql.com/doc/refman/5.6/en/slow-query-log.html
  • 5.7官方說明:https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html

二、什麼情況下產生慢日誌?

慢日誌

看圖說話,有很多開關影響著慢日誌的生成,相關的引數後面會挨個說明。從上圖可以看出慢日誌輸出的內容有兩個,第一執行時間過長(大於設定的long_query_time閾值);第二未使用索引,或者未使用最優的索引。

這兩種日誌預設情況下都沒有開啟,特別是未使用索引的日誌,因為這一類的日誌可能會有很多,所以還有個特別的開關log_throttle_queries_not_using_indexes用於限制每分鐘輸出未使用索引的日誌數量。

關鍵程式碼如下:

程式碼

Slow log呼叫棧(MySQL 5.6.34 ):

Slow log

三、慢日誌相關引數

引數

以上應該是最完整的和慢日誌相關的所有引數,大多數引數都有前置條件,所以在使用的時候可以參照上面的流程圖。

5.6官方文件:

1、https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html

2、https://dev.mysql.com/doc/refman/5.6/en/server-options.html

四、慢日誌輸出內容

慢日誌

第一行:標記日誌產生的時間,準確說是SQL執行完成的時間點,改行記錄每一秒只打印一條。

第二行:客戶端的賬戶資訊,兩個使用者名稱(第一個是授權賬戶,第二個為登入賬戶),客戶端IP地址,還有mysqld的執行緒ID。

第三行:查詢執行的資訊,包括查詢時長,鎖持有時長,返回客戶端的行數,掃描行數。通常我需要優化的就是最後一個內容,儘量減少SQL語句掃描的資料行數。

第四行:通過程式碼看,貌似和第一行的時間沒有區別。

第五話:最後就是產生慢查詢的SQL語句。

–log-short-format=true:

如果mysqld啟動時指定了–log-short-format引數,則不會輸出第一、第二行。

log-queries-not-using-indexes=on

log_throttle_queries_not_using_indexes > 0 :

如果啟用了以上兩個引數,每分鐘超過log_throttle_queries_not_using_indexes配置的未使用索引的慢日誌將會被抑制,被抑制的資訊會被彙總,每分鐘輸出一次。

格式如下:

五、慢日誌分析工具

  1. 官方自帶工具: mysqldumpslow
  2. 開源工具:mysqlsla
  3. percona-toolkit:工具包中的pt-query-digest工具可以分析彙總慢查詢資訊,具體邏輯可以看SlowLogParser這個函式。

總的來說,MySQL的日誌內容本身不復雜,上面3個工具都是用perl指令碼實現,程式碼行數不超過200行,有興趣的同學也可以自己嘗試著解析下。

詳情可以參閱下這篇文章:

  • 《MySQL 慢查詢設定和分析工具 》:

    https://flyerboy.github.io/2016/12/23/mysql_slow/

以上工具可以支撐慢日誌的常用統計,但是當我們需要做到SQL級別的統計時,我們還需要取解析SQL把引數提取出來。

六、慢日誌的清理與備份

刪除:直接刪除慢日誌檔案,執行flush logs(必須的)。

備份:先用mv重新命名檔案(不要跨分割槽),然後執行flush logs(必須的)。

另外修改系統變數slow_query_log_file也可以立即生效;

執行flush logs,系統會先close當前的控制代碼,然後重新open;mv , rm日誌檔案系統並不會報錯,具體的原因可以Google下linux  i_count   i_nlink ;

文章來自微信公眾號:DBAplus社群