萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 開啟 SQL 執行日志記錄:General Log 動態配置與生產環境替代方案

快速啟用:配置文件法(需重啟)

# /etc/my.cnf 或 /etc/mysql/my.cnf
[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/sql_query.log
# 或
log = /var/lib/mysql/sql_query.log  # 5.7 兼容寫法

# 重啟生效
systemctl restart mysqld

無需重啟:運行時動態開啟(推薦)

-- 開啟
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/lib/mysql/sql_query.log';

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

✅ 即時生效,無需重啟服務,適合生產環境短期排查。

日志內容樣本

/usr/sbin/mysqld, Version: 5.7.31 (MySQL Community Server). started with:
Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
2024-01-15T10:30:01  10 Connect   root@localhost on testdb
2024-01-15T10:30:01  10 Query     SELECT @@version_comment LIMIT 1
2024-01-15T10:30:02  10 Query     SELECT * FROM users WHERE id = 1
2024-01-15T10:30:05  10 Quit

⚠️ 生產環境風險警示

  • IO 暴增:高併發下每秒寫入大量日志,磁碟 IO 成為瓶頸
  • 磁碟爆滿:無自動輪轉/大小限制,極快填滿磁碟導致資料庫掛起
  • 敏感資料洩露:完整記錄 SQL 含參數值,可能包含密碼、PII
  • 效能下降 20-50%+:同步寫入日志阻塞工作線程

生產環境替代方案

方案一:慢查詢日志(標準配置)

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0.5
log_queries_not_using_indexes = 1
min_examined_row_limit = 100

僅記錄問題 SQL,效能影響極小。

方案二:Binlog + mysqlbinlog 審計

-- Binlog 記錄所有 DML/DDL(ROW 格式含完整行變更)
mysqlbinlog --base64-output=decode-rows -v \
  --start-datetime="2024-01-15 10:00:00" \
  --stop-datetime="2024-01-15 11:00:00" \
  mysql-bin.000123 | grep -A5 -B5 "sensitive_table"

方案三:審計插件

  • MariaDB Audit Plugin:server_audit=ON,支援過濾用戶/資料庫/表/操作類型,輸出 JSON/CSV
  • MySQL Enterprise Audit:官方商業版功能
  • Percona Audit Log Plugin:開源相容

方案四:Proxy 層攔截

  • ProxySQL:規則引擎記錄/過濾/改寫 SQL
  • MyCat / ShardingSphere:中間件層面審計

方案五:應用層埋點

在 ORM/DAO 層統一攔截記錄:執行 SQL、參數、耗時、呼叫堆疊。對資料庫零侵入,彈性最高。

總結建議

  1. 排查具體問題 → 動態開啟 General Log 10-30 分鐘 → 立即關閉 → 分析完刪除日志文件
  2. 長期審計 → 部署審計插件或 ProxySQL
  3. 效能基線 → 慢查詢日志 + pt-query-digest 定期分析
  4. 合規留存 → Binlog 歸檔 + 定期離線分析
copyright © 萬盛學電腦網 all rights reserved