MySQL通常查詢日誌或者慢查詢日誌歷史數據的清理

 

general log&slow query logmysql

對於MySQL的通常查詢日誌和慢查詢日誌,開啓比較簡單,其中公用的一個參數是log_output,log_output控制着慢查詢和通常查詢日誌的輸出方向
能夠是表(mysql.general_log,mysql.slow_log)或者文件(有參數general_log_file和slow_query_log_file配置決定)
或者同時輸出到表和文件(想不明白,何時須要同時輸出到表和文件)。
可是二者受log_output參數影響,輸出的目標老是一致的,也就是要麼都寫入表,或者要麼都寫入文件,不會一個輸出到表,一個輸出到文件。linux

--slow log 相關參數
select * 
from performance_schema.global_variables 
where variable_name in
('slow_query_log','log_output','slow_query_log_file','long_query_time')

--general log 相關參數
select * 
from performance_schema.global_variables 
where variable_name in
('general_log','log_output','general_log_file')

對於上述兩種日誌,系統默認不會清理,所以在開啓了相關日誌以後,須要人爲清理。sql

如何清理歷史general log&slow query log數據庫

1,當輸出目標爲表的時候windows

  沒法直接刪除,若是直接刪除的話,會出現「ERROR 1556 (HY000): You can't use locks with log tables.」的錯誤提示併發

  

以general log爲例,須要先關閉general_log,而後重命名general_log這個表,
 性能

在對重命名以後的表執行刪除,最後在重命名回來,最後開啓general_log(若是有必要的話)測試

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
DELETE FROM general_log_temp WHERE event_time < DATE(NOW());
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';


--slow log 同理
SET GLOBAL slow_query_log = 'OFF';
RENAME TABLE slow_log TO slow_log_temp;
DELETE FROM slow_log_temp WHERE start_time < DATE(NOW());
RENAME TABLE slow_log_temp TO slow_log;
SET GLOBAL slow_query_log = 'ON';

  若是對重命名以後的表(general_log或者是slow_log)沒有再次重命名回來,會發生什麼?
  參加以下截圖,若是沒有找到對應的表(general_log或者是slow_log),在輸出目標爲表的狀況下,會提示沒法找到對應的表,將沒法開啓對應的日誌spa

2,當輸出目標爲文件的時候3d

  當輸出目標爲文件的時候,在linux下,直接使用rm命名刪除便可,若是在開啓了通常查詢日誌或者是慢查詢日誌,刪除對應的日誌文件,並不影響數據庫的正常使用
  網上有說須要中止MySQL服務而後重命名文件而後在建立新的文件啥的,在Linux下並非必須的,不知道在windows下是什麼狀況,沒興趣試。
  固然也不是說就建議始終這種暴力的方式清理日誌文件,
  在Linux下,刪除了默認的日誌文件(或者重命名了原日誌文件),要想再次生成日誌文件
  1,可使用mysqladmin flush-logs
  2,是SQL命令flush slow logs;flush general logs;
  3,重啓MySQL服務
  都可從新生成對應的日誌文件。

注意:當對應的文件是存在的時候,上述命名執行以後是沒有影響的(也不會清理對應的日誌文件)

 


 

如下偏離主題

當輸出目標爲表的時候的解析

  無論是general_log或者是slow_log,對應的SQL語句都是二進制格式的,須要使用convert(sql_text using UTF8)作一個轉換,才變得具備可讀性。

 

當輸出目標爲表的時候對性能的影響

  據我的測試,在請求量不大的數據庫上,開啓general_log或者是slow_log,對性能影響並無很是明顯。
  理論家們一方面強調說MySQL的處理併發上多強悍,一方面又說開啓general_log對性能影響很大,會不會自相矛盾呢?
  關於general_log,在zabbix監控下,測試環境TPS不過百的狀況下(每秒寫入general log不超過100條數據),開啓general_log以後並CPU負載幾乎沒有變化,CPU高點是在作其餘壓力測試。
  尤爲是slow_log這種寫入不是太頻繁的日誌,直接寫入到表中,對性能的影響有限,比後面再去花時間解析文件……  
  固然不排除TPS在上千或者上萬甚至更高以後,開啓general_log會產生較大的影響,固然沒事也不會閒的蛋疼去開general_log。

  

 

 

備註:

直接rm掉general log&slow query log 並無實際刪除文件,磁盤空間也不會釋放。mysql進程會繼續持有,而且持續往裏寫數據。lsof看一下就知道了
壓力大的狀況下 大概30-% 性能損耗
相關文章
相關標籤/搜索