通用查詢日志記錄所有 SQL 語句,是排查「最常執行語句」「應用行為異常」的利器,但會產生海量日志、影響性能。本文演示動態開啟、輸出到文件/表、Python 腳本統計 Top SQL、日志輪轉清理的完整操作鏈路。
-- 5.6+ 支援運行時修改 SET GLOBAL general_log = ON; SET GLOBAL log_output = 'FILE'; -- 或 'TABLE'、'FILE,TABLE' SET GLOBAL general_log_file = '/tmp/general.log';
驗證:
tail -f /tmp/general.log # 輸出示例 140814 10:56:44 3 Query SELECT * FROM mysql.general_log
mysql.general_logSET GLOBAL log_output = 'TABLE'; SELECT * FROM mysql.general_log \G; -- 欄位:event_time, user_host, thread_id, server_id, command_type, argument
# analysis-general-log.py 核心邏輯:提取 argument 欄位,去除參數值歸一化 python analysis-general-log.py general.log | sort | uniq -c | sort -nr
輸出 Top 20 示例:
1032 SELECT * FROM wp_comments WHERE (comment_approved = 'x' OR ...) AND comment_post_ID = x ORDER BY comment_date_gmt DESC 653 SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id in (x) ORDER BY meta_id ASC 527 SELECT FOUND_ROWS() 438 SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ...
USE mysql; CREATE TABLE gn2 LIKE general_log; RENAME TABLE general_log TO oldLogs, gn2 TO general_log; -- oldLogs 可備份後 DROP
文件模式下:
mv /tmp/general.log /tmp/general.log.$(date +%F) mysqladmin flush-logs # 重新打開文件句柄
log_output=TABLE 便於 SQL 查詢分析。