賬號或密碼不對,服務(wù)端會返回一個 "ERROR 1045 (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES)" 的錯誤,退出連接。 驗證通過,連接器就會到權(quán)限表查出你的權(quán)限。之后你有啥權(quán)限都要通過這時讀到的權(quán)限進行判斷。 注意,我說的是此時查到的權(quán)限。就算你用管理員賬號修改了當(dāng)前用戶的權(quán)限,此時已連接上的當(dāng)前用戶不受影響,必須要重啟 mysql 新的權(quán)限才會生效。
1.1.1 查看連接狀態(tài)
連接完成,如果后續(xù)沒有做任何事情,這個連接就處于空閑狀態(tài)。你可以用 show processlist; 命令查看 mysql 的連接信息,如下圖,我的數(shù)據(jù)庫連接都是 Sleep 狀態(tài)的,除了執(zhí)行 show processlist 操作的連接。
1.1.2 控制連接
如果客戶端太長時間沒有操作,此連接將會自動斷開。這個時間默認(rèn)是 8 小時,由參數(shù) wait_timeout 控制。如果斷開以后繼續(xù)操作就會收到 "Lost connection to MySQL server during query"的錯誤。這時就必須重連才能執(zhí)行請求。
由于建立連接是比較耗時的操作,所以建議使用長連接。但這會有個問題長連接一直連著就會導(dǎo)致內(nèi)存占用過大,被系統(tǒng)強行沙雕。從而導(dǎo)致 MySQL 異常重啟。如何解決呢?兩個方法:
定期斷開長連接。使用特定時間,或者程序判斷執(zhí)行一個占用內(nèi)存大的操作后,斷開連接。之后需要操作就重連。 mySQL 5.7 或以上版本,可以在每次執(zhí)行一個占用內(nèi)存大的操作后,執(zhí)行mysql_reset_connection來重新連接資源,此時不需重連或重新做權(quán)限認(rèn)證,但會把連接狀態(tài)恢復(fù)到剛創(chuàng)建完時。