【文檔】七、Mysql Binlog不同事件類型的事件內(nèi)容

下面主要講述了每個類型的事件中的固定和可變部分的數(shù)據(jù)。

Start_log_event_v3/START_EVENT_V3

這個事件出現(xiàn)在v1或v3的binlog文件的開頭部分。對于4.0和4.1版本的Mysql,這個事件只是被寫在服務(wù)啟動后的第一個binlog文件中,到達(dá)一定的條件后,會產(chǎn)生新的日志文件,但是新的日志文件中不包含這個事件。對于所有的Mysql5.0及以上版本,每個日志文件都會以FORMAT_DESCRIPTION_EVENT開頭。

固定數(shù)據(jù)部分:

  • 2字節(jié),binlog格式版本。對3.23版本為1,4.0和4.1版本為3(對5.0及以上版本,F(xiàn)ORMAT_DESCRIPTION_EVENT會替代START_EVENT_V3)
  • 50字節(jié),Mysql服務(wù)器版本(例如:4.0.14-debug-log),后面跟著0x00。
  • 4字節(jié),事件創(chuàng)建的時間戳,精確到秒。(也就是這個文件創(chuàng)建的時間戳)。這個值是多余的,因為頭中有相同的字段。

可變數(shù)據(jù)部分:

Query_log_event/QUERY_EVENT

固定數(shù)據(jù)部分:

  • 4字節(jié)。發(fā)起這個語句的線程id,對于臨時表來說是必須的。這也有助于DBA知道誰在master上干了啥。
  • 4字節(jié)。語句執(zhí)行的時長,單位為秒。只對于DBA的監(jiān)控有用。
  • 1字節(jié)。語句執(zhí)行對應(yīng)的數(shù)據(jù)庫名稱的長度。名稱在可變數(shù)據(jù)部分。
  • 2字節(jié)。在master執(zhí)行語句的錯誤碼。錯誤碼定義在include/mysqld_error.h文件中。0表示沒有錯誤。
  • 2字節(jié)(v1和v3中不存在)。狀態(tài)變量長度。

可變數(shù)據(jù)部分:

  • 大于等于0的狀態(tài)變量(v1、v3中不存在)。每個狀態(tài)變量包含一個字節(jié)碼,標(biāo)識存儲變量,后面跟著變量的值。
  • 默認(rèn)數(shù)據(jù)庫名
  • SQL語句。slave知道變量中其他字段的長度,所以通過減法計算,可以知道語句的長度。

下面的列表提供了每個變量的基本信息:

  • Q_FLAGS2_CODE=0。值為一個4字節(jié)的位字段。這個變量只會在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非負(fù)整數(shù)用于表示參數(shù)auto_increment_increment和auto_increment_offset,這個只會在auto_increment大于1的時候出現(xiàn)
  • Q_CHARSET_CODE = 4. 6 bytes用于表示character_set_client,collation_connection和collation_server參數(shù)(totally 2+2+2=6 bytes)參考最后源碼解釋
  • Q_TIME_ZONE_CODE = 5. 用于描述time zone信息
  • Q_CATALOG_NZ_CODE = 6. 用于描述catalog name,長度占用一個字節(jié),隨后這個值為std
  • Q_LC_TIME_NAMES_CODE = 7. 2 bytes 非負(fù)整數(shù),只有當(dāng)lc_time_names不設(shè)置為en_US的時候使用
  • Q_CHARSET_DATABASE_CODE = 8. 2 bytes 非負(fù)整數(shù)為collation_database系統(tǒng)變量,5.7源碼解釋說這部分新版本不一定使用。
  • Q_TABLE_MAP_FOR_UPDATE_CODE = 9.

Stop_log_event/STOP_EVENT

這個事件會在以下情況下寫入:

  • master掛掉時會寫到binlog中
  • slave掛掉時會向relay log中寫入或者RESET SLAVE命令執(zhí)行時。

固定數(shù)據(jù)部分:

可變數(shù)據(jù)部分:

Rotate_log_event/ROTATE_EVENT

當(dāng)binlog的文件大小超過閾值時,這個事件會寫到binlog的結(jié)尾處,指向下一個binlog文件序列。這個事件可以讓slave知道下一個binlog文件的名字,以便它去接收。

ROTATE_EVENT是在master本地產(chǎn)生并寫入binlog中的。當(dāng)FLUSH LOGS命令執(zhí)行時或收到master的ROTATE_EVENT時,slave會寫到他的relay log中。

固定數(shù)據(jù)部分:

  • 8字節(jié)。下個日志文件的第一個事件的位置。經(jīng)常包含數(shù)字4(表示下個binlog的下個事件從位置4開始)。這個字段在v1中不存在??梢酝茰y,這個值是4。

可變數(shù)據(jù)部分:

  • 下個binlog文件的名字。文件名不是以null結(jié)尾的,他的長度是事件長度-固定數(shù)據(jù)長度。

Intvar_log_event/INTVAR_EVENT

固定數(shù)據(jù)部分:

可變數(shù)據(jù)部分:

  • 1字節(jié)。表示參數(shù)類型,LAST_INSERT_ID_EVENT=1或者INSERT_ID_EVENT=2。
  • 8字節(jié)。無符號整數(shù),表示LAST_INSERT_ID()調(diào)用的值或者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()函數(shù)會產(chǎn)生一個隨機數(shù)。這個事件包含兩個種子值,用于產(chǎn)生隨機數(shù)。

固定數(shù)據(jù)部分:

可變數(shù)據(jù)部分:

  • 8字節(jié)。第一個種子的值。
  • 8字節(jié)。第二個種子的值。

User_var_log_event/USER_VAR_EVENT

固定數(shù)據(jù)部分:

可變數(shù)據(jù)部分:

  • 4字節(jié)。用戶參數(shù)名的長度。
  • 用戶參數(shù)名。
  • 1字節(jié)。如果參數(shù)值是SQL的NULL值,不為零,否則為0.如果這個字節(jié)是0,會包含下面的內(nèi)容。
  • 1字節(jié)。用戶參數(shù)類型。STRING_RESULT=0,REAL_RESULT=1,INT_RESULT=2,ROW_RESULT=3,DECIMAL_RESULT=4。
  • 4字節(jié)。用戶參數(shù)的編碼集代表的數(shù)字。
  • 4字節(jié)。用戶參數(shù)值的大小。
  • 可變大小。對于一個字符串的變量,這是字符串。對于浮點數(shù)或整數(shù),這個值是8字節(jié)。對于十進制的數(shù),值為一個封包值。

Format_description_log_event/FORMAT_DESCRITION_EVENT

這個在之前講過很多了,是v4版本的格式描述事件。

固定數(shù)據(jù)部分:

  • 2字節(jié)。binlog格式版本,對于5.0及以上版本,是4.
  • 50字節(jié)。Mysql服務(wù)器版本,右邊帶著0x00。
  • 4字節(jié)。事件創(chuàng)建的時間戳。多余的參數(shù),和頭中的時間戳重復(fù)。
  • 1字節(jié)。頭長度。當(dāng)前的值為19.
  • 可變長度。表示所有事件類型的頭長度信息的數(shù)組。

可變數(shù)據(jù)部分:

  • 空。

Xid_log_event/XID_EVENT

對于支持XA事務(wù)的存儲引擎來說,一個XID事件是在改變一個或多個表數(shù)據(jù)的事務(wù)提交時產(chǎn)生的。嚴(yán)格的講,這個事件是在thd->transaction.xid_state.xid.get_my_xid()方法返回不為0時,使用的。

下面舉例說明如何產(chǎn)生一個XID事件(無論是否開啟innodb_support_xa):

CREATE TABLE t1 (a INT) ENGINE = INNODB;
START TRANSACTION;
INSERT INTO t1 VALUES (1);
COMMIT;

固定數(shù)據(jù)部分:

可變數(shù)據(jù)部分:

  • 8字節(jié),XID事務(wù)號

Begin_load_query_log_event/BEGIN_LOAD_QUERY_EVENT

用于LOAD DATA INFILE語句中。這塊用的比較少,先跳過。

Table_map_log_event/TABLE_MAP_EVENT

從5.1.5開始用于基于行的binlog文件。

固定數(shù)據(jù)部分:

  • 6字節(jié),表id
  • 2字節(jié),保留字段。

可變數(shù)據(jù)部分:

  • 1字節(jié),數(shù)據(jù)庫名長度
  • 可變大小。數(shù)據(jù)庫名(以null結(jié)尾)
  • 1字節(jié),表名長度
  • 可變大小,表名(以null結(jié)尾)
  • 封包整數(shù),表中列的數(shù)量
  • 可變大小,列類型的數(shù)組,每一列一個字節(jié)。
  • 封包整數(shù),元數(shù)據(jù)塊大小
  • 可變大小,元數(shù)據(jù)塊
  • 可變大小,位字段,表示每一列是否可以為空,每列一比特。對這個字段,對于一個N列的存儲大小為INT((N+7)/8)字節(jié)。

Write_rows_log_event_old/PRE_GA_WRITE_ROWS_EVENT

用于5.1.5到5.1.17版本的基于行的binlog,Write_rows_log_event/WRITE_ROWS_EVENT的老版本實現(xiàn)。結(jié)構(gòu)和最新的版本類似。

Update_rows_log_event_old/PRE_GA_UPDATE_ROWS_EVENT

用于5.1.5到5.1.17版本的基于行的binlog,Update_rows_log_event/UPDATE_ROWS_EVENT的老版本實現(xiàn)。結(jié)構(gòu)和最新的版本類似。

Delete_rows_log_event_old/PRE_GA_DELETE_ROWS_EVENT

用于5.1.5到5.1.17版本的基于行的binlog,Delete_rows_log_event/DELETE_ROWS_EVENT的老版本實現(xiàn)。結(jié)構(gòu)和最新的版本類似。

Write_rows_log_event/WRITE_ROWS_EVENT

用于5.1.18版本的基于行的binlog。

固定數(shù)據(jù)部分:

  • 6字節(jié),表id
  • 2字節(jié),保留字段

可變數(shù)據(jù)部分:

  • 封包整數(shù)。表中列的數(shù)量
  • 可變大小,位字段,表示每一列是否使用到,每列一個比特。對于這個字段,對于一個N列的表需要的存儲空間為INT((N+7)/8)字節(jié)。
  • 可變大?。ㄖ挥糜赨PDATE_ROWS_LOG_EVENT)。
  • 可變大小,0列或多列的序列,結(jié)尾由時間的大小決定,每一列是下面的格式:
    • 可變大小。位字段,表示每列的字段是否為空。只有在第二個字段中使用到的變量數(shù)據(jù)部分才會展示在這里。如果第二個字段包含N個比特,當(dāng)前字段需要的空間為INT((N+7)/8)字節(jié)。
    • 可變大小。列映射,包含表中所有列的值。這個字段只會列出使用到的字段。
    • 每種值的格式定義在log_event.cc的log_event_value()函數(shù)中。
    • (僅對UPDATE_ROWS_EVENT)前面的2個字段是重復(fù)的。

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

固定數(shù)據(jù)部分:

  • 1字節(jié),故障號。
  • 1字節(jié),消息長度。

可變數(shù)據(jù)部分

  • 如果有的話,是故障信息

故障號定義在rpl_constant.h中。當(dāng)前唯一使用到的是INCIDENT_LOST_EVENTS,這個表示在復(fù)制過程中可能有丟包,需要重新進行同步。

Heartbeat_log_event/HEARTBEAT_LOG_EVENT

這個事件是由master發(fā)給slave的,讓slave知道m(xù)aster還活著。這類事件不會再binlog或relay log中出現(xiàn)。他們由master的dump事件線程產(chǎn)生,然后直接發(fā)給了slave。slave收到后,校驗事件內(nèi)容后,直接拋棄這個事件,而不會寫到relay log中。

固定數(shù)據(jù)部分

可變數(shù)據(jù)部分

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容