久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql中遠程連接mysql很慢,本地連接mysql很快怎么處理

133次閱讀
沒有評論

共計 2408 個字符,預計需要花費 7 分鐘才能閱讀完成。

這篇文章主要介紹 mysql 中遠程連接 mysql 很慢,本地連接 mysql 很快怎么處理,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

癥狀:遠程連接 mysql 很慢,但是 本地連接 mysql 很快,ping 和 route 網絡通信都是正常的。

解決:mysql 的配置文件中增加如下配置參數:
[mysqld]
skip-name-resolve

原理:

作為 MySQL 調優的一部分,很多人都推薦開啟 skip_name_resolve。這個參數是禁止域名解析的(當然,也包括主機名)。很多童鞋會好奇,這背后的原理是什么,什么情況下開啟這個參數比較合適。

基于以下原因,MySQL 服務端會在內存中維護著一份 host 信息,包括三部分:IP,主機名和錯誤信息。主要用于非本地 TCP 連接。

1. 通過在第一次建立連接時緩存 IP 和 host name 的映射關系,同一主機的后續連接將直接查看 host cache,而不用再次進行 DNS 解析。

2. host cache 中同樣會包含 IP 登錄失敗的錯誤信息。可根據這些信息,對這些 IP 進行相應的限制。后面將會具體提到。

host cache 的信息可通過 performance_schema 中 host_cache 表查看。

那么,IP 和 host name 的映射關系是如何建立的呢?

1. 當有一個新的客戶端連接進來時,MySQL Server 會為這個 IP 在 host cache 中建立一個新的記錄,包括 IP,主機名和 client lookup validation flag,分別對應 host_cache 表中的 IP,HOST 和 HOST_VALIDATED 這三列。第一次建立連接因為只有 IP,沒有主機名,所以 HOST 將設置為 NULL,HOST_VALIDATED 將設置為 FALSE。

2. MySQL Server 檢測 HOST_VALIDATED 的值,如果為 FALSE,它會試圖進行 DNS 解析,如果解析成功,它將更新 HOST 的值為主機名,并將 HOST_VALIDATED 值設為 TRUE。如果沒有解析成功,判斷失敗的原因是永久的還是臨時的,如果是永久的,則 HOST 的值依舊為 NULL,且將 HOST_VALIDATED 的值設置為 TRUE,后續連接不再進行解析,如果該原因是臨時的,則 HOST_VALIDATED 依舊為 FALSE,后續連接會再次進行 DNS 解析。

另,解析成功的標志并不只是通過 IP,獲取到主機名即可,這只是其中一步,還有一步是通過解析后的主機名來反向解析為 IP,判斷該 IP 是否與原 IP 相同,如果相同,才判斷為解析成功,才能更新 host cache 中的信息。

基于上面的總結,下面談談 host cache 的優缺點:

缺點:當有一個新的客戶端連接進來時,MySQL Server 都要建立一個新的記錄,如果 DNS 解析很慢,無疑會影響性能。如果被允許訪問的主機很多,也會影響性能,這個與 host_cache_size 有關,這個參數是 5.6.5 引入的。5.6.8 之前默認是 128,5.6.8 之后默認是 -1, 基于 max_connections 的值動態調整。所以如果被允許訪問的主機很多,基于 LRU 算法,先前建立的連接可能會被擠掉,這些主機重新進來時,會再次進行 DNS 查詢。

優點:通常情況下,主機名是不變的,而 IP 是多變的。如果一個客戶端的 IP 經常變化,那基于 IP 的授權將是一個繁瑣的過程。因為你很難確定 IP 什么時候變化。而基于主機名,只需一次授權。而且,基于 host cache 中的失敗信息,可在一定程度上阻止外界的暴力破解攻擊。

關于阻止外界的暴力破解攻擊,涉及到 max_connect_errors 參數,默認為 100,官方的解釋如下:

If more than this many successive connection requests from a host are interrupted without a successful connection, the server blocks that host from further connections.

如果某個客戶端的連接達到了 max_connect_errors 的限制,將被禁止訪問,并提示以下錯誤:

Host  host_name  is blocked because of many connection errors.
Unblock with  mysqladmin flush-hosts

下面來模擬一下

首先,設置 max_connect_errors 的值

即便后來使用了正確的賬號和密碼登錄,依舊會被阻止。

再來看看 host_cache 表中的信息,sum_connect_errors 為 2 了。

如果該參數設置為 OFF,則上述方式就會報錯,通過報錯信息可以看出,它直接將 127.0.0.1 轉化為 localhost 了。

[root@localhost ~]# mysql -uroot -h227.0.0.1 -p123456 -P3306
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user  root @ localhost  (using password: YES)

注意:t1 @ % 中包含 t1 @ 127.0.0.1,如果開啟 skip_name_resolve 參數,則 t1 @ % 中定義的密碼可用于 t1 @ 127.0.0.1 的登錄,如果沒有開啟該參數,則 t1 @ 127.0.0.1 會轉化為 t1 @ localhost 登錄,此時 t1 @ % 定義的密碼并不適用。

以上是“mysql 中遠程連接 mysql 很慢,本地連接 mysql 很快怎么處理”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-27發表,共計2408字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 峨边| 池州市| 夏邑县| 泸定县| 新乡市| 阜新市| 仙游县| 兴宁市| 象州县| 五家渠市| 丰宁| 岳阳县| 肥东县| 娱乐| 舞钢市| 惠州市| 庄浪县| 莱芜市| 文昌市| 沁源县| 绍兴市| 新邵县| 庄浪县| 华亭县| 密云县| 左云县| 卢湾区| 木兰县| 绵阳市| 长沙市| 昌宁县| 册亨县| 得荣县| 余姚市| 正镶白旗| 三原县| 县级市| 海伦市| 库尔勒市| 海丰县| 凤山市|