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

MySQL Binlog 事件類型完整解析:QUERY、ROWS、GTID、XID、ROTATE 等

     編輯:MySQL 綜合教學

MySQL Binlog 事件類型完整解析:QUERY、ROWS、GTID、XID、ROTATE 等

MySQL Binlog 記錄所有資料庫變更,每筆操作對應特定事件類型。理解事件類型有助於複制除錯、資料恢復與稽核分析。

核心事件類型枚舉 (MySQL 5.7.14)

enum Log_event_type {
    UNKNOWN_EVENT=0, START_EVENT_V3=1, QUERY_EVENT=2, STOP_EVENT=3,
    ROTATE_EVENT=4, INTVAR_EVENT=5, LOAD_EVENT=6, SLAVE_EVENT=7,
    CREATE_FILE_EVENT=8, APPEND_BLOCK_EVENT=9, EXEC_LOAD_EVENT=10,
    DELETE_FILE_EVENT=11, NEW_LOAD_EVENT=12, RAND_EVENT=13,
    USER_VAR_EVENT=14, FORMAT_DESCRIPTION_EVENT=15, XID_EVENT=16,
    BEGIN_LOAD_QUERY_EVENT=17, EXECUTE_LOAD_QUERY_EVENT=18,
    TABLE_MAP_EVENT=19, WRITE_ROWS_EVENT=30, UPDATE_ROWS_EVENT=31,
    DELETE_ROWS_EVENT=32, GTID_LOG_EVENT=33, ANONYMOUS_GTID_LOG_EVENT=34,
    PREVIOUS_GTIDS_LOG_EVENT=35, TRANSACTION_CONTEXT_EVENT=36,
    VIEW_CHANGE_EVENT=37, XA_PREPARE_LOG_EVENT=38, ENUM_END_EVENT
};

重點事件詳細說明

1. FORMAT_DESCRIPTION_EVENT

  • Binlog v4 引入,取代 START_EVENT_V3
  • 每個 binlog 檔案第一個事件,僅出現一次
  • 記錄:MySQL 版本、Binlog 版本、建立時間
# at 4
#160817 11:00:10 server id 1 end_log_pos 120 CRC32 0x03010da1
Start: binlog v 4, server v 5.6.31-log created 160817 11:00:10

2. QUERY_EVENT

  • 文字形式記錄 SQL
  • 用於:BEGIN、STATEMENT 格式 DML、ROW 格式 DDL
mysql> SHOW BINLOG EVENTS IN 'mysql-bin.000021';
+------------------+-----+-------------+-----------+-------------+-----------------------------------------------+
| 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 */                           |
+------------------+-----+-------------+-----------+-------------+-----------------------------------------------+

3. ROWS_EVENT (ROW 格式 DML)

  • WRITE_ROWS_EVENT (INSERT) - 含新資料
  • UPDATE_ROWS_EVENT - 含修改前後值
  • DELETE_ROWS_EVENT - 含刪除鍵值
  • 需 mysqlbinlog -vv --base64-output=decode-rows 解析
| mysql-bin.000027 | 188 | Table_map | 1 | 236 | table_id: 80 (test.t1) |
| mysql-bin.000027 | 236 | Write_rows | 1 | 278 | table_id: 80 flags: STMT_END_F |
| mysql-bin.000027 | 425 | Update_rows | 1 | 475 | table_id: 80 flags: STMT_END_F |
| mysql-bin.000027 | 622 | Delete_rows | 1 | 664 | table_id: 80 flags: STMT_END_F |

4. XID_EVENT

  • 交易提交標記,含 XID(交易 ID)
  • 崩潰恢復時判斷 prepared 交易是否提交

5. ROTATE_EVENT

  • Binlog 切換(達 max_binlog_size 或 FLUSH LOGS)
  • 指定下一個 binlog 檔名與起始位置
| mysql-bin.000028 | 120 | Rotate | 1 | 167 | mysql-bin.000029;pos=4 |

6. GTID 相關事件 (GTID 模式啟用時)

  • GTID_LOG_EVENT:每筆交易前標記 GTID SET @@SESSION.GTID_NEXT= 'uuid:seq'
  • PREVIOUS_GTIDS_LOG_EVENT:binlog 檔案開頭,累積至目前為止的所有 GTID 集合
# mysql-bin.000033
| 120 | Previous_gtids | 1 | 191 | cad449f2...:1 |
| 191 | Gtid           | 1 | 239 | SET @@SESSION.GTID_NEXT= 'cad449f2...:2' |
...
# mysql-bin.000034
| 120 | Previous_gtids | 1 | 191 | cad449f2...:1-3 |  -- 累積前檔案所有 GTID

7. STOP_EVENT

  • MySQL 正常關閉時寫入,標記 binlog 結束
| mysql-bin.000030 | 120 | Stop | 1 | 143 | |

實務應用

  • 複制延遲分析:檢查 Relay Log 中事件類型分布
  • 資料恢復:mysqlbinlog 解析特定事件區間重放
  • 稽核追蹤:QUERY_EVENT 重建 DDL/DML 操作歷程
  • GTID 驗證:PREVIOUS_GTIDS 確認複制完整性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved