CanalBinlogChange(mysql5.6)

憤怒的蘋果發表於2016-03-30

背景

先前開源了一個開源專案: 【阿里巴巴開源專案: 基於mysql資料庫binlog的增量訂閱&消費】 

 

本文主要是介紹一下canal1.0.3支援mysql5.6協議上的變化. 

 

協議變化

1.   binlog checksum

    mysql5.6之後,支援在binlog物件中增加checksum資訊,比如CRC32協議.   其原理主要是在原先binlog的末尾新增了4個byte,寫入一個crc32的校驗值

    對應引數說明: http://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#sysvar_binlog_checksum

    注意:

  • mysql5.6.6之後預設就會開啟checksum. 
  • 如果canal要開啟checksum協議支援,需要設定session引數,目前canal只解析checksum,並沒有對checksum進行校驗
  • 1.set @master_binlog_checksum= `@@global.binlog_checksum`     
    set @master_binlog_checksum= `@@global.binlog_checksum`  

2.  INSERT/UPDATE/DELETE協議變化 

1.public static final int    WRITE_ROWS_EVENT_V1      = 23;  
2.public static final int    UPDATE_ROWS_EVENT_V1     = 24;  
3.public static final int    DELETE_ROWS_EVENT_V1     = 25;  
4.  
5./** Version 2 of the Row events */  
6.public static final int    WRITE_ROWS_EVENT         = 30;  
7.public static final int    UPDATE_ROWS_EVENT        = 31;  
8.public static final int    DELETE_ROWS_EVENT        = 32;  
public static final int    WRITE_ROWS_EVENT_V1      = 23;
public static final int    UPDATE_ROWS_EVENT_V1     = 24;
public static final int    DELETE_ROWS_EVENT_V1     = 25;

/** Version 2 of the Row events */
public static final int    WRITE_ROWS_EVENT         = 30;
public static final int    UPDATE_ROWS_EVENT        = 31;
public static final int    DELETE_ROWS_EVENT        = 32;

   新增了version 2的協議,主要的變化,就是增加了self check extra的資訊,和checksum一樣保證資料的完整性. 

   對應引數說明: http://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#sysvar_log_bin_use_v1_row_events

   預設值為0,也就是會開啟version 2協議,mysql5.5之前預設是version 1協議

 

3.  RowsQueryLogEvent事件新增

    對應事件說明: http://dev.mysql.com/worklog/task/?id=5404  ,(主要用途:就是在RBR模式下,也可以輸出原始執行insert/update/delete的sql資訊)

    對應引數說明: http://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#option_mysqld_binlog-rows-query-log-events

    預設值為false,代表不開啟。 如果設定為true,對應的一個事務中的LogEvent事件就會變為: (RowsQuery會出現在tableMap協議之前)

1.Query :  Begin   
2.RowsQuery:   insert/update/delete sql  
3.TableMap :   
4.Rows :  Write/Update/DELETE  
5.Query/XId   

Query :  Begin 
RowsQuery:   insert/update/delete sql
TableMap : 
Rows :  Write/Update/DELETE
Query/XId 

 

4.  其他協議變化

  • HEARTBEAT_LOG_EVENT      = 27   ##主要用途:在mysql idle期間,傳送一些heartbeat事件,對應事件的內容是上一次最後傳送的LogEvent資訊
  • IGNORABLE_LOG_EVENT = 28  ## 可忽略的logEvent事件概念,這是mysql為了後續協議擴充套件引入的,在低版本mysql發現無法識別LogEvent時,可根據LOG_EVENT_IGNORABLE_F標誌來判斷是否可以直接丟棄. 
  • GTID_LOG_EVENT           = 33 
  • ANONYMOUS_GTID_LOG_EVENT = 34
  • PREVIOUS_GTIDS_LOG_EVENT = 35

   目前gtid協議只是解析,並沒有使用GTID發起COM_BINLOG_DUMP,後續會考慮支援. 

 

5.  新增type :  TIME2/DATETIME2/TIMESTAMP2

1.public static final int    MYSQL_TYPE_TIMESTAMP2    = 17;  
2.public static final int    MYSQL_TYPE_DATETIME2     = 18;  
3.public static final int    MYSQL_TYPE_TIME2         = 19;  
    public static final int    MYSQL_TYPE_TIMESTAMP2    = 17;
    public static final int    MYSQL_TYPE_DATETIME2     = 18;
    public static final int    MYSQL_TYPE_TIME2         = 19;

 新增了3種mysql type型別,和5.5之前的有不同的儲存格式,最可惡的是居然是採用了Big-Endian,和之前的所有事件解析litten-Endian形成一個對比,不知道mysql那幫人怎麼想的

測試

1.  mysql版本: 5.6.10

2.  mysql server配置 : 

1.server-id=1  
2.binlog-checksum=CRC32  
3.#binlog-checksum=NONE  
4.master-verify-checksum=1  
5.slave-sql-verify-checksum=1  
6.log-bin=mysql-bin  
7.binlog-format=ROW  
8.binlog-rows-query-log-events=true  
9.log-bin-use-v1-row-events=1  
10.binlog_cache_size=2M  
11.max_binlog_size=512M  
12.sync_binlog=0  
13.character-set-server = utf8  
14.#default-character-set = utf8  
15.collation-server = utf8_unicode_ci  
16.[mysql]  
17.default-storage-engine=INNODB  
18.default-character-set=utf8  

server-id=1
binlog-checksum=CRC32
#binlog-checksum=NONE
master-verify-checksum=1
slave-sql-verify-checksum=1
log-bin=mysql-bin
binlog-format=ROW
binlog-rows-query-log-events=true
log-bin-use-v1-row-events=1
binlog_cache_size=2M
max_binlog_size=512M
sync_binlog=0
character-set-server = utf8
#default-character-set = utf8
collation-server = utf8_unicode_ci
[mysql]
default-storage-engine=INNODB
default-character-set=utf8

 3. 測試注意(需要設定master_binlog_checksum變數,和mysql server保持一致)

1.Connection connection = DriverManager.getConnection("jdbc:mysql://10.20.144.34:3306", "root", "root");  
2.Statement statement = connection.createStatement();  
3.statement.execute("SET @master_binlog_checksum=`@@global.binlog_checksum`");  


相關文章