萬盛學電腦網

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

MySQL 二進制日志管理全攻略:查看、清理、過期設定與主從同步安全刪除

二進制日志作用回顧

  1. 時間點恢復 (PITR):配合全量備份,重放 binlog 恢復到任意秒
  2. 主從複制:Slave 讀取 Master binlog 重放達成同步
  3. 審計/追蹤:記錄所有 DDL/DML 操作

查看 Binlog 狀態

-- 登入 MySQL
mysql -u root -p

-- 列出所有 binlog 文件與大小
SHOW BINARY LOGS;
-- 或
SHOW MASTER LOGS;

-- 查看當前寫入的 binlog 文件與位置
SHOW MASTER STATUS;

-- 查看 binlog 事件內容
SHOW BINLOG EVENTS IN 'mysql-bin.000010' LIMIT 10;
-- 或使用 mysqlbinlog 工具
mysqlbinlog --base64-output=decode-rows -v mysql-bin.000010 | less

清理策略與指令

1. 手動清理:PURGE BINARY LOGS

-- 刪除指定文件之前的所有 binlog(含指定文件之前)
PURGE BINARY LOGS TO 'mysql-bin.000010';

-- 刪除指定時間之前的 binlog
PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';

-- 刪除指定日期之前
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

2. 自動過期:expire_logs_days / binlog_expire_logs_seconds

-- MySQL 5.7 / 8.0 舊參數(天)
SET GLOBAL expire_logs_days = 7;
-- my.cnf 永久生效
[mysqld]
expire_logs_days = 7

-- MySQL 8.0 新參數(秒,優先級更高)
SET GLOBAL binlog_expire_logs_seconds = 604800; -- 7天
[mysqld]
binlog_expire_logs_seconds = 604800

⚠️ 同時設定時以秒為準。建議統一使用秒單位參數。

3. 重置所有(僅限單機、無從庫)

RESET MASTER;
-- 危險!會刪除所有 binlog 並重置索引,從庫會中斷同步

主從架構下的安全清理流程(關鍵)

  1. 在每個 Slave 執行 SHOW SLAVE STATUS\G,記下 Relay_Master_Log_File(正在讀取的 Master binlog)
  2. 在 Master 執行 SHOW BINARY LOGS,取得完整列表
  3. 找出所有 Slave 中最舊的 Relay_Master_Log_File,作為「安全刪除截止點」
  4. 在 Master 執行 PURGE BINARY LOGS TO '該文件名'
  5. 清理前務必備份 要刪除的 binlog 文件

binlog 格式選擇

格式設定優點缺點
STATEMENTbinlog_format=STATEMENT體積小非確定性函數(如 UUID()) 導致主從不一致
ROWbinlog_format=ROW最安全、支援所有場景體積大、大批次更新膨脹
MIXEDbinlog_format=MIXED (預設)自動切換,平衡極少數邊界情況仍可能不一致

建議:生產環境預設用 ROW,確保數據一致性;存儲成本敏感可用 MIXED。

禁用 Binlog(單機、無備份/從庫需求)

[mysqld]
# 註釋或移除
# log-bin=mysql-bin
# binlog_format=ROW
-- 重啟生效
systemctl restart mysqld

磁碟空間不足緊急處理

# 1. 確認佔用
du -sh /var/lib/mysql/mysql-bin.*

# 2. 臨時移動舊 binlog 到其他磁碟(勿刪除!)
mkdir /mnt/backup_binlog
mv /var/lib/mysql/mysql-bin.000001* /mnt/backup_binlog/

# 3. 更新索引文件 mysql-bin.index(手動編輯移除對應行)

# 4. FLUSH LOGS 產生新 binlog
mysql -e "FLUSH LOGS;"

# 5. 事後補上 PURGE 或設定 expire_logs_days

總結

Binlog 是 MySQL 數據安全的命脈。**清理前必須確認所有從庫同步位置**,優先使用 PURGE BINARY LOGS TO/BEFORE 精確控制,配置 binlog_expire_logs_seconds 自動化,嚴禁在主從架構下直接 RESET MASTER 或手動刪除文件。

copyright © 萬盛學電腦網 all rights reserved