歡迎光臨
每天分享高質量文章

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

來源:MSSQL123 ,

www.cnblogs.com/wy123/p/9259783.html

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

  • 可以使用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。


●編號378,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

Web開發

更多推薦18個技術類公眾微信

涵蓋:程式人生、演算法與資料結構、黑客技術與網絡安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

赞(0)

分享創造快樂