+------------------+
| 4-byte Magic | 0xFE 0x62 0x69 0x6E ("feBin")
+------------------+
| Event 1 (FDE) | Format Description Event
+------------------+
| Event 2 | Query/Row/GTID/... Event
+------------------+
| ... |
+------------------+
| Rotate Event | 指向下一個 Binlog 文件
+------------------+
0xFE 0x62 0x69 0x6E(整數 1852400382)。Offset Size Field
0 4 timestamp (秒級 Unix 時間戳)
4 1 type_code (事件類型)
5 4 server_id (來源 Server ID)
9 4 event_length (整個 Event 總長度,含 Header)
13 4 next_position (下一個 Event 起始位置)
17 2 flags (標誌位)
19 var extra_headers (FDE 無,其他視 type_code 而定)
固定 19 位元組 Header + Data:
| 偏移 | 長度 | 內容 |
|---|---|---|
| 0 | 2 | Binlog 版本(5.0+ 固定 4) |
| 2 | 50 | MySQL 版本字串(如 "5.6.16-log"),不足填 0x00 |
| 52 | 4 | 建立時間戳 |
| 56 | 1 | Header 長度(通常 19,>19 表示後續 Event 有 extra_headers) |
| 57 | var | 通常為空 |
| Code | 名稱 | 用途 |
|---|---|---|
| 0x01 | QUERY_EVENT | Statement 格式 DDL/DML |
| 0x02 | STOP_EVENT | 正常關閉標記 |
| 0x03 | ROTATE_EVENT | 切換 Binlog 文件 |
| 0x04 | INTVAR_EVENT | 自增值、LAST_INSERT_ID |
| 0x05 | LOAD_EVENT | LOAD DATA INFILE |
| 0x12 | TABLE_MAP_EVENT | Row 格式映射表 ID |
| 0x13 | WRITE_ROWS_EVENT | Row 格式 INSERT |
| 0x14 | UPDATE_ROWS_EVENT | Row 格式 UPDATE |
| 0x15 | DELETE_ROWS_EVENT | Row 格式 DELETE |
| 0x1B | GTID_EVENT | GTID 模式事務邊界 |
| 0x1C | ANONYMOUS_GTID_EVENT | 非 GTID 模式事務邊界 |
+===================+
| Table Map Event | 包含 table_id, db_name, tbl_name, column_count, column_types...
+===================+
| Write/Update/Delete Rows Event |
| - Header |
| - Table ID |
| - Flags |
| - Column Bitmap | Present columns / Null bitmap
| - Rows Data | 按列序列化,定長列定長,變長列長度+數據
+===================+
# 指定庫過濾
mysqlbinlog -d test mysql-bin.000002
# 基於位置恢復(跳過誤操作)
mysqlbinlog --stop-position=889107 mysql-bin.000001 | mysql -uroot -p
mysqlbinlog --start-position=889189 mysql-bin.000001 | mysql -uroot -p
# 基於時間恢復
mysqlbinlog --stop-datetime='2024-05-01 19:59:59' mysql-bin.000001 | mysql -uroot -p
mysqlbinlog --start-datetime='2024-05-01 20:01:00' mysql-bin.000001 | mysql -uroot -p
# 遠程讀取(配合 -R -t 可跟蹤實時 Binlog)
mysqlbinlog -R -h master_host -u repl -p --read-from-remote-server mysql-bin.000002
# 導出 SQL 文件人工審核
mysqlbinlog mysql-bin.000001 > restore.sql
-- 刪除全部
RESET MASTER;
-- 刪除指定文件之前
PURGE MASTER LOGS TO 'mysql-bin.000100';
PURGE MASTER LOGS BEFORE '2024-05-01 00:00:00';
-- 自動過期(動態生效)
SET GLOBAL expire_logs_days = 7;
-- my.cnf 固化
expire_logs_days = 7
理解 Binlog 結構是掌握「基於位置/時間的精準恢復」、「解析復制延遲根因」、「開發 Binlog 訂閱工具」的基石。建議配合 mysqlbinlog --verbose --base64-output=decode-rows 實地解析幾個實際 Event,將理論落地。