通用查詢日誌記錄所有客戶端連接與執行的 SQL,對審計、問題追蹤極有價值。MySQL 5.1.6+ 支援動態修改日誌開關、輸出目標與路徑,無需重啟。
| 變數 | 說明 | 預設值 |
|---|---|---|
log_output | 輸出目標:FILE、TABLE、FILE,TABLE、NONE | FILE |
general_log | 開關:ON/OFF | OFF |
general_log_file | 檔案路徑(僅 FILE 模式生效) | host_name.log |
-- 1. 設定輸出到檔案 SET GLOBAL log_output = 'FILE'; SET GLOBAL general_log_file = '/tmp/general.log'; -- 2. 開啟日誌 SET GLOBAL general_log = ON; -- 3. 執行業務 SQL... SELECT * FROM tempdb.tb1; -- 4. 關閉日誌 SET GLOBAL general_log = OFF;
/usr/sbin/mysqld, Version: 5.5.39-log. started with: Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock Time Id Command Argument 141003 16:18:55 4 Query select * from tempdb.tb1
SET GLOBAL log_output = 'TABLE'; -- 查詢 mysql.general_log 表 SELECT thread_id, command_type, argument FROM mysql.general_log WHERE argument LIKE '%tb1%';
表結構:
+--------------+------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------------+------+-----+-------------------+-----------------------------+ | event_time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | | user_host | mediumtext | NO | | NULL | | | thread_id | int(11) | NO | | NULL | | | server_id | int(10) unsigned | NO | | NULL | | | command_type | varchar(64) | NO | | NULL | | | argument | mediumtext | NO | | NULL | | +--------------+------------------+------+-----+-------------------+-----------------------------+
SET GLOBAL log_output = 'FILE,TABLE'; -- 同時寫入檔案與 mysql.general_log 表
mv hostname.log hostname-old.log mysqladmin flush-logs cp hostname-old.log /backup/ rm hostname-old.log
必須先停止服務,重命名檔案,再啟動服務建立新日誌。
SET GLOBAL general_log = OFF; -- 關閉開關,無論 log_output 為何值均不再記錄 SET GLOBAL log_output = 'NONE'; -- 進一步禁用輸出通道
驗證:執行 DML 後檢查檔案與表均無新記錄。
TRUNCATE TABLE mysql.general_log。mysql.general_log 表預設為 CSV 引擎,任何有 SELECT 權限的用戶可讀取,敏感環境需限制訪問。