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

2021-09-07 19:00:32 字數 3508 閱讀 9054

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-% 效能損耗

mysql的慢查詢日誌功能 MySQL 慢查詢日誌

簡介 mysql 慢查詢日誌是排查問題 sql 語句,以及檢查當前 mysql 效能的乙個重要功能。檢視是否開啟慢查詢功能 mysql mysql show variables like slow query variable name value slow query log off slow q...

mysql的慢查詢日誌功能 MySQL 慢查詢日誌

mysql 慢查詢日誌 簡介mysql 慢查詢日誌是排查問題 sql 語句,以及檢查當前 mysql 效能的乙個重要功能。檢視是否開啟慢查詢功能 mysql show variables like slow query variable name value slow query log off s...

mysql的慢查詢日誌功能 Mysql慢查詢日誌

mysql慢查詢日誌 資料庫的慢查詢是影響專案效能的一大因素,對於資料庫我們要優化sql,首先要找到需要優化的sql,這就需要我們知道sql執行時間等資訊,除了使用show profiles 外,mysql也提供了 慢查詢日誌 功能,用來記錄查詢時間超過某個設定值的sql,這將極大程度幫助我們快速定...