1. 程式人生 > >MySQL一般查詢日誌或者慢查詢日誌歷史資料的清理

MySQL一般查詢日誌或者慢查詢日誌歷史資料的清理

general log&slow query log

對於MySQL的一般查詢日誌和慢查詢日誌,開啟比較簡單,其中公用的一個引數是log_output,log_output控制著慢查詢和一般查詢日誌的輸出方向
可以是表(mysql.general_log,mysql.slow_log)或者檔案(有引數general_log_file和slow_query_log_file配置決定)
或者同時輸出到表和檔案(想不明白,什麼時候需要同時輸出到表和檔案)。
但是兩者受log_output引數影響,輸出的目標總是一致的,也就是要麼都寫入表,或者要麼都寫入檔案,不會一個輸出到表,一個輸出到檔案。

--
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
')

對於上述兩種日誌,系統預設不會清理,因此在開啟了相關日誌之後,需要人為清理。

如何清理歷史general log&slow query log

1,當輸出目標為表的時候

  無法直接刪除,如果直接刪除的話,會出現“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),在輸出目標為表的情況下,會提示無法找到對應的表,將無法開啟對應的日誌

2,當輸出目標為檔案的時候

  當輸出目標為檔案的時候,在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-% 效能損耗