General Log (通用查詢日志) 記錄服務器收到的所有客戶端連接、斷開、SQL 語句 (含未執行/錯誤語句),是排查應用行為、審計操作、調試「發生了什麼 SQL」的利器。但因全量寫入磁盤,**嚴重影響寫入性能**,生產環境需極謹慎使用。本文詳細說明啟用方式、輸出目標切換、動態管理及替代方案。
SHOW VARIABLES LIKE '%general_log%';
+------------------+--------------------------------+
| Variable_name | Value |
+------------------+--------------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/hostname.log |
+------------------+--------------------------------+
SHOW VARIABLES LIKE 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE | -- 可選 FILE, TABLE, NONE
+---------------+-------+
-- 開啟
SET GLOBAL general_log = 'ON';
-- 或
SET GLOBAL general_log = 1;
-- 指定日志文件路徑 (需權限寫入)
SET GLOBAL general_log_file = '/data/logs/mysql_general.log';
-- 關閉
SET GLOBAL general_log = 'OFF';
編輯 my.cnf ([mysqld] 區段):
[mysqld]
general_log = 1
general_log_file = /data/logs/mysql_general.log
log_output = FILE -- 或 TABLE (寫入 mysql.general_log 表)
| 模式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
FILE | 文本可讀、易歸檔分析、不佔用表空間 | 大量 IO、需手動切割/清理 | 短期調試、審計歸檔 |
TABLE | 可用 SQL 查詢過濾、自動輪轉 (配合 mysql.general_log 表分區) | 佔用 InnoDB 空間、寫入同樣產生 Redo Log、查詢慢 | 程序化分析、需 JOIN 過濾 |
NONE | 不寫入任何目標 (但仍消耗 CPU 格式化) | 無日志產出 | 暫停寫入但保持開關開啟 |
雙目標:log_output = 'FILE,TABLE' 同時寫入文件和表。
-- 在 MySQL 命令行或客戶端執行
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = 'E:/my.log'; -- Windows 路徑用正斜槓或雙反斜槓
SELECT),單線程串行,極大增加延遲。⚠️ 生產環境嚴禁長期開啟 General Log!
slow_query_log = 1
long_query_time = 0.1 -- 閾值 100ms,甚至 0 記錄所有
log_queries_not_using_indexes = ON
僅記錄超時/無索引查詢,性能影響可控,覆蓋 99% 調優場景。
UPDATE performance_schema.setup_consumers SET ENABLED='YES' WHERE NAME LIKE 'events_statements_history%';
內存環形緩衝區,無磁盤 IO,可查最近 N 條完整 SQL、執行時間、鎖等待、掃描行數。
binlog_format=ROW 記錄所有數據變更,可用 mysqlbinlog 解析回放,不記錄 SELECT。-- 手動切割 (FILE 模式)
mv /data/logs/mysql_general.log /data/logs/mysql_general.log.$(date +%F)
mysqladmin flush-logs -- 通知 MySQL 重新打開文件句柄
-- 定時任務 (cron) 每天切割壓縮
0 0 * * * /usr/local/bin/mysql-log-rotate general
General Log 是「核彈級」調試工具:**開啟即用、用完即關、指定輸出路徑、監控磁盤空間**。日常排查首選 Slow Log + Performance Schema + 應用層埋點,將 General Log 保留為最後手段。