經過上一節的鑒權過后,程序已經受主庫認可,并且可以像主庫發起同步請求。在發起請求之前,還有一個可選的步驟:確認同步時間點。同步時間點由兩個屬性進行標識: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 '' INTO 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。