長期運行的 MySQL 會產生大量日誌(一般查詢日誌、慢查詢日誌、二進制日誌、錯誤日誌),若不輪轉會佔滿磁碟。本文示範用 mysqladmin flush-logs 搭配 Shell 腳本實現「按天輪轉、只保留 7 天」。
mysql> SHOW GLOBAL VARIABLES LIKE '%log%';
關鍵變數:general_log_file、slow_query_log_file、log_bin、log_error。
注意:log_error(mysqld.log)無法用 flush-logs 重開,需靠系統 logrotate 管理。
GRANT RELOAD ON *.* TO 'logrot'@'localhost' IDENTIFIED BY 'strong_password';
FLUSH PRIVILEGES;
RELOAD 權限對應 FLUSH LOGS 操作。
/usr/local/bin/mysql_log_rotate.sh#!/bin/bash
# MySQL 日誌輪轉:保留 7 天(按星期數 0-6 命名,次週自動覆蓋)
LOG_FILE="$1"
[ -f "$LOG_FILE" ] || { echo "Log file not exist: $LOG_FILE"; exit 1; }
DB_USER="logrot"
DB_PASS="strong_password"
BIN_DIR="/usr/local/mysql/bin"
DAY_OF_WEEK=$(date +%w) # 0=Sun ... 6=Sat
mv "${LOG_FILE}" "${LOG_FILE}_${DAY_OF_WEEK}"
${BIN_DIR}/mysqladmin -u${DB_USER} -p${DB_PASS} flush-logs
echo "Rotated ${LOG_FILE} -> ${LOG_FILE}_${DAY_OF_WEEK}"
授權執行:chmod +x /usr/local/bin/mysql_log_rotate.sh
/usr/local/bin/mysql_log_rotate.sh /usr/local/mysql/mysql.log
ls -l /usr/local/mysql/mysql.log*
# 輸出:mysql.log mysql.log_3 (假設今天是星期三)
# 每天 00:10 輪轉一般查詢日誌與慢查詢日誌
10 0 * * * /usr/local/bin/mysql_log_rotate.sh /usr/local/mysql/mysql.log
10 0 * * * /usr/local/bin/mysql_log_rotate.sh /usr/local/mysql/mysql-slow.log
在 my.cnf 設定:
[mysqld]
expire_logs_days = 7
max_binlog_size = 1G
MySQL 會自動清理超過 7 天的 binlog,無需額外腳本。
/var/log/mysqld.log {
daily
rotate 7
compress
missingok
notifempty
create 640 mysql mysql
sharedscripts
postrotate
/usr/local/mysql/bin/mysqladmin -u logrot -p'strong_password' flush-logs 2>/dev/null || true
endscript
}
存為 /etc/logrotate.d/mysql-error,系統每天自動處理。
flush-logs + 7 天覆蓋。expire_logs_days 參數自動管理。logrotate 管理。