經過上一節的鑑權過後,程序已經受主庫認可,並且可以像主庫發起同步請求。在發起請求之前,還有一個可選的步驟:確認同步時間點。同步時間點由兩個屬性進行標識:Binlog文件名、偏移量。工具支持自定義時間點,如果沒有指定,默認從主庫的當前時間點開始同步。下面,介紹獲取時間點協議,主要是向主庫發起“SHOW MASTER STATUS”查詢指令。
這是一個COM_QUERY類型的查詢。COM_QUERY是基本的查詢命令,服務器返回若干行,每行若干列,可能我們常見的select指令,也是COM_QUERY命令。他的格式非常簡單。
1 [03] COM_QUERY string[EOF] the query the server shall execute
而解析服務器返回的結果可以說非常複雜,所以我們寫數據庫程序一般是使用客戶端庫,而不是自行解析。總體流程如下:
對於第一個字節是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。