萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

磁碟被 Binlog 塞滿導致 MySQL 無法啟動:緊急清理與根治方案

故障現場

# 錯誤日誌
Disk is full writing './mysql-bin.~rec~' (Errcode: 28).
Waiting for someone to free space...

# df -h 確認
/dev/sda1  30G  28G  0  100% /

/var/lib/mysql 被 mysql-bin.0000xx 佔滿 (案例中單檔 270MB,累計 500MB+)。

緊急救援 (3 步驟)

  1. 停止 MySQL (若掛掉則跳過):systemctl stop mysqld
  2. 刪除舊 binlog (保留最新 2-3 個):
cd /var/lib/mysql
ls -lh mysql-bin.*
rm -f mysql-bin.000011 mysql-bin.000012 mysql-bin.000013 mysql-bin.000014
# 保留 000020、000021 及 index 檔
  1. 啟動 MySQL:systemctl start mysqld

⚠️ 切勿刪除 mysql-bin.index**!它記錄所有 binlog 檔名,刪除會導致 MySQL 遺失 binlog 追蹤能力。

根治:關閉不需要的 Binlog 或啟用自動清理

方案 A:非主從環境 → 直接關閉 Binlog

vim /etc/my.cnf
# 註釋掉以下兩行
# log_bin = mysql-bin
# binlog_format = mixed

systemctl restart mysqld

方案 B:主從環境 → 啟用自動過期清理

[mysqld]
log_bin = mysql-bin
binlog_format = ROW
binlog_expire_logs_seconds = 604800   # 7 天 (8.0+)
# 或舊版
expire_logs_days = 7
max_binlog_size = 100M

進階:線上清理不停機 (MySQL 5.7.12+ / 8.0+)

-- 清理 7 天前的 binlog
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

-- 或清理到指定檔案
PURGE BINARY LOGS TO 'mysql-bin.000020';

此命令會同步更新 mysql-bin.index,安全無風險。

監控預警 (必做)

  • df -h 磁碟使用率 > 80% 告警。
  • SHOW BINARY LOGS; 檔案數量/總大小納入監控。
  • 配置 logrotate 對 error.log、slow.log 切割壓縮。

事後複盤清單

  1. 確認 Binlog 成長速度 (MB/天),評估磁碟容量規劃。
  2. 檢查是否有異常大事務 (大批次 UPDATE/DELETE) 導致 Binlog 暴增。
  3. 驗證 expire_logs_days / binlog_expire_logs_seconds 生效。
  4. 若為主從,確認從庫同步正常,無長延遲導致主庫無法清理。
copyright © 萬盛學電腦網 all rights reserved