前言 最近在嘗試一個日誌系統graylog來收集mysql的慢查詢日誌提,供後續的分析、監控和報警等。測試步驟已經到日誌已成功收集到graylog,測試時需要刷一些慢查詢日誌出來。為了刷比較多的日誌和不對測試環境造成較大的影響,想到了使用mysql的sleep函數結合event來做刷慢日誌。 MyS ...
前言
最近在嘗試一個日誌系統graylog來收集mysql的慢查詢日誌提,供後續的分析、監控和報警等。測試步驟已經到日誌已成功收集到graylog,測試時需要刷一些慢查詢日誌出來。為了刷比較多的日誌和不對測試環境造成較大的影響,想到了使用mysql的sleep函數結合event來做刷慢日誌。
MySQL的計劃任務是通過event來完成的。相當於SQL Server 的Job。下麵是實現過程:
打開mysql的慢日誌
set global slow_query_log = 1; set global long_query_time = 1;
也可以在配置文件議開啟慢日誌(建議開啟)
創建event
-
啟用event事件功能。
set global event_scheduler = 1;
-
創建event,每1秒執行一次。
delimiter $$ create or replace EVENT event_flush_slow_log ON SCHEDULE EVERY 1 SECOND on completion preserve ENABLE do begin SELECT SLEEP(1); end; $$ delimiter ;
查詢event
show events where Name like '%event_flush_slow_log%'\G; 或 select * from information_schema.events where event_name='event_flush_slow_log'\G;
-
開啟這個event
ALTER EVENT event_flush_slow_log ENABLE;
可以看到慢日誌一直在寫入了。
# Time: 180126 12:19:57 # User@Host: root[root] @ localhost [localhost] # Thread_id: 1640 Schema: db1 QC_hit: No # Query_time: 1.000645 Lock_time: 0.000269 Rows_sent: 1 Rows_examined: 0 # Rows_affected: 0 SET timestamp=1516940397; SELECT SLEEP(1); # Time: 180126 12:19:58 # User@Host: root[root] @ localhost [localhost] # Thread_id: 1641 Schema: db1 QC_hit: No # Query_time: 1.000575 Lock_time: 0.000203 Rows_sent: 1 Rows_examined: 0 # Rows_affected: 0 SET timestamp=1516940398; SELECT SLEEP(1); # Time: 180126 12:19:59 # User@Host: root[root] @ localhost [localhost] # Thread_id: 1642 Schema: db1 QC_hit: No # Query_time: 1.000856 Lock_time: 0.000180 Rows_sent: 1 Rows_examined: 0 # Rows_affected: 0 SET timestamp=1516940399; SELECT SLEEP(1);
-
完成後,關閉event
ALTER EVENT event_flush_slow_log DISABLE;
-
假如不需要這個event,可以刪除
DROP EVENT IF EXISTS event_flush_slow_log;
關於sleep函數和event的詳細用法,請參考相關文檔,這裡不再展開。
定時刷慢日誌也可以使用Linux crontab調用腳本來做,但每1秒都要登錄一次MySQL來執行一次慢查詢,消耗資源較大,不建議這樣做吧。