General Log、Slow Query Log 等文本日誌若不切割,會無限增長佔滿磁碟。MySQL 原生僅支援 FLUSH LOGS 重新開啟檔案,不自動刪除舊檔。需自行實作輪轉保留策略。
mysqladmin flush-logs 讓 MySQL 產生新的空日誌檔繼續寫入。GRANT RELOAD ON *.* TO 'logrot'@'localhost' IDENTIFIED BY 'strong_password';
FLUSH PRIVILEGES;
RELOAD 權限允許執行 FLUSH LOGS (即 mysqladmin flush-logs)。
#!/bin/bash
# MySQL 日誌輪轉 - 保留 7 天 (按星期覆蓋)
# 用法: ./log_rotate.sh /path/to/mysql.log
set -euo pipefail
LOG_FILE="${1:-}"
if [[ -z "$LOG_FILE" ]]; then
echo "Usage: $0 "
exit 1
fi
if [[ ! -f "$LOG_FILE" ]]; then
echo "Log file not exist: $LOG_FILE"
exit 1
fi
# 配置區 (請依環境修改)
MYSQL_ADMIN="/usr/local/mysql/bin/mysqladmin"
DB_USER="logrot"
DB_PASS="strong_password"
BIN_DIR="/usr/local/mysql/bin"
# 取得星期數 (0=Sun .. 6=Sat)
WEEK_DAY=$(date +%w)
# 1. 備份當前日誌 (加星期後綴)
mv "${LOG_FILE}" "${LOG_FILE}_${WEEK_DAY}"
# 2. 觸發 MySQL 產生新日誌
"${BIN_DIR}/mysqladmin" -u"${DB_USER}" -p"${DB_PASS}" flush-logs
echo "$(date) Rotated ${LOG_FILE} -> ${LOG_FILE}_${WEEK_DAY}"
/usr/local/sbin/log_rotate.sh,賦予執行權:chmod +x /usr/local/sbin/log_rotate.sh/usr/local/sbin/log_rotate.sh /usr/local/mysql/mysql.logcrontab 定時執行 (每天凌晨 00:10):10 0 * * * /usr/local/sbin/log_rotate.sh /usr/local/mysql/mysql.log10 0 * * * /usr/local/sbin/log_rotate.sh /usr/local/mysql/mysql-slow.logls -lh /usr/local/mysql/mysql.log*
# 輸出範例:
# mysql.log (新產生、正在寫入)
# mysql.log_0 (上週日)
# mysql.log_1 (上週一)
# ...
# mysql.log_6 (上週六)
若偏好不寫腳本,可用 /etc/logrotate.d/mysql:
/var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 640 mysql mysql
sharedscripts
postrotate
/usr/local/mysql/bin/mysqladmin -ulogrot -p'password' flush-logs > /dev/null 2>&1 || true
endscript
}
logrotate 每天跑一次,自動壓縮、保留 7 份,並觸發 flush-logs。
log-error) 由 mysqld_safe 管理,**無法** 用 flush-logs 輪轉,需修改配置重啟或用 logrotate copytruncate 模式。expire_logs_days / max_binlog_size 自動管理,**不要**手動 mv/rm。實作簡單的星期輪轉腳本或善用 logrotate,輕鬆解決 MySQL 文本日誌無限增長問題,保障磁碟空間與可追溯性。