傳統做法 mv slow.log slow.log.bak; mysqladmin flush-logs 需重啟或發送信號。MySQL 5.1+ 支援**全域變數動態修改**,實現無重啟輪轉。
# 1. 關閉全域慢查詢日誌
SET GLOBAL slow_query_log = 0;
SHOW VARIABLES LIKE '%query_log%'; -- 確認 OFF
# 2. 設定新日誌文件路徑
SET GLOBAL slow_query_log_file = '/var/lib/mysql/mysql-slow_new.log';
# 3. 重新開啟慢查詢日誌
SET GLOBAL slow_query_log = 1;
SHOW VARIABLES LIKE '%query_log%'; -- 確認 ON,File 已變更
# 4. 歸檔舊文件
mv /var/lib/mysql/mysql-slow.log /var/lib/mysql/mysql-slow_$(date +%F).log
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/mysql-slow_new.log
long_query_time = 0.01
min_examined_row_limit = 1000
log_output = FILE
**注意**:動態修改 slow_query_log_file 重啟後會回退至 my.cnf 設定值,**必須同步修改 my.cnf** 才能永久生效。
# 測試慢查詢
USE information_schema;
SELECT * FROM tables; -- 耗時 1.1s,超過 0.01s 閾值
# 查看新日誌
cat /var/lib/mysql/mysql-slow_new.log
# 應包含 Time、User、Query_time、Lock_time、Rows_sent、Rows_examined、SQL 文本
| 參數 | 動態修改 | 說明 |
|---|---|---|
| slow_query_log | SET GLOBAL slow_query_log=1/0 | 開關 |
| long_query_time | SET GLOBAL long_query_time=0.5 | 閾值 (秒),支援微秒 |
| min_examined_row_limit | SET GLOBAL min_examined_row_limit=1000 | 忽略掃描行少的查詢 |
| log_queries_not_using_indexes | SET GLOBAL log_queries_not_using_indexes=1 | 記錄未用索引查詢 (慎開) |
pt-query-digest /var/lib/mysql/mysql-slow_new.log --limit 20 --output json > report.json
專業分析、聚合、排序、報表生成,運維必備。
掌握線上輪轉,慢查詢日誌管理不再需停機維護窗口。