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

MySQL 開啟一般查詢日誌 (General Log) 追蹤執行 SQL 完整教學

     編輯:MySQL 綜合教學

為什麼需要 General Log?

不同於 SQL Server 的 Profiler,MySQL 內建 General Query Log 記錄所有客戶端連線與執行的 SQL 語句,是排查應用行為、效能分析、審計的利器。

Windows 環境配置 (my.ini)

  1. 找到 my.ini (通常在 MySQL 安裝目錄,如 G:\Program Files\MySQL\MySQL Server 5.0\)。
  2. 在 [mysqld] 區段新增:
    log = "G:/Program Files/MySQL/MySQL Server 5.0/data/mysql.log"
  3. 儲存檔案,重啟 MySQL 服務。
  4. 日誌檔將自動建立於指定路徑 (如 data/mysql.log)。

Linux 環境配置 (my.cnf)

  1. 編輯 /etc/my.cnf (或 /etc/mysql/my.cnf)。
  2. 在 [mysqld] 區段新增:
    log = /var/log/mysql/mysql.log
  3. 確保目錄存在且 MySQL 進程有寫入權限:
    mkdir -p /var/log/mysql && chown mysql:mysql /var/log/mysql
  4. 重啟服務:systemctl restart mysqld。

動態開啟/關閉 (無需重啟,MySQL 5.1+)

-- 開啟
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/log/mysql/mysql.log'; -- 可選,指定檔案

-- 關閉
SET GLOBAL general_log = 'OFF';

動態修改即時生效,適合臨時排查。

日誌內容範例

2024-01-15 10:30:45  123 Connect  app_user@192.168.1.5 on test_db
2024-01-15 10:30:45  123 Query    SELECT * FROM users WHERE id = 1
2024-01-15 10:30:46  123 Query    UPDATE orders SET status = 2 WHERE id = 100
2024-01-15 10:30:46  123 Quit

欄位:時間、執行緒 ID、命令類型、SQL 內容。

⚠️ 生產環境警示

  • 效能影響:高併發下大量 I/O 寫入會拖慢資料庫。
  • 磁碟暴增:未切割日誌會佔滿磁碟。
  • 敏感資料:SQL 含明文密碼、個資,需嚴格權限控管。

建議:
1. 僅臨時開啟排查,用畢即關。
2. 生產長期審計請用 Audit Plugin 或 Binlog (行基礎)。
3. 配合 logrotate 定期切割壓縮。

快速查看技巧

# 即時追蹤
tail -f /var/log/mysql/mysql.log

# 過濾特定表
grep -i "from users" /var/log/mysql/mysql.log

# 統計最高頻 SQL
awk '/Query/ {print $0}' /var/log/mysql/mysql.log | sort | uniq -c | sort -nr | head -20

善用 General Log 追蹤 SQL,搭配動態開關與日誌切割,讓排查更高效且安全。

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