首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL Binlog 佔滿磁碟空間緊急清理與長效配置:expire_logs_days 與 PURGE BINARY LOGS

     編輯:MySQL 資料庫相關知識

現象

  • 網站訪問越來越慢,最終無法訪問
  • df -h 顯示磁碟 100%
  • du -sh /var/lib/mysql 發現 mysql-bin.* 佔用絕大部分空間

方案一:設定自動過期 (長效)

-- 查看當前值 (預設 0 = 永不過期)
SHOW VARIABLES LIKE 'expire_logs_days';

-- 動態生效 (重啟失效)
SET GLOBAL expire_logs_days = 7;

-- 永久生效 (my.cnf)
[mysqld]
expire_logs_days = 7
# 或 MySQL 8.0+
binlog_expire_logs_seconds = 604800

方案二:手動清理 (緊急釋放空間)

-- 刪除指定檔案之前的所有 Binlog
PURGE MASTER LOGS TO 'mysql-bin.010';

-- 刪除指定時間之前的所有 Binlog
PURGE MASTER LOGS BEFORE '2023-06-22 13:00:00';
PURGE MASTER LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);

⚠️ 警告:若有從庫正在同步這些 Binlog,清理會導致從庫報錯斷開。執行前確認:

SHOW SLAVE STATUS\G  -- 確認 Master_Log_File / Read_Master_Log_Pos
SHOW PROCESSLIST;    -- 確認無佈署中的備份/同步任務

方案三:限制單檔大小與總量 (輔助)

[mysqld]
max_binlog_size = 100M          # 單檔上限 (預設 1GB)
# MySQL 8.0 無直接限制總量參數,靠 expire_logs_days 控制

主從環境最佳實踐

  1. 主庫:expire_logs_days = 7 (視從庫延遲容忍度調整)
  2. 從庫:relay_log_purge = ON (預設),relay_log_space_limit 限制中繼日誌總量
  3. 備份前:FLUSH LOGS 產生新 Binlog,備份包含索引檔
  4. 監控:disk usage% + binlog count/size 告警

緊急恢復步驟 (磁碟 100% 無法寫入)

  1. 刪除非必要檔案 (舊備份、日誌、tmp) 騰出 至少 1GB
  2. 重啟 MySQL (若掛掉)
  3. 執行 PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 1 DAY)
  4. 設定 expire_logs_days 並重啟
  5. 檢查從庫同步狀態,必要時重建從庫
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved