萬盛學電腦網

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

MySQL 二進制日誌格式深度解析:從 Magic Number 到 Event 結構的完整圖譜

Binlog 文件整體結構

+------------------+
| 4-byte Magic     |  0xFE 0x62 0x69 0x6E ("feBin")
+------------------+
| Event 1 (FDE)    |  Format Description Event
+------------------+
| Event 2          |  Query/Row/GTID/... Event
+------------------+
| ...              |
+------------------+
| Rotate Event     |  指向下一個 Binlog 文件
+------------------+

Magic Number 驗證

  • 前 4 位元組固定 0xFE 0x62 0x69 0x6E(整數 1852400382)。
  • 工具讀取時先校驗,不匹配則拒絕解析。

Event Header 通用結構(V4,MySQL 5.0+)

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 而定)

首個 Event:Format Description Event (FDE)

固定 19 位元組 Header + Data:

偏移長度內容
02Binlog 版本(5.0+ 固定 4)
250MySQL 版本字串(如 "5.6.16-log"),不足填 0x00
524建立時間戳
561Header 長度(通常 19,>19 表示後續 Event 有 extra_headers)
57var通常為空

常見 Event Type Code

Code名稱用途
0x01QUERY_EVENTStatement 格式 DDL/DML
0x02STOP_EVENT正常關閉標記
0x03ROTATE_EVENT切換 Binlog 文件
0x04INTVAR_EVENT自增值、LAST_INSERT_ID
0x05LOAD_EVENTLOAD DATA INFILE
0x12TABLE_MAP_EVENTRow 格式映射表 ID
0x13WRITE_ROWS_EVENTRow 格式 INSERT
0x14UPDATE_ROWS_EVENTRow 格式 UPDATE
0x15DELETE_ROWS_EVENTRow 格式 DELETE
0x1BGTID_EVENTGTID 模式事務邊界
0x1CANONYMOUS_GTID_EVENT非 GTID 模式事務邊界

Row Event 數據區結構

+===================+
| 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 進階用法

# 指定庫過濾
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

Binlog 維護命令

-- 刪除全部
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,將理論落地。

copyright © 萬盛學電腦網 all rights reserved