一、前言
????????在進行一次數據導入之后,發現服務器磁盤爆滿,初步判斷是數據庫產生了大量binlog所致,接下來進行分析處理。
二、分析
1、查看磁盤空間
????????通過df -h命令,查看磁盤空間占用情況
2、查找占用文件或目錄
????????通過命令:du -ah -d1,逐級排查分析,排查找到占用最大的文件或目錄
3、找到binlog文件
????????找到這樣一大堆binlog文件,顯然正是罪魁禍首。
????????接下來考慮如何清理這些binlog文件。
三、處理
????????binlog日志可以通過參數expire_logs_days設置文件保留天數。
1、自動清理
1)設置過期時間
????????臨時設置:
-- 查看binlog保留天數參數設置,0表示永不刪除
SHOW VARIABLES LIKE 'expire_logs_days';-- 臨時修改(重啟失效)
SET GLOBAL expire_logs_days = 7;
????????永久設置:修改配置文件/etc/my.cnf,重啟mysql
[mysqld]
# 設置過期時間為7天
expire_logs_days = 7
# 限制單個文件大小
max_binlog_size = 1024M
2)觸發清理機制
????????執行以下命令或重啟數據庫,觸發清理機制
-- 刷新日志觸發清理
FLUSH LOGS;
3)執行結果
> 登錄mysql,設置過期時間,并執行觸發機制:
?因為是這兩天執行產生的, 所以發現binlog并沒有清除減少,所以接下來就要手動清理了。
2、手動清理
1)查看binlog狀態
-- 查看binlog文件列表
SHOW BINARY LOGS;
-- 查看主庫正在使用的文件
SHOW MASTER STATUS;
-- 查看從庫讀取位置(主從環境必備)
SHOW SLAVE STATUS\G;
2)刪除文件
-- 刪除指定文件之前的日志(不包含該文件)
PURGE BINARY LOGS TO 'mysql-bin.000510';-- 刪除指定時間前的日志
PURGE BINARY LOGS BEFORE '2025-06-20 00:00:00';
????????執行刪除,查看binlog文件,磁盤空間釋放成功。
四、注意事項
1、不要直接使用 rm 刪除文件
????????(會導致主從中斷)
2、不要刪除正在使用的 binlog
????????(SHOW MASTER STATUS 顯示的當前文件)
3、主從環境特別注意
1)確保清理的文件?早于所有從庫的讀取位置
-- 在每個從庫執行:
SHOW SLAVE STATUS\G -- 觀察 Relay_Master_Log_File 和 Exec_Master_Log_Pos
2)清理后立即檢查主從同步狀態
SHOW SLAVE STATUS\G -- 驗證 Slave_IO_Running 和 Slave_SQL_Running
4、生產環境操作前務必備份 binlog 索引文件
(/var/lib/mysql/binlog.index)異常時可重建索引:
mysqlbinlog --no-defaults binlog.* > binlog.index