對於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。