萬盛學電腦網

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

MySQL Binlog 日誌管理:自動過期清理、手動精確刪除與大小限制最佳實踐

Binlog 佔用磁盤空間的風險與成因

  • 未開啟 expire_logs_days,日誌永久保留
  • 高寫入業務產生日誌極快(GB/天級)
  • 從庫故障導致主庫無法清理(需保證從庫已拉取)
  • 磁盤滿觸發 No space left on device 導致寫入阻塞、甚至崩潰

方案一:自動過期清理(推薦生產環境默認開啟)

查看當前設置

SHOW VARIABLES LIKE 'expire_logs_days';  -- 默認 0(永不過期)

動態設置(即時生效,重啟失效)

SET GLOBAL expire_logs_days = 7;  -- 保留 7 天

持久化配置(my.cnf)

[mysqld]
expire_logs_days = 7
# MySQL 8.0 新參數(優先級更高,單位秒)
binlog_expire_logs_seconds = 604800

方案二:手動精確刪除(PURGE BINARY LOGS)

按文件名刪除(保留指定文件及之後)

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推薦用秒級參數

實戰清理操作流程

  1. 確認從庫同步位點:所有從庫 Slave_IO_Running=Yes、Seconds_Behind_Master=0
  2. 查看主庫 binlog 列表:SHOW BINARY LOGS;
  3. 確定安全刪除截止點:取所有從庫 Master_Log_File 中最舊者
  4. 執行 PURGE:PURGE BINARY LOGS TO 'mysql-bin.0000xx';
  5. 驗證磁盤釋放:df -h /var/lib/mysql

Binlog 歸檔備份策略(合規/審計需求)

#!/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';

異常場景處理

Binlog 文件損壞/缺失導致從庫報 1236

  1. 檢查主庫 SHOW BINARY LOGS 列表是否連續
  2. 若缺失文件,從庫**必須重搭**(全量備份+新位點)
  3. 若文件存在但損壞,嘗試 mysqlbinlog 讀取驗證

磁盤已滿無法啟動 MySQL 執行 PURGE

# 緊急騰出空間
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%告警)、定期演練從庫重搭流程。

copyright © 萬盛學電腦網 all rights reserved