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。
備註: