mysql lenenc int_MySQL-NonMySQL同步工具源码解读——确定同步位置
經(jīng)過上一節(jié)的鑒權(quán)過后,程序已經(jīng)受主庫認(rèn)可,并且可以像主庫發(fā)起同步請求。在發(fā)起請求之前,還有一個可選的步驟:確認(rèn)同步時間點(diǎn)。同步時間點(diǎn)由兩個屬性進(jìn)行標(biāo)識:Binlog文件名、偏移量。工具支持自定義時間點(diǎn),如果沒有指定,默認(rèn)從主庫的當(dāng)前時間點(diǎn)開始同步。下面,介紹獲取時間點(diǎn)協(xié)議,主要是向主庫發(fā)起“SHOW MASTER STATUS”查詢指令。
這是一個COM_QUERY類型的查詢。COM_QUERY是基本的查詢命令,服務(wù)器返回若干行,每行若干列,可能我們常見的select指令,也是COM_QUERY命令。他的格式非常簡單。1 [03] COM_QUERY
string[EOF] the query the server shall execute
而解析服務(wù)器返回的結(jié)果可以說非常復(fù)雜,所以我們寫數(shù)據(jù)庫程序一般是使用客戶端庫,而不是自行解析。總體流程如下:
對于第一個字節(jié)是0xfb的情況,只在執(zhí)行如下指令的時候才會發(fā)生。應(yīng)用目前沒有這種操作,所以暫時忽略之。LOAD DATA LOCAL INFILE '' INTO TABLE
EOF、ERR、OK包的格式上一節(jié)都有描述,下面給出列定義和行數(shù)據(jù)的解析方法。
列定義
主要是兩個版本,一個是ColumnDefinition41和ColumnDefinition320這兩種,后者應(yīng)用于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
}
行數(shù)據(jù)
每行可以包含多個列,每個列都是一個lenenc_str。
lenenc_xxx
這里簡單說一下這種lenenc_xxx類型的東西到底是什么。lenenc_str由兩部分組成,第一部分是一個lenenc_int類型、標(biāo)記字串長度的整數(shù),第二部分是字串本身。這個lenenc_int類型,保證了字串長度可以超過255。同時考慮到大部分?jǐn)?shù)據(jù)都比較短,每次都用多個字節(jié)表示長度過于浪費(fèi),于是指定了編碼規(guī)則,規(guī)則如下:
A. 如果第一個字節(jié)小于0xfb,那么他本身就是字串長度。
B. 如果第一個字節(jié)是0xfc,那么他后面的2個字節(jié)表示字串長度。
C. 如果第一個字節(jié)是0xfd,那么他后面的3個字節(jié)表示字串長度。
D. 如果第一個字節(jié)是0xfe,那么他后面的8個字節(jié)表示字串長度。需要注意,此時需要查看究竟他后面有沒有8個字節(jié),如果沒有,可能這是一個EOF包。
E. 如果第一個字節(jié)是0xff,那么這意味著一個ERR包。
F. 如果第一個字節(jié)是0xfb,這只會出現(xiàn)在行數(shù)據(jù)中,意味著這個字段是個NULL。
總結(jié)
以上是生活随笔為你收集整理的mysql lenenc int_MySQL-NonMySQL同步工具源码解读——确定同步位置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu14.04LTS打造实用的环
- 下一篇: mysql分析sql语句性能_sql语句