expire_logs_days,日誌永久保留No space left on device 導致寫入阻塞、甚至崩潰SHOW VARIABLES LIKE 'expire_logs_days'; -- 默認 0(永不過期)
SET GLOBAL expire_logs_days = 7; -- 保留 7 天
[mysqld]
expire_logs_days = 7
# MySQL 8.0 新參數(優先級更高,單位秒)
binlog_expire_logs_seconds = 604800
PURGE BINARY LOGS TO 'mysql-bin.000010';
PURGE BINARY LOGS BEFORE '2024-01-15 12:00:00';
-- 或相對時間
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);
-- 每個從庫執行
SHOW SLAVE STATUS\G
-- 記錄 Master_Log_File / Read_Master_Log_Pos
-- 主庫查看現有 binlog 列表
SHOW BINARY LOGS;
鐵律:只能刪除**所有從庫已處理完畢**的 binlog。誤刪導致從庫報 Got fatal error 1236 需重搭從庫。
[mysqld]
max_binlog_size = 100M # 單文件上限,達到自動輪轉
max_binlog_files = 100 # 最大文件數(MySQL 8.0+),超限自動清理最舊
binlog_expire_logs_seconds = 604800 -- 7天,8.0推薦用秒級參數
Slave_IO_Running=Yes、Seconds_Behind_Master=0SHOW BINARY LOGS;Master_Log_File 中最舊者PURGE BINARY LOGS TO 'mysql-bin.0000xx';df -h /var/lib/mysql#!/bin/bash
# 每日歸檔腳本
DATE=$(date +%F)
BINLOG_DIR=/var/lib/mysql
ARCHIVE_DIR=/backup/binlog/$DATE
mkdir -p $ARCHIVE_DIR
# 1. 刷新日誌產生新文件
mysql -e "FLUSH BINARY LOGS;"
# 2. 複製除當前活躍文件外的所有 binlog
ls $BINLOG_DIR/mysql-bin.* | head -n -1 | xargs -I{} cp {} $ARCHIVE_DIR/
# 3. 壓縮
tar czf $ARCHIVE_DIR.tar.gz -C $ARCHIVE_DIR .
# 4. 驗證後可選擇 PURGE 已歸檔文件
# PURGE BINARY LOGS TO 'current_active_binlog';
SHOW BINARY LOGS 列表是否連續mysqlbinlog 讀取驗證# 緊急騰出空間
mv /var/lib/mysql/mysql-bin.000001 /tmp/ # 移動最舊文件
mv /var/lib/mysql/mysql-bin.000002 /tmp/
# 啟動 MySQL 後執行 PURGE
# 事後移回或刪除 /tmp 下文件
Binlog 管理三板斧:**自動過期(expire_logs_days/binlog_expire_logs_seconds)防患未然**、**手動 PURGE 精確清理釋放空間**、**限制單文件/總量防失控**。鐵律:**清理前必驗證所有從庫同步位點**。生產環境建議配合歸檔腳本、監控告警(磁盤使用率>80%告警)、定期演練從庫重搭流程。