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

民工哥技術之路發表於2018-08-03

對於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下,刪除了預設的日誌檔案(或者重新命名了原日誌檔案),要想再次生成日誌檔案

  • 可以使用mysqladmin flush-logs
  • 是SQL命令flush slow logs;flush general logs;
  • 重啟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。

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

相關文章