給每個資料塊加上乙個包頭
由於連線的建立和釋放都需要耗費資源,所以資料庫這種互動頻繁,且連線數量不需要特別大的應用場景,一般使用長連線。
使用短連線尚能通過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 另外,可以增加一下兩個引數,來擴...