mysql 的連接器是msyql server層的第一個模塊。當(dāng)我們用mysql 客戶端來連接mysql服務(wù)器的時候,處理這個連接請求的就是連接器模塊。
mysql客戶端和服務(wù)器端的連接使用的是TCP協(xié)議,在完成TCP握手之后,連接器開始進(jìn)行身份認(rèn)證。
如果用戶名或密碼不對,那么連接器會拋出一個 "Access denied for user"的錯誤,客戶端結(jié)束執(zhí)行。
如果用戶名密碼認(rèn)證通過,那么連接器會到權(quán)限表中查出賬號擁有的權(quán)限。以后所有的權(quán)限判斷都是基于此時查出的權(quán)限。這意味著,一個用戶成功建立連接后,即使root用戶修改了這個用戶的權(quán)限,對之前的連接也不能生效。只有修改之后生成的連接才能獲取到新的權(quán)限。
連接建立成功后,如果長時間沒有操作,連接器會自動斷開連接。斷開連接的時間是由wait_timeout控制的,默認(rèn)值是8小時。
如果連接被斷開后,客戶端再次發(fā)生請求,會收到“Lost connection to MySQL server during query”的錯誤提示。這時候想要執(zhí)行查詢,就需要重連了。
使用show processlist 可以查看系統(tǒng)所有連接的信息。其中Command 列表示 連接的狀態(tài),“Sleep” 表示 連接是一個空間的連接,沒有進(jìn)行操作。
mysq的長連接是指連接成功后,客戶端有持續(xù)的請求,使用的一直是同一個連接。短連接是指每次執(zhí)行完少量的操作后就斷開連接,下次使用在重新建立連接。
因?yàn)檫B接過程比較復(fù)雜,所以推薦使用長連接。
但是使用長連接,會存在占用內(nèi)存大的問題。這是因?yàn)樵陂L連接中申請的臨時內(nèi)存會一直存在,只有當(dāng)連接斷開的時候才釋放。
解決長連接占用內(nèi)存大的問題有兩個方法 1)定期斷開長連接,清楚長連接占用的內(nèi)存。 2) mysql 5.7 或者更高的版本,可以執(zhí)行 mysql_reset_connection 來重新初始化連接。這個過程不需要重新建立連接,但是會釋放占用的臨時內(nèi)存,將連接恢復(fù)到剛剛創(chuàng)立連接的狀態(tài)。