首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL Binlog 事件類型深度解析:從源碼到實戰應用

     編輯:MySQL 綜合教學

MySQL Binlog 事件類型核心概念

MySQL 二進制日誌(Binlog)記錄了所有數據庫操作,每項操作都對應特定的事件類型。例如,在 STATEMENT 格式下,DML 操作對應 QUERY_EVENT;而在 ROW 格式下,DML 則對應 ROWS_EVENT。理解這些事件類型對於複制、恢復和審計至關重要。

源碼層面的事件類型定義

以 MySQL 5.7.14 為例,事件類型定義於 mysql-5.7.14/libbinlogevents/include/binlog_event.h 中的 Log_event_type 枚舉。主要事件類型包括:

  • UNKNOWN_EVENT (0)、START_EVENT_V3 (1)、QUERY_EVENT (2)
  • ROTATE_EVENT (4)、FORMAT_DESCRIPTION_EVENT (15)、XID_EVENT (16)
  • 行事件:WRITE_ROWS_EVENT (30)、UPDATE_ROWS_EVENT (31)、DELETE_ROWS_EVENT (32)
  • GTID 相關:GTID_LOG_EVENT (33)、PREVIOUS_GTIDS_LOG_EVENT (35)
  • 事務上下文:TRANSACTION_CONTEXT_EVENT (36)、XA_PREPARE_LOG_EVENT (38)

核心事件類型詳細解析

QUERY_EVENT:文本模式記錄

QUERY_EVENT 以 SQL 文本形式記錄操作,常見於以下場景:

  1. 事務開始時的 BEGIN 操作
  2. STATEMENT 格式下的 DML 操作
  3. ROW 格式下的 DDL 操作

示例輸出:

| Log_name       | Pos | Event_type | Server_id | End_log_pos | Info                            |
|----------------|-----|------------|-----------|-------------|---------------------------------|
| mysql-bin.000021 | 120 | Query      | 1         | 195         | BEGIN                           |
| mysql-bin.000021 | 195 | Query      | 1         | 298         | insert into test.t1 values(1,'a') |
| mysql-bin.000021 | 298 | Xid        | 1         | 329         | COMMIT /* xid=25 */             |

FORMAT_DESCRIPTION_EVENT:Binlog 解析基石

此事件取代了舊版的 START_EVENT_V3,是 Binlog 文件的第一個事件,僅出現一次。它包含 MySQL 版本、Binlog 版本、文件創建時間等元數據,MySQL 依賴它解析後續事件。

ROWS_EVENT:行級變更記錄

ROW 格式下所有 DML 記錄為 ROWS_EVENT,分三種類型:

  • WRITE_ROWS_EVENT:INSERT 操作,包含插入的完整行數據
  • UPDATE_ROWS_EVENT:UPDATE 操作,同時包含修改前後的值
  • DELETE_ROWS_EVENT:DELETE 操作,記錄主鍵值(無主鍵時記錄全列)

由於非文本格式,使用 mysqlbinlog 查看需加參數 -vv --base64-output=decode-rows。

XID_EVENT:事務提交標識

無論 STATEMENT 或 ROW 格式,事務提交時均會寫入 XID_EVENT,記錄事務 ID。崩溃恢復時,InnoDB 根據 Binlog 中是否存在 XID 決定是否提交處於 prepared 狀態的事務。

ROTATE_EVENT:日誌切換指令

當 Binlog 達到 max_binlog_size 或執行 FLUSH LOGS 時觸發,指向下一個 Binlog 文件名及起始位置。

GTID 相關事件:全局事務識別

  • GTID_LOG_EVENT:每個事務分配唯一 GTID,格式為 UUID:sequence
  • PREVIOUS_GTIDS_LOG_EVENT:每個 Binlog 文件開頭記錄之前所有 GTID 集合,用於啟動時重建 gtid_executed

示例:mysql-bin.000033 的 Previous_GTIDs 為 cad449f2...:1,包含 GTID :2 和 :3;下一個文件 mysql-bin.000034 的 Previous_GTIDs 即為 :1-3。

STOP_EVENT:正常關閉標記

MySQL 正常關閉時在 Binlog 末尾寫入,標識實例已干凈關閉。

總結

掌握 Binlog 事件類型有助於深入理解 MySQL 複制機制、設計數據恢復策略、排查主從同步問題。建議結合 mysqlbinlog 工具實地觀察不同場景下的事件序列。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved