mysql資料報 MySQL通訊協議(2)資料報

2021-10-18 02:43:47 字數 1722 閱讀 4426

給每個資料塊加上乙個包頭

由於連線的建立和釋放都需要耗費資源,所以資料庫這種互動頻繁,且連線數量不需要特別大的應用場景,一般使用長連線。

使用短連線尚能通過rst判斷資料是否讀完了,而長連線就不能這麼做了,同時由於tcp的特點,資料讀寫會發生拆包、粘包。所以使用長連線傳輸資料,必須通過某種方法把要傳送的資料告訴接收方。例如http協議head裡的content-length。也可以通過特殊的符號判斷,不過由於訊息裡可能也會出現這些符號,會發生歧義,所以應用場景受限。還有一種最簡單的方法就是每次傳送固定長度訊息,不夠用0填充。

mysql資料報結構

type

name

description

payload_length

payload的長度,整數型別。不包括包頭四個位元組

sequence_id

sequence id

payload

有效載荷,字串型別。長度=payload_length

訊息包分為兩個部分,包頭+包體。

包頭固定四個位元組,前三個位元組是整數型的payload長度,第四個是整數型的訊息序列號。

包體就是這個包的有效載荷,長度由前三位元組指定,內容根據具體場景各不相同。

例如,乙個訊息為03 00 00 01 01 02 03 04。先讀取前四個位元組,發現這個訊息包體有3個位元組,這個訊息序號是0,訊息內容是01 02 03,後面的04是下乙個包的資料。

包體長度

由於包體長度是由三個位元組記錄的,三個位元組能表示的最大值為ff ff ff,即1<24-1=2^24-1=16777215=15.999...m。所以,乙個mysql訊息包體不能超過16mb。如果超過16mb,就分多次傳送。

訊息序號

訊息號用來標記每個訊息的順序,會自動增長,並迴圈。

通用響應包

對於大多數請求,服務端有一些通用的響應包結構。

ok_packet

命令成功完成後的響訊息。

type

name

description

header

[00] 或 [fe]

affected_rows

affected rows 影響行數

last_insert_id

last insert-id 最後插住資料id

if capabilities & client_protocol_41 else if capabilities & client_transactions else {

header:表明這是乙個ok還是eof響應。

capabilities :在建立連線階段,客戶端和服務端交換的字段,用於表示支援哪些特性。

client_protocol_41:4.1+版本的客戶端使用的協議。

err_packet

type

name

description

header

[ff]

error_code

錯誤碼if capabilities & client_protocol_41 {

sql_state_marker

# marker of the sql state

sql_state

sql state

error_message

容易理解的錯誤資訊

mysql通訊的資料報大小

1 應用程式 比如php 長時間的執行批量的mysql語句。最常見的就是採集或者新舊資料轉化。解決方案 在my.ini檔案中新增或者修改以下兩個變數 wait timeout 2880000 interactive timeout 2880000 關於兩個變數的具體說明可以google或者看官方手冊...

tcpdump抓mysql資料報

tcpdump i lo l port 3306 w lo.pcap strings i 指定網絡卡。l 將標準輸出變為緩衝行形式。port 指定埠,只抓取3306埠的資料報。w 將抓到的資料寫入檔案。string 表示式。tcpdump採用命令列方式,它的命令格式為 tcpdump adeflnn...

MySQL外部匯入資料報錯

問題 從伺服器上把資料庫匯出成sql,匯入本地資料庫報錯error code 2006 mysql 伺服器已離線 解決方法 1 這個問題是因為mysql的預設max allowed packet過小所致,修改大一些即可 max allowed packet 100m 另外,可以增加一下兩個引數,來擴...