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_LOG_EVENT (33)、PREVIOUS_GTIDS_LOG_EVENT (35)TRANSACTION_CONTEXT_EVENT (36)、XA_PREPARE_LOG_EVENT (38)QUERY_EVENT 以 SQL 文本形式記錄操作,常見於以下場景:
BEGIN 操作示例輸出:
| 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 */ |
此事件取代了舊版的 START_EVENT_V3,是 Binlog 文件的第一個事件,僅出現一次。它包含 MySQL 版本、Binlog 版本、文件創建時間等元數據,MySQL 依賴它解析後續事件。
ROW 格式下所有 DML 記錄為 ROWS_EVENT,分三種類型:
由於非文本格式,使用 mysqlbinlog 查看需加參數 -vv --base64-output=decode-rows。
無論 STATEMENT 或 ROW 格式,事務提交時均會寫入 XID_EVENT,記錄事務 ID。崩溃恢復時,InnoDB 根據 Binlog 中是否存在 XID 決定是否提交處於 prepared 狀態的事務。
當 Binlog 達到 max_binlog_size 或執行 FLUSH LOGS 時觸發,指向下一個 Binlog 文件名及起始位置。
UUID:sequencegtid_executed示例:mysql-bin.000033 的 Previous_GTIDs 為 cad449f2...:1,包含 GTID :2 和 :3;下一個文件 mysql-bin.000034 的 Previous_GTIDs 即為 :1-3。
MySQL 正常關閉時在 Binlog 末尾寫入,標識實例已干凈關閉。
掌握 Binlog 事件類型有助於深入理解 MySQL 複制機制、設計數據恢復策略、排查主從同步問題。建議結合 mysqlbinlog 工具實地觀察不同場景下的事件序列。