MySQL-NonMySQL同步工具源碼解讀——確定同步位置

經過上一節的鑑權過後,程序已經受主庫認可,並且可以像主庫發起同步請求。在發起請求之前,還有一個可選的步驟:確認同步時間點。同步時間點由兩個屬性進行標識:Binlog文件名、偏移量。工具支持自定義時間點,如果沒有指定,默認從主庫的當前時間點開始同步。下面,介紹獲取時間點協議,主要是向主庫發起“SHOW MASTER STATUS”查詢指令。

這是一個COM_QUERY類型的查詢。COM_QUERY是基本的查詢命令,服務器返回若干行,每行若干列,可能我們常見的select指令,也是COM_QUERY命令。他的格式非常簡單。

1              [03] COM_QUERY
string[EOF]    the query the server shall execute

而解析服務器返回的結果可以說非常複雜,所以我們寫數據庫程序一般是使用客戶端庫,而不是自行解析。總體流程如下:

wKiom1L5xjSQbRtjAAIMSl2ZnwI790.jpg

對於第一個字節是0xfb的情況,只在執行如下指令的時候纔會發生。應用目前沒有這種操作,所以暫時忽略之。

LOAD DATA LOCAL INFILE '<filename>' INTO TABLE <table>;

EOF、ERR、OK包的格式上一節都有描述,下面給出列定義和行數據的解析方法。

列定義

主要是兩個版本,一個是ColumnDefinition41和ColumnDefinition320這兩種,後者應用於4.1以前版本的MySQL。這裏只給出新版MySQL的格式。

lenenc_str     catalog
lenenc_str     schema
lenenc_str     table
lenenc_str     org_table
lenenc_str     name
lenenc_str     org_name
lenenc_int     length of fixed-length fields [0c]
2              character set
4              column length
1              type
2              flags
1              decimals
2              filler [00] [00]
  if command was COM_FIELD_LIST {
lenenc_int     length of default-values
string[$len]   default values
  }

行數據

每行可以包含多個列,每個列都是一個lenenc_str

lenenc_xxx

這裏簡單說一下這種lenenc_xxx類型的東西到底是什麼。lenenc_str由兩部分組成,第一部分是一個lenenc_int類型、標記字串長度的整數,第二部分是字串本身。這個lenenc_int類型,保證了字串長度可以超過255。同時考慮到大部分數據都比較短,每次都用多個字節表示長度過於浪費,於是指定了編碼規則,規則如下:

A. 如果第一個字節小於0xfb,那麼他本身就是字串長度。

B. 如果第一個字節是0xfc,那麼他後面的2個字節表示字串長度。

C. 如果第一個字節是0xfd,那麼他後面的3個字節表示字串長度。

D. 如果第一個字節是0xfe,那麼他後面的8個字節表示字串長度。需要注意,此時需要查看究竟他後面有沒有8個字節,如果沒有,可能這是一個EOF包。

E. 如果第一個字節是0xff,那麼這意味着一個ERR包。

F. 如果第一個字節是0xfb,這隻會出現在行數據中,意味着這個字段是個NULL。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章