首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 日誌輪轉 (Log Rotation) 實戰:Shell 腳本保留 7 天自動清理

     編輯:MySQL 綜合教學

背景

General Log、Slow Query Log 等文本日誌若不切割,會無限增長佔滿磁碟。MySQL 原生僅支援 FLUSH LOGS 重新開啟檔案,不自動刪除舊檔。需自行實作輪轉保留策略。

核心原理

  1. 重命名 當前日誌檔 (加日期/星期後綴)。
  2. 執行 mysqladmin flush-logs 讓 MySQL 產生新的空日誌檔繼續寫入。
  3. 利用星期數 (0-6) 作為後綴,次週同一天自動覆蓋上週檔案,天然保留 7 天,無需額外刪除邏輯。

前置準備:建立專用輪轉帳號

GRANT RELOAD ON *.* TO 'logrot'@'localhost' IDENTIFIED BY 'strong_password';
FLUSH PRIVILEGES;

RELOAD 權限允許執行 FLUSH LOGS (即 mysqladmin flush-logs)。

輪轉 Shell 腳本 (log_rotate.sh)

#!/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}"

部署步驟

  1. 存為 /usr/local/sbin/log_rotate.sh,賦予執行權:
    chmod +x /usr/local/sbin/log_rotate.sh
  2. 測試執行:
    /usr/local/sbin/log_rotate.sh /usr/local/mysql/mysql.log
  3. 加入 crontab 定時執行 (每天凌晨 00:10):
    10 0 * * * /usr/local/sbin/log_rotate.sh /usr/local/mysql/mysql.log
    10 0 * * * /usr/local/sbin/log_rotate.sh /usr/local/mysql/mysql-slow.log

驗證效果

ls -lh /usr/local/mysql/mysql.log*
# 輸出範例:
# mysql.log          (新產生、正在寫入)
# mysql.log_0        (上週日)
# mysql.log_1        (上週一)
# ...
# mysql.log_6        (上週六)

進階:配合 logrotate (系統標準工具)

若偏好不寫腳本,可用 /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。

注意事項

  • Error Log (log-error) 由 mysqld_safe 管理,**無法** 用 flush-logs 輪轉,需修改配置重啟或用 logrotate copytruncate 模式。
  • Binlog 輪轉靠 expire_logs_days / max_binlog_size 自動管理,**不要**手動 mv/rm。
  • 腳本執行期間極短暫可能丟失幾行日誌 (mv 到 flush-logs 間隙),可接受。

實作簡單的星期輪轉腳本或善用 logrotate,輕鬆解決 MySQL 文本日誌無限增長問題,保障磁碟空間與可追溯性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved