1. 程式人生 > >Mysql系列(2)-MySQL網路協議基礎分析

Mysql系列(2)-MySQL網路協議基礎分析

 

引言

閱讀本文之前你需要對網路協議需要有基本的瞭解,比如兩臺機子之間的資料是如何通訊的,硬體層可以暫時不需瞭解,但網路層和傳輸層的協議要有一定的理解,比如IP資料包,TCP/IP協議,UDP協議等相關概念,有了這些基礎,有利於你閱讀本文。

 

背景

在歷史悠久的時代,資料庫只作為單機儲存,也不怎麼需要與程式進行互動的時候的首,它的網路通訊並不是那麼重要,但隨著時代的發展,資料庫不再只是單純的作為一個數據的倉庫了,它需要提供與外界的互動,比如遠端連線,程式操作資料庫等,這時候一份規範的網路通訊的協議就非常重要了,比如它是如何校驗許可權,如何解析SQL語句,如何返回執行結果都需要用到相應的協議,很多時候我們並不需要接觸這些內容,因為它太底層了,我們直接使用把它們封裝好的第三方包就可以了,為什麼還要去學習它的網路協議呢?確實對於一開始學習程式設計的人來說,這有點操之過急,反而有時候會適得其反,但當你對這一方面有了一定的瞭解之後,你便會迫不及待得想去探索更深層的奧祕,去了解並學習我們平常用的第三方類庫是怎麼去實現,明白它的底層原理,甚至對一些莫名其妙的bug也不會再害怕。

 

MySQL連線方式

分析協議,我們首先要了解如何與資料庫連線,說到MySQL連線方式,大家突然可能有點懵,其實它一直伴隨著我們,比如我們第一次裝資料庫完成後執行的第一次登入,比如你沒有設定密碼:

mysql –uroot
 
這是最基本的一種資料庫連線方式,那麼MySQL連線方式到底有幾種呢?到MySQL5.7為止,總共有五種,分別是TCP/IP,TLS/SSL,Unix Sockets,Shared Memory,Named pipes,下面我們就來看看這五種的區別:
 
方式 預設開啟 支援系統 只支援本機
如何開啟 引數配置
TCP/IP 所有系統 --skip-networking=yes/no --port  --bind-address
TLS/SSL 所有系統(基於tcp/ip之上) --ssl=yes/no --ssl-* options
Unix Sockets 類Unix系統 設定--socket=<empty>來關閉 --socket=socket path
Shared Memory Windows系統 --sharet-memory=on/off

--shared-memory-base-name=<name>

Named pipes Windows系統 --enable-named-piped=on/off --socket=<name>
 
 
從上表中我們可以清晰看出每種連線方式的區別,接下里我會具體說明幾種連線是怎麼操作的,由於我的機子是Mac OS系統,這裡只模擬非Windows系統下的三種方式,因為這三種方式都是預設開啟的,我們不需要進行任何配置:
 

1.Unix Sockets:

mysql –uroot
 
若你在本機使用這種方式連線MySQL資料庫的話,它預設會使用Unix Sockets。
 
 

2.TCP/IP:

mysql --protocol=tcp -uroot
mysql -P3306 -h127.0.0.1 –uroot
 
連線的時候我們指定連線協議,或者指定相應的IP及埠,我們的連線方式就變成了TCP/IP方式。
 
 

3.TLS/SSL:

mysql --protocol=tcp -uroot --ssl=on
mysql -P3306 -h127.0.0.1 -uroot --ssl=on
 

上表說過,TLS/SSL是基於TCP/IP的,所以我們只需再指定開啟ssl配置即可。

然後我們可以通過以下語句來查詢目前資料庫的連線情況:

SELECT DISTINCT connection_type from performance_schema.threads where connection_type is not null
 

那麼我們如何選擇連線方式呢?個人總結了以下幾個原則:

  • 若是你能確定程式和資料庫在同一臺機子(類Unix系統)上,推薦使用Unix Sockets,因為它效率更高;
  • 若資料庫分佈在不同的機子上,且能確保連線安全或者安全性要求不是那麼高,推薦使用TCP/IP,反之使用TLS/SSL;
 
 

MySQL資料包

通訊中最重要的就是資料,那麼程式是如何和MySQL Server進行通訊,並互動資料的呢?比如如何驗證賬戶,傳送查詢語句,返回執行結果等,我先畫一個流程圖來模擬一下整個過程,幫助大家理解:

3120625295-5a1aa4252b897_articlex

 

整個過程相對來說還是比較清晰的,我們對連線請求和斷開請求不需要過分關心,只需要瞭解這一點就可以了,重要的是其他幾點,那麼在這幾步中,資料是怎麼進行互動的呢?

其實主要就是兩步,Client將執行命令編碼成Server要求的格式傳輸給Server端執行,Server端將執行結果傳輸給Client端,Client端再根據相應的資料包格式解析獲得所需的資料