MySQL Binary Log(binlog)記錄所有資料變更操作,是資料恢復、主從複制的核心基礎設施。本文系統整理 binlog 的啟用配置、多種查看方式、時間點/位置恢復實戰、常用管理指令,以及關鍵參數 sync_binlog、max_binlog_size 等的調優建議。
修改配置檔 my.cnf(Linux)或 my.ini(Windows)[mysqld] 區段:
[mysqld] log_bin = mysql_bin # 可選參數 server_id = 1 max_binlog_size = 1G expire_logs_days = 7
重啟 MySQL 服務。驗證:
SHOW VARIABLES LIKE '%log_bin%';
輸出 log_bin = ON 即生效。生成檔案命名為 mysql_bin.000001、mysql_bin.000002...,編碼為 6 位數字遞增。
binlog 為二進制格式,不可直接用文本編輯器開啟。MySQL 提供兩種查看方式:
SHOW BINLOG EVENTS IN 'mysql_bin.000001'\G
關鍵欄位說明:
Log_name:所在檔案名Pos / End_log_pos:事件在檔案中的起始/結束位置Event_type:事件類型(Query、Intvar、Rotate、Xid 等)Server_id:產生日志的伺服器 IDInfo:可讀的操作描述(如 INSERT INTO ...)mysqlbinlog /var/lib/mysql/mysql_bin.000001
輸出包含時間戳、事務隔離級別、自增偏移、字符集設定、BEGIN/COMMIT 等完整上下文,適合深度分析。
# 直接管道導入 mysqlbinlog --start-datetime="2024-01-15 10:00:00" --stop-datetime="2024-01-15 11:00:00" mysql_bin.000001 | mysql -uroot -p # 或導出 SQL 檔再執行 mysqlbinlog --start-datetime="2024-01-15 10:00:00" --stop-datetime="2024-01-15 11:00:00" mysql_bin.000001 > /tmp/recover.sql mysql -uroot -p < /tmp/recover.sql
mysqlbinlog --start-position=500 --stop-position=2000 mysql_bin.000001 | mysql -uroot -p
位置資訊來源於 SHOW BINLOG EVENTS 或 mysqlbinlog 輸出的 Pos/End_log_pos。
| 指令 | 作用 |
|---|---|
SHOW MASTER STATUS | 查看當前 binlog 檔案名與位置 |
FLUSH LOGS | 關閉當前 binlog,啟動新檔案(備份前常用) |
RESET MASTER | 清空所有 binlog,重新從 000001 開始(慎用!) |
PURGE BINARY LOGS TO 'mysql_bin.000010' | 刪除指定檔案之前的舊日志(安全清理) |
PURGE BINARY LOGS BEFORE '2024-01-01' | 刪除指定日期前的日志 |
| 值 | 行為 | 效能 | 風險 |
|---|---|---|---|
0(預設) | 事務提交時僅寫入 OS cache,由檔案系統決定何時 fsync | 最佳 | 系統崩潰導致 OS cache 中資料遺失 |
1 | 每次事務提交強制 fsync 刷盤 | 較差 | 最安全,無資料遺失 |
N (N>1) | 每 N 次提交 fsync 一次 | 折中 | 可能遺失 N-1 次提交 |
建議: 金融核心業務設 1;一般業務可設 100~1000 平衡效能與安全;搭配 RAID 控制器 BBU(電池備援寫入快取)可大幅降低 sync_binlog=1 的效能損耗。
單個 binlog 檔案最大值,預設 1GB。注意:遇到大事務時為保證完整性,檔案可能超過此限制直到事務結束。
事務期間暫存 binlog 的記憶體大小。監控 Binlog_cache_use 與 Binlog_cache_disk_use:若後者增長快,說明記憶體不足頻繁落盤,需調大 binlog_cache_size。
指定記錄/忽略的資料庫。注意: 跨資料庫操作(如 db1.t1)可能不生效,建議在應用層控制或使用行基礎複制(RBR)模式。
NOW()、UUID())等非確定性操作可能導致主從不一致。設定:binlog_format = MIXED
Binary Log 是 MySQL 高可用與資料安全的基石。生產環境務必啟用,配合 sync_binlog=1(或配合 BBU 設適中值)、expire_logs_days 自動清理、MIXED 格式、定期 PURGE 與備份驗證,構建可靠的資料保護體系。