mysql binlog日誌解析

一、什麼是binlog

MySQL Server 有四種類型的日誌——Error Log、General Query Log、Binary Log 和 Slow Query Log。html

  • Error Log:錯誤日誌,記錄 mysqld 的一些錯誤。
  • General Query Log:通常查詢日誌,記錄 mysqld 正在作的事情,好比客戶端的鏈接和斷開、來自客戶端每條 Sql Statement 記錄信息;若是你想準確知道客戶端到底傳了什麼瞎 [嗶嗶] 玩意兒給服務端,這個日誌就很是管用了,不過它很是影響性能。
  • Slow Query Log:是慢查詢日誌,記錄一些查詢比較慢的 SQL 語句——這種日誌很是經常使用,主要是給開發者調優用的。
  • Binary Log:就是 Binlog 了,binlog是一個二進制格式的文件,用於記錄用戶對數據庫更新的SQL語句信息。binlog包含了一些事件,這些事件描述了數據庫的改動,如建表、數據改動等,也包括一些潛在改動,好比 DELETE FROM ran WHERE bing = luan,然而一條數據都沒被刪掉的這種狀況。除非使用 Row-based logging,不然會包含全部改動數據的 SQL Statement。

顯然,咱們執行SELECT等不設計數據變動的語句是不會記錄Binlog的,而涉及到數據更新則會記錄。要注意的是,對支持事務的引擎如InnoDB而言,必需要提交了事務纔會記錄Binlog。Binlog是在事務最終commit前寫入的,binlog何時刷新到磁盤跟參數sync_binlog相關。若是設置爲0,則表示MySQL不控制binlog的刷新,由文件系統去控制它緩存的刷新,而若是設置爲不爲0的值則表示每sync_binlog次事務,MySQL調用文件系統的刷新操做刷新binlog到磁盤中。設爲1是最安全的,在系統故障時最多丟失一個事務的更新,可是會對性能有所影響,通常狀況下會設置爲100或者0,犧牲必定的一致性來獲取更好的性能。mysql

默認狀況下,binlog日誌是二進制格式的,不能使用查看文本工具的命令(好比,cat,vi等)查看,而使用mysqlbinlog解析查看。sql

2.binlog的做用

當有數據寫入到數據庫時,還會同時把更新的SQL語句寫入到對應的binlog文件裏,這個文件就是上文說的binlog文件。使用mysqldump備份時,只是對一段時間的數據進行全備,可是若是備份後忽然發現數據庫服務器故障,這個時候就要用到binlog的日誌了。shell

主要做用是用於數據庫的主從複製及數據的增量恢復。數據庫

三、開啓和停用Binlog

 

在mysql的配置文件my.cnf中,增長log_bin參數便可開啓binlog日誌緩存

 

[mysqld]
log-bin=mysql-bin

能夠經過賦值來指定binlog日誌的文件名,實例以下:安全

[root@db02 ~]# mkdir /application/mysql/logs
[root@db02 ~]# chown -R mysql.mysql /application/mysql/logs
開啓binlog
編輯/etc/my.cnf
[mysqld]
log_bin = /application/mysql/logs/dadong-bin

#這個須要重啓MySQL服務。 重啓:
/etc/init.d/mysqld restart
[root@db02
~]# ll /application/mysql/logs/ total 8 -rw-rw---- 1 mysql mysql 120 Jun 21 12:04 dadong-bin.000001 -rw-rw---- 1 mysql mysql 42 Jun 21 12:04 dadong-bin.index
爲何要刷新binlog?找到全備數據和binlog文件的恢復臨界點.
如何刷新 
天天晚上0點備份數據庫
mysqldump
-A -B -F >/opt/$(date +%F).sql
[root@db02
~]# ll /application/mysql/logs/
-rw-rw---- 1 mysql mysql 168 Jun 21 12:06 dadong-bin.000001
-rw-rw---- 1 mysql mysql 168 Jun 21 12:06 dadong-bin.000002
-rw-rw---- 1 mysql mysql 210 Jun 21 12:07 dadong-bin.index
提示:每一個庫刷新一次.

可使用SET SQL_LOG_BIN=0命令中止使用日誌文件,而後能夠經過SET SQL_LOG_BIN=1命令來啓用。bash

四、Binlog的刪除

mysql> show variables like 'expire_log_days';
mysql>  set global expire_log_days=3;  //過時刪除
mysql> reset master; //刪除master的binlog
mysql> reset slave; //刪除slave的中繼日誌
mysql> purge master logs before '2016-10-20 16:25:00';//刪除指定日期前的日誌索引中binlog日誌文件
mysql> purge master logs to 'binlog.000002';//刪除指定日誌文件

除了以上方法以外,也能夠採用操做系統的本地命令刪除文件。服務器

五、Binlog文件的擴展

當遇到如下3種狀況時會從新生成一個新的日誌文件,文件序號遞增:session

  • MySQL服務器中止或重啓時,MySQL會在重啓時生成一個新的日誌文件;
  • 使用flush logs命令;
  • 當binlog文件大小超過max_binlog_size系統變量配置的上限時;

注:binlog文件的最大值和默認值是1GB,該設置並不能嚴格控制binlog的大小,尤爲是binlog比較靠近最大值而又遇到一個比較大事務時,爲了保證事務的完整性,不可能作切換日誌的動做,只能將該事務的全部SQL都記錄到當前日誌,直到事務結束。

六、Binlog的日誌格式

binlog有三種格式:Statement, Row和Mixed.

  • 基於SQL語句的複製(statement-based replication, SBR)
  • 基於行的複製(row-based replication, RBR)
  • 混合模式複製(mixed-based replication, MBR)

(1)Statement

每一條會修改數據的sql都會記錄在binlog中。

優勢:不須要記錄每一行的變化,減小了binlog日誌量,節約了IO, 提升了性能。

缺點:因爲記錄的只是執行語句,爲了這些語句能在slave上正確運行,所以還必須記錄每條語句在執行的時候的一些相關信息,以保證全部語句能在slave獲得和在master端執行的時候相同的結果。另外mysql的複製,像一些特定函數的功能,slave可與master上要保持一致會有不少相關問題。

相比row能節約多少性能與日誌量,這個取決於應用的SQL狀況,正常同一條記錄修改或者插入row格式所產生的日誌量還小魚statement產生的日誌量,可是考慮到若是帶條件的update操做,以及整表刪除,alter表等操做,row格式會產生大量日誌,所以在考慮是否使用row格式日誌時應該根據應用的實際狀況,其所產生的日誌量會增長多少,以及帶來的IO性能問題。

(2)Row

5.1.5版本的MySQL纔開始支持row level的複製,它不記錄sql語句上下文相關信息,僅保存哪條記錄被修改。

優勢: binlog中能夠不記錄執行的sql語句的上下文相關的信息,僅須要記錄那一條記錄被修改爲什麼了。因此row的日誌內容會很是清楚的記錄下每一行數據修改的細節。並且不會出現某些特定狀況下的存儲過程,或function,以及trigger的調用和觸發沒法被正確複製的問題.

缺點:全部的執行的語句當記錄到日誌中的時候,都將以每行記錄的修改來記錄,這樣可能會產生大量的日誌內容。

新版本的MySQL中對row level模式也被作了優化,並非全部的修改都會以row level來記錄,像遇到表結構變動的時候就會以statement模式來記錄,若是sql語句確實就是update或者delete等修改數據的語句,那麼仍是會記錄全部行的變動。

(3)Mixed

從5.1.8版本開始,MySQL提供了Mixed格式,實際上就是Statement與Row的結合。
在Mixed模式下,通常的語句修改使用statment格式保存binlog,如一些函數,statement沒法完成主從複製的操做,則採用row格式保存binlog,MySQL會根據執行的每一條具體的sql語句來區分對待記錄的日誌形式,也就是在Statement和Row之間選擇一種。

七、查看binlog文件

查看當前服務器使用的二進制文件及大小:

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       126 |
| mysql-bin.000002 |       126 |
| mysql-bin.000003 |      6819 |
| mysql-bin.000004 |      2749 |
| mysql-bin.000005 |      1475 |
+------------------+-----------+

顯示主服務器使用的二進制文件及大小:

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       126 |
| mysql-bin.000002 |       126 |
| mysql-bin.000003 |      6819 |
| mysql-bin.000004 |      2749 |
| mysql-bin.000005 |      1475 |
+------------------+-----------+

顯示當前使用的二進制文件及所處位置:

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 |     1475 |              |                  |
+------------------+----------+--------------+------------------+

注:binlog_do_db:此參數表示只記錄製定數據庫的二進制日誌 

  binlog_ignore_db:此參數標示不記錄指定的數據庫的二進制日誌


須要查看某個具體binlog文件的內容時,以「mysql-bin.000005」爲例。 
在MySQL客戶端輸入:show binlog events in 'mysql-bin.000005'; 
效果以下所示:

mysql> show binlog events in 'mysql-bin.000005';
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| mysql-bin.000005 |   4 | Format_desc |         2 |         107 | Server ver: 5.5.51-log, Binlog ver: 4 |
| mysql-bin.000005 | 107 | Query       |         2 |         181 | BEGIN                                 |
| mysql-bin.000005 | 181 | Table_map   |         2 |         239 | table_id: 44 (canal_test.company)     |
| mysql-bin.000005 | 239 | Write_rows  |         2 |         287 | table_id: 44 flags: STMT_END_F        |
| mysql-bin.000005 | 287 | Xid         |         2 |         314 | COMMIT /* xid=23915 */                |
| mysql-bin.000005 | 314 | Query       |         2 |         388 | BEGIN                                 |
| mysql-bin.000005 | 388 | Table_map   |         2 |         449 | table_id: 35 (canal_test.person)      |
| mysql-bin.000005 | 449 | Update_rows |         2 |         526 | table_id: 35 flags: STMT_END_F        |
| mysql-bin.000005 | 526 | Xid         |         2 |         553 | COMMIT /* xid=26960 */                |
| mysql-bin.000005 | 553 | Query       |         2 |         627 | BEGIN                                 |
| mysql-bin.000005 | 627 | Table_map   |         2 |         688 | table_id: 35 (canal_test.person)      |
| mysql-bin.000005 | 688 | Write_rows  |         2 |         741 | table_id: 35 flags: STMT_END_F        |
| mysql-bin.000005 | 741 | Xid         |         2 |         768 | COMMIT /* xid=26961 */                |
| mysql-bin.000005 | 768 | Query       |         2 |         842 | BEGIN                                 |
| mysql-bin.000005 | 842 | Table_map   |         2 |         903 | table_id: 35 (canal_test.person)      |
| mysql-bin.000005 | 903 | Delete_rows |         2 |         956 | table_id: 35 flags: STMT_END_F        |
| mysql-bin.000005 | 956 | Xid         |         2 |         983 | COMMIT /* xid=26964 */                |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
17 rows in set (0.00 sec)

 

 

 或者使用mysqlbinlog命令,在shell終端輸入(假設當前目錄爲 ../mysql/data): ../bin/mysqlbinlog mysql-bin.000005

[root@xxx data]# pwd
/usr/local/mysql/data
[root@xxx data]# ../bin/mysqlbinlog mysql-bin.000005
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#161020 11:07:29 server id 2  end_log_pos 107   Start: binlog v 4, server v 5.5.51-log created 161020 11:07:29
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
8TQIWA8CAAAAZwAAAGsAAAABAAQANS41LjUxLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
# at 107
#161020 11:08:50 server id 2  end_log_pos 181   Query   thread_id=162   exec_time=1 error_code=0
SET TIMESTAMP=1476932930/*!*/;
SET @@session.pseudo_thread_id=162/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 181
# at 239
#161020 11:08:50 server id 2  end_log_pos 239   Table_map: `canal_test`.`company` mapped to number 44
#161020 11:08:50 server id 2  end_log_pos 287   Write_rows: table id 44 flags: STMT_END_F

BINLOG '
QjUIWBMCAAAAOgAAAO8AAAAAACwAAAAAAAEACmNhbmFsX3Rlc3QAB2NvbXBhbnkAAwMPDwQsASwB
Bg==
QjUIWBcCAAAAMAAAAB8BAAAAACwAAAAAAAEAA//4AgAAAAIAZHAIAHNoYW5naGFp
'/*!*/;
# at 287
#161020 11:08:50 server id 2  end_log_pos 314   Xid = 23915
COMMIT/*!*/;
# at 314
#161020 12:03:50 server id 2  end_log_pos 388   Query   thread_id=162   exec_time=0 error_code=0
SET TIMESTAMP=1476936230/*!*/;
BEGIN
/*!*/;
# at 388
# at 449
#161020 12:03:50 server id 2  end_log_pos 449   Table_map: `canal_test`.`person` mapped to number 35
#161020 12:03:50 server id 2  end_log_pos 526   Update_rows: table id 35 flags: STMT_END_F

BINLOG '
JkIIWBMCAAAAPQAAAMEBAAAAACMAAAAAAAEACmNhbmFsX3Rlc3QABnBlcnNvbgAFAw8D/g8GLAH+
AywBHg==
JkIIWBgCAAAATQAAAA4CAAAAACMAAAAAAAEABf//4AEAAAADAHp6aAIAAAABbQQAaGVyZeABAAAA
AwB6emgCAAAAAW0HAG5hbmppbmc=
'/*!*/;
# at 526
#161020 12:03:50 server id 2  end_log_pos 553   Xid = 26960
COMMIT/*!*/;
# at 553
#161020 12:05:56 server id 2  end_log_pos 627   Query   thread_id=162   exec_time=0 error_code=0
SET TIMESTAMP=1476936356/*!*/;
BEGIN
/*!*/;
# at 627
# at 688
#161020 12:05:56 server id 2  end_log_pos 688   Table_map: `canal_test`.`person` mapped to number 35
#161020 12:05:56 server id 2  end_log_pos 741   Write_rows: table id 35 flags: STMT_END_F

BINLOG '
pEIIWBMCAAAAPQAAALACAAAAACMAAAAAAAEACmNhbmFsX3Rlc3QABnBlcnNvbgAFAw8D/g8GLAH+
AywBHg==
pEIIWBcCAAAANQAAAOUCAAAAACMAAAAAAAEABf/gBAAAAAQAenpoNBYAAAABbQUAd2hlcmU=
'/*!*/;
# at 741
#161020 12:05:56 server id 2  end_log_pos 768   Xid = 26961
COMMIT/*!*/;
# at 768
#161020 12:06:34 server id 2  end_log_pos 842   Query   thread_id=162   exec_time=0 error_code=0
SET TIMESTAMP=1476936394/*!*/;
BEGIN
/*!*/;
# at 842
# at 903
#161020 12:06:34 server id 2  end_log_pos 903   Table_map: `canal_test`.`person` mapped to number 35
#161020 12:06:34 server id 2  end_log_pos 956   Delete_rows: table id 35 flags: STMT_END_F

BINLOG '
ykIIWBMCAAAAPQAAAIcDAAAAACMAAAAAAAEACmNhbmFsX3Rlc3QABnBlcnNvbgAFAw8D/g8GLAH+
AywBHg==
ykIIWBkCAAAANQAAALwDAAAAACMAAAAAAAEABf/gBAAAAAQAenpoNBYAAAABbQUAd2hlcmU=
'/*!*/;
# at 956
#161020 12:06:34 server id 2  end_log_pos 983   Xid = 26964
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

截取上面的一段進行分析:

# at 314
#161020 12:03:50 server id 2  end_log_pos 388   Query   thread_id=162   exec_time=0 error_code=0
SET TIMESTAMP=1476936230/*!*/;
BEGIN
/*!*/;

 

上面輸出包括以下要素:

  • position: 位於文件中的位置,即第一行的(# at 314),說明該事件記錄從文件第314個字節開始
  • timestamp: 事件發生的時間戳,即第二行的(#161020 11:07:29)
  • exec_time: 事件執行的花費時間
  • error_code: 錯誤碼
  • server id: 服務器標識(2)
  • thread_id: 代理線程id (thread_id=162)
  • type:事件類型Query(參考下一章節)

使用mysqlbinlog命令還能夠進行數據庫恢復,使用日誌進行恢復時,須要依次進行,即最先生成的日誌文件要最早恢復:

mysqlbinlog mysql-bin.000001 | mysql -uroot -proot
mysqlbinlog mysql-bin.000002 | mysql -uroot -proot
.....

八、Binlog事件

Binlog事件類型

binlog事件類型一共有三個版本:

  • v1: Used in MySQL 3.23
  • v3: Used in MySQL 4.0.2 though 4.1
  • v4: Used in MySQL 5.0 and up

注:v2出現了很短的時間,而且已經不被支持

如今所使用的MySQL通常都是5.5起了,因此下面陳述的都是v4版的binlog事件類型。

binlog的事件類型一共有如下幾種:

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, 
  PRE_GA_WRITE_ROWS_EVENT = 20, 
  PRE_GA_UPDATE_ROWS_EVENT = 21, 
  PRE_GA_DELETE_ROWS_EVENT = 22, 
  WRITE_ROWS_EVENT = 23, 
  UPDATE_ROWS_EVENT = 24, 
  DELETE_ROWS_EVENT = 25, 
  INCIDENT_EVENT= 26, 
  HEARTBEAT_LOG_EVENT= 27, 
  IGNORABLE_LOG_EVENT= 28,
  ROWS_QUERY_LOG_EVENT= 29,
  WRITE_ROWS_EVENT_V2 = 30,
  UPDATE_ROWS_EVENT_V2 = 31,
  DELETE_ROWS_EVENT_V2 = 32,
  GTID_LOG_EVENT= 33,
  ANONYMOUS_GTID_LOG_EVENT= 34,
  PREVIOUS_GTIDS_LOG_EVENT= 35, 
  ENUM_END_EVENT 
  /* end marker */ 
};

如今(從5.1.7版本開始)使用的WRITE, UPDATE, DELETE三個事件類型分別採用23,24,25。

事件類型簡述

  • QUERY_EVENT

記錄一條query語句,在基於語句的複製和基於行的複製都會有。

  • ROTATE_EVENT

二進制日誌更換一個新文件,可能由於文件大小達到限制,或者是mysql重啓,亦或者是調用了flush logs命令。

  • XID_EVENT

Commit事件

  • WRITE_ROWS_EVENT, UPDATE_ROWS_EVENT, DELETE_ROWS_EVENT

統稱爲ROW EVENT, 只有在基於row的複製方式下才會產生。

WRITE_ROWS_EVENT:包含了要插入的數據
UPDATE_ROWS_EVENT:包含了修改前的值,也包含了修改後的值
DELETE_ROWS_EVENT:包含了須要刪除行前的值

  • TABLE_MAP_EVENT

ROW EVENT以前產生,爲的是對ROW EVENT解析提供依據。

  • FORMAT_DESCRIPTION_EVENT

MySQL根據其定義來解析其餘事件

  • INTVAR_EVET

在statement時使用到,用於自增類型auto_increment.

  • STOP_EVENT

MySQL中止時,在文件尾加入STOP_EVENT

更多事件類型能夠參考MySQL官方文檔:http://dev.mysql.com/doc/internals/en/event-meanings.html

事件類型分析

每一個event都有一個19個字節的Binlog Event Header(以下圖), 包括四個字節的timestamep, 一個字節的Binlog Event type, 4個字節的server_id(該id代表binlog的源server是哪一個,用來在循環複製中國龍event),四個字節的event包大小,四個字節的下一個event起始偏移,兩個字節的Binlog Event Flag. extra_headers目前的event中沒有涉及到,預留用。

V4 event structure:

 

一個新的binlog文件都是以FORMAT_DESCRIPTION_EVENT開始的(v4版)。這裏就以FORMAT_DESCRIPTION_EVENT爲例來解析下(mysql-bin.000005)。經過hexdump -C mysql-bin.000005來查看二進制文件。(下面只列出部份內容)

[root@xxx data]# hexdump -C mysql-bin.000005 
00000000  fe 62 69 6e f1 34 08 58  0f 02 00 00 00 67 00 00  |.bin.4.X.....g..|
00000010  00 6b 00 00 00 01 00 04  00 35 2e 35 2e 35 31 2d  |.k.......5.5.51-|
00000020  6c 6f 67 00 00 00 00 00  00 00 00 00 00 00 00 00  |log.............|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 13  |................|
00000050  38 0d 00 08 00 12 00 04  04 04 04 12 00 00 54 00  |8.............T.|
00000060  04 1a 08 00 00 00 08 08  08 02 00 42 35 08 58 02  |...........B5.X.|
00000070  02 00 00 00 4a 00 00 00  b5 00 00 00 08 00 a2 00  |....J...........|
00000080  00 00 01 00 00 00 0a 00  00 1a 00 00 00 00 00 00  |................|
00000090  01 00 00 00 00 00 00 00  00 06 03 73 74 64 04 21  |...........std.!|

按照官方文檔中的說明來看下FORMAT_DESCRIPTION_EVENT格式:

v4 format description event

 

binlog是小端字節序的。binlog前4個字節是魔數:0xFE 0x62 0x69 0x6E. 接着是一個FORMAT_DESCRIPTION_EVENT,先看下19個字節的event header. f1 34 08 58即0x580834f1是指時間戳,佔4個字節;第5個字節0x0f是type_code即event type(FORMAT_DESCRIPTION_EVENT=15);接着4個字節02 00 00 00 即0x00000002是server_id;再接着4個字節67 00 00 00是event_length=0x00000067=103;而後4個字節6b 00 00 00是下一個next_position=0x0000006b=107;接着兩個字節01 00是flag=0x0001=1,1爲LOG_EVENT_BINLOG_IN_USE_F,標識binlog尚未關閉,binlog關閉後,flag會被設置爲0。這樣4+1+4+4+4+2=19個字節。

event data部分分爲fixed data和variable data兩部分,其中fixed data是event的固定長度和格式的數據,variable data則是長度變化的數據,好比FORMAT_DESCRIPTION_EVENT的fix data長度是0x54=84字節。下面看下這84=2+50+4+1+27個字節的分配:開始的2個字節0x0004是binlog的版本號;接着的50個字節爲mysql-server版本5.5.51-log;接下來4個字節是binlog建立時間,這裏是0;而後1個字節是0x13是指以後全部event的公共長度,這裏都是19;接着27個字節中每一個字節爲mysql已知的event(共27個)的fixed data的長度;能夠發現FORMAT_DESCRIPTION_EVENT自身的variable data部分爲空。

參考資料: 
1. Linux(CentOS)中經常使用軟件安裝,使用及異常——MySQL, VmTools 
2. The Binary Log 
3. MySQL主備複製原理、實現及異常處理 
4. MySQL binlog格式解析————————————————版權聲明:本文爲CSDN博主「朱小廝」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/u013256816/article/details/53020335

相關文章
相關標籤/搜索