下面主要講述了每個類型的事件中的固定和可變部分的數據。
Start_log_event_v3/START_EVENT_V3
這個事件出現在v1或v3的binlog文件的開頭部分。對於4.0和4.1版本的Mysql,這個事件只是被寫在服務啟動后的第一個binlog文件中,到達一定的條件后,會產生新的日志文件,但是新的日志文件中不包含這個事件。對於所有的Mysql5.0及以上版本,每個日志文件都會以FORMAT_DESCRIPTION_EVENT開頭。
固定數據部分:
2字節,binlog格式版本。對3.23版本為1,4.0和4.1版本為3(對5.0及以上版本,FORMAT_DESCRIPTION_EVENT會替代START_EVENT_V3)
50字節,Mysql服務器版本(例如:4.0.14-debug-log),后面跟着0x00。
4字節,事件創建的時間戳,精確到秒。(也就是這個文件創建的時間戳)。這個值是多余的,因為頭中有相同的字段。
可變數據部分:
空
Query_log_event/QUERY_EVENT
固定數據部分:
4字節。發起這個語句的線程id,對於臨時表來說是必須的。這也有助於DBA知道誰在master上干了啥。
4字節。語句執行的時長,單位為秒。只對於DBA的監控有用。
1字節。語句執行對應的數據庫名稱的長度。名稱在可變數據部分。
2字節。在master執行語句的錯誤碼。錯誤碼定義在include/mysqld_error.h文件中。0表示沒有錯誤。
2字節(v1和v3中不存在)。狀態變量長度。
可變數據部分:
大於等於0的狀態變量(v1、v3中不存在)。每個狀態變量包含一個字節碼,標識存儲變量,后面跟着變量的值。
默認數據庫名
SQL語句。slave知道變量中其他字段的長度,所以通過減法計算,可以知道語句的長度。
下面的列表提供了每個變量的基本信息:
Q_FLAGS2_CODE=0。值為一個4字節的位字段。這個變量只會在5.0中寫入。
Q_SQL_MODE_CODE = 1. 他是一個每一位代表SQL_MODE中的一個值,參考最后源碼的解釋
Q_CATALOG_CODE = 2. 只在MYSQL 5.0.0到5.0.3使用不考慮
Q_AUTO_INCREMENT = 3. 2 bytes非負整數用於表示參數auto_increment_increment和auto_increment_offset,這個只會在auto_increment大於1的時候出現
Q_CHARSET_CODE = 4. 6 bytes用於表示character_set_client,collation_connection和collation_server參數(totally 2+2+2=6 bytes)參考最后源碼解釋
Q_TIME_ZONE_CODE = 5. 用於描述time zone信息
Q_CATALOG_NZ_CODE = 6. 用於描述catalog name,長度占用一個字節,隨后這個值為std
Q_LC_TIME_NAMES_CODE = 7. 2 bytes 非負整數,只有當lc_time_names不設置為en_US的時候使用
Q_CHARSET_DATABASE_CODE = 8. 2 bytes 非負整數為collation_database系統變量,5.7源碼解釋說這部分新版本不一定使用。
Q_TABLE_MAP_FOR_UPDATE_CODE = 9.
Stop_log_event/STOP_EVENT
這個事件會在以下情況下寫入:
master掛掉時會寫到binlog中
slave掛掉時會向relay log中寫入或者RESET SLAVE命令執行時。
固定數據部分:
空
可變數據部分:
空
Rotate_log_event/ROTATE_EVENT
當binlog的文件大小超過閾值時,這個事件會寫到binlog的結尾處,指向下一個binlog文件序列。這個事件可以讓slave知道下一個binlog文件的名字,以便它去接收。
ROTATE_EVENT是在master本地產生並寫入binlog中的。當FLUSH LOGS命令執行時或收到master的ROTATE_EVENT時,slave會寫到他的relay log中。
固定數據部分:
8字節。下個日志文件的第一個事件的位置。經常包含數字4(表示下個binlog的下個事件從位置4開始)。這個字段在v1中不存在。可以推測,這個值是4。
可變數據部分:
下個binlog文件的名字。文件名不是以null結尾的,他的長度是事件長度-固定數據長度。
Intvar_log_event/INTVAR_EVENT
固定數據部分:
空
可變數據部分:
1字節。表示參數類型,LAST_INSERT_ID_EVENT=1或者INSERT_ID_EVENT=2。
8字節。無符號整數,表示LAST_INSERT_ID()調用的值或者AUTO_INCREMENT列的值。
Load_log_event/LOAD_EVENT
用於LOAD DATA INFILE語句中。這塊用的比較少,先跳過。
Slave_log_event/SLAVE_EVENT
從沒用過這個事件。
Create_file_log_event/CREATE_FILE_EVENT
用於LOAD DATA INFILE語句中。這塊用的比較少,先跳過。
Append_block_log_event/APPEND_BLOCK_EVENT
用於LOAD DATA INFILE語句中。這塊用的比較少,先跳過。
Execute_log_event/EXEC_LOAD_EVENT
用於LOAD DATA INFILE語句中。這塊用的比較少,先跳過。
Delete_file_log_event/DELETE_FILE_EVENT
用於LOAD DATA INFILE語句中。這塊用的比較少,先跳過。
Load_log_event/NEW_LOAD_EVENT
用於LOAD DATA INFILE語句中。這塊用的比較少,先跳過。
Rand_log_event/RAND_EVENT
RAND()函數會產生一個隨機數。這個事件包含兩個種子值,用於產生隨機數。
固定數據部分:
空
可變數據部分:
8字節。第一個種子的值。
8字節。第二個種子的值。
User_var_log_event/USER_VAR_EVENT
固定數據部分:
空
可變數據部分:
4字節。用戶參數名的長度。
用戶參數名。
1字節。如果參數值是SQL的NULL值,不為零,否則為0.如果這個字節是0,會包含下面的內容。
1字節。用戶參數類型。STRING_RESULT=0,REAL_RESULT=1,INT_RESULT=2,ROW_RESULT=3,DECIMAL_RESULT=4。
4字節。用戶參數的編碼集代表的數字。
4字節。用戶參數值的大小。
可變大小。對於一個字符串的變量,這是字符串。對於浮點數或整數,這個值是8字節。對於十進制的數,值為一個封包值。
Format_description_log_event/FORMAT_DESCRITION_EVENT
這個在之前講過很多了,是v4版本的格式描述事件。
固定數據部分:
2字節。binlog格式版本,對於5.0及以上版本,是4.
50字節。Mysql服務器版本,右邊帶着0x00。
4字節。事件創建的時間戳。多余的參數,和頭中的時間戳重復。
1字節。頭長度。當前的值為19.
可變長度。表示所有事件類型的頭長度信息的數組。
可變數據部分:
空。
Xid_log_event/XID_EVENT
對於支持XA事務的存儲引擎來說,一個XID事件是在改變一個或多個表數據的事務提交時產生的。嚴格的講,這個事件是在thd->transaction.xid_state.xid.get_my_xid()方法返回不為0時,使用的。
下面舉例說明如何產生一個XID事件(無論是否開啟innodb_support_xa):
CREATE TABLE t1 (a INT) ENGINE = INNODB;
START TRANSACTION;
INSERT INTO t1 VALUES (1);
COMMIT;
固定數據部分:
空
可變數據部分:
8字節,XID事務號
Begin_load_query_log_event/BEGIN_LOAD_QUERY_EVENT
用於LOAD DATA INFILE語句中。這塊用的比較少,先跳過。
Table_map_log_event/TABLE_MAP_EVENT
從5.1.5開始用於基於行的binlog文件。
固定數據部分:
6字節,表id
2字節,保留字段。
可變數據部分:
1字節,數據庫名長度
可變大小。數據庫名(以null結尾)
1字節,表名長度
可變大小,表名(以null結尾)
封包整數,表中列的數量
可變大小,列類型的數組,每一列一個字節。
封包整數,元數據塊大小
可變大小,元數據塊
可變大小,位字段,表示每一列是否可以為空,每列一比特。對這個字段,對於一個N列的存儲大小為INT((N+7)/8)字節。
Write_rows_log_event_old/PRE_GA_WRITE_ROWS_EVENT
用於5.1.5到5.1.17版本的基於行的binlog,Write_rows_log_event/WRITE_ROWS_EVENT的老版本實現。結構和最新的版本類似。
Update_rows_log_event_old/PRE_GA_UPDATE_ROWS_EVENT
用於5.1.5到5.1.17版本的基於行的binlog,Update_rows_log_event/UPDATE_ROWS_EVENT的老版本實現。結構和最新的版本類似。
Delete_rows_log_event_old/PRE_GA_DELETE_ROWS_EVENT
用於5.1.5到5.1.17版本的基於行的binlog,Delete_rows_log_event/DELETE_ROWS_EVENT的老版本實現。結構和最新的版本類似。
Write_rows_log_event/WRITE_ROWS_EVENT
用於5.1.18版本的基於行的binlog。
固定數據部分:
6字節,表id
2字節,保留字段
可變數據部分:
封包整數。表中列的數量
可變大小,位字段,表示每一列是否使用到,每列一個比特。對於這個字段,對於一個N列的表需要的存儲空間為INT((N+7)/8)字節。
可變大小(只用於UPDATE_ROWS_LOG_EVENT)。
可變大小,0列或多列的序列,結尾由時間的大小決定,每一列是下面的格式:
可變大小。位字段,表示每列的字段是否為空。只有在第二個字段中使用到的變量數據部分才會展示在這里。如果第二個字段包含N個比特,當前字段需要的空間為INT((N+7)/8)字節。
可變大小。列映射,包含表中所有列的值。這個字段只會列出使用到的字段。
每種值的格式定義在log_event.cc的log_event_value()函數中。
(僅對UPDATE_ROWS_EVENT)前面的2個字段是重復的。
Update_rows_log_event/UPDATE_ROWS_EVENT
用於5.1.18版本的基於行的binlog。見WRITE_ROWS_EVENT的描述。
Delete_rows_log_event/DELETE_ROWS_EVENT
用於5.1.18版本的基於行的binlog。見WRITE_ROWS_EVENT的描述。
Incident_log_event/INCIDENT_EVENT
固定數據部分:
1字節,故障號。
1字節,消息長度。
可變數據部分
如果有的話,是故障信息
故障號定義在rpl_constant.h中。當前唯一使用到的是INCIDENT_LOST_EVENTS,這個表示在復制過程中可能有丟包,需要重新進行同步。
Heartbeat_log_event/HEARTBEAT_LOG_EVENT
這個事件是由master發給slave的,讓slave知道master還活着。這類事件不會再binlog或relay log中出現。他們由master的dump事件線程產生,然后直接發給了slave。slave收到后,校驗事件內容后,直接拋棄這個事件,而不會寫到relay log中。
固定數據部分
空
可變數據部分
空