首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 通用查詢日志 (General Log) 啟用、配置與性能影響全解析

     編輯:MySQL 綜合教學

MySQL 通用查詢日志 (General Log) 啟用、配置與性能影響全解析

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 vs TABLE

模式優點缺點適用場景
FILE文本可讀、易歸檔分析、不佔用表空間大量 IO、需手動切割/清理短期調試、審計歸檔
TABLE可用 SQL 查詢過濾、自動輪轉 (配合 mysql.general_log 表分區)佔用 InnoDB 空間、寫入同樣產生 Redo Log、查詢慢程序化分析、需 JOIN 過濾
NONE不寫入任何目標 (但仍消耗 CPU 格式化)無日志產出暫停寫入但保持開關開啟

雙目標:log_output = 'FILE,TABLE' 同時寫入文件和表。

五、 WAMP/Windows 環境快速啟用

-- 在 MySQL 命令行或客戶端執行
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = 'E:/my.log';  -- Windows 路徑用正斜槓或雙反斜槓

六、 性能影響與生產環境禁忌

  • 同步寫入:每條 SQL 發送給服務器後、解析前即同步寫入日志 (含 SELECT),單線程串行,極大增加延遲。
  • 磁盤 IO 飆升:高併發下日志文件成為寫入熱點,導致數據文件、Redo Log 爭搶 IO 帶寬。
  • 空間暴增:繁忙庫每天產生數 GB 甚至數十 GB 日志,撐爆磁盤。

⚠️ 生產環境嚴禁長期開啟 General Log!

七、 替代方案:獲取 SQL 的低成本途徑

  1. Slow Query Log (慢查詢日志):
    slow_query_log = 1
    long_query_time = 0.1  -- 閾值 100ms,甚至 0 記錄所有
    log_queries_not_using_indexes = ON

    僅記錄超時/無索引查詢,性能影響可控,覆蓋 99% 調優場景。

  2. Performance Schema (events_statements_history_long):
    UPDATE performance_schema.setup_consumers SET ENABLED='YES' WHERE NAME LIKE 'events_statements_history%';

    內存環形緩衝區,無磁盤 IO,可查最近 N 條完整 SQL、執行時間、鎖等待、掃描行數。

  3. Binary Log (Binlog):binlog_format=ROW 記錄所有數據變更,可用 mysqlbinlog 解析回放,不記錄 SELECT。
  4. Proxy/中間件审计:MyCat、ProxySQL、MaxScale 內建審計模塊,應用無感、集中管理。
  5. 應用層埋點:ORM 框架 (Hibernate、MyBatis、EntityFramework) 攔截器記錄執行 SQL、參數、耗時,最精準、零資料庫開銷。

八、 日志維護與切割

-- 手動切割 (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 保留為最後手段。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved