SET GLOBAL slow_query_log=1; 後,日志文件膨脹至 700MB,多為 0.1 秒級查詢。mysql> SHOW VARIABLES LIKE '%query%'; +------------------------------+---------------------------------+ | Variable_name | Value | +------------------------------+---------------------------------+ | slow_query_log | OFF | <-- 仍為 OFF! | slow_query_log_file | /MYSQLDATA/mysql_slow_query.log | | long_query_time | 5.000000 | <-- 閾值生效了 | ... | ... | +------------------------------+---------------------------------+
# 1. 創建文件並授權 mkdir -p /MYSQLDATA touch /MYSQLDATA/mysql_slow_query.log chown mysql:mysql /MYSQLDATA /MYSQLDATA/mysql_slow_query.log # 2. 確認配置區塊正確 grep -A5 '^\[mysqld\]' /etc/my.cnf | grep slow_query_log # 必須在 [mysqld] 區塊 # 3. 重啟服務 (或動態開啟) systemctl restart mysqld # 或 mysql> SET GLOBAL slow_query_log=1; # 此時應成功 # 4. 驗證 mysql> SHOW VARIABLES LIKE 'slow_query_log'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | slow_query_log | ON | +------------------+-------+
| 項目 | 建議 |
|---|---|
| 日志目錄 | 獨立掛載點 /var/log/mysql/ 或 /data/mysql/log/,避免佔滿根分區 |
| 權限模型 | 目錄 mysql:mysql 750,文件 mysql:mysql 640 |
| 輪轉策略 | logrotate 每日切割、壓縮、保留 30 天,postrotate 執行 mysqladmin flush-logs |
| 閾值設置 | 核心交易庫 long_query_time=1 (秒);分析庫可設 0.1 或 0 (全記錄) |
| 不走索引記錄 | log_queries_not_using_indexes=ON 配合 log_throttle_queries_not_using_indexes=60 (每分鐘限 60 條) 防刷日志 |
| 輸出到 TABLE | log_output=TABLE 寫入 mysql.slow_log 表,便于 SQL 查詢分析,需定期 TRUNCATE 清理 |
| 分析工具 | pt-query-digest (Percona Toolkit) / mysqldumpslow / MySQL Workbench 圖形化分析 |
MySQL 慢查詢日志「三大坑」:**文件不自建、權限要匹配、區塊別放錯**。
標準化交付時,將touch + chown + logrotate寫入 Ansible/Shell 腳本,**配置區塊強制審查**,上線前必跑SET GLOBAL slow_query_log=1; SELECT 1;煙霧測試。
慢查詢日志是性能優化的「體檢報告」,管好它的生成、輪轉、分析閉環,才能讓數據庫長期健康運行。