mysql binlog 事件,【文檔】七、Mysql Binlog不同事件類型的事件內容

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

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中。

固定數據部分

可變數據部分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值