程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 關於skip_name_resolve參數的總結分享

關於skip_name_resolve參數的總結分享

編輯:MySQL綜合教程

關於skip_name_resolve參數的總結分享。本站提示廣大學習愛好者:(關於skip_name_resolve參數的總結分享)文章只能為提供參考,不一定能成為您想要的結果。以下是關於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的值

mysql> show variables like 'max_connect_errors';
+--------------------+-------+
| Variable_name   | Value |
+--------------------+-------+
| max_connect_errors | 100  |
+--------------------+-------+
row in set (0.00 sec)

mysql> set global max_connect_errors=2;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'max_connect_errors';
+--------------------+-------+
| Variable_name   | Value |
+--------------------+-------+
| max_connect_errors | 2   |
+--------------------+-------+
row in set (0.00 sec)

經由過程telnet模仿interrupted without a successful connection。

[root@mysql-slave1 ~]# telnet 192.168.244.145 3306
Trying 192.168.244.145...
Connected to 192.168.244.145.
Escape character is '^]'.
N
5.6.26-log
     K]qA1nYT!w|+ZhxF1c#|kmysql_native_password
^]
!#08S01Got packets out of orderConnection closed by foreign host.
[root@mysql-slave1 ~]# telnet 192.168.244.145 3306
Trying 192.168.244.145...
Connected to 192.168.244.145.
Escape character is '^]'.
N
Y#>PVB(>!Bl}NKnjIj]sMmysql_native_password
^]
!#08S01Got packets out of orderConnection closed by foreign host.
[root@mysql-slave1 ~]# mysql -h192.168.244.145 -uroot -p123456
Warning: Using a password on the command line interface can be insecure.
ERROR 1129 (HY000): Host '192.168.244.144' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

即使後來應用了准確的賬號和暗碼登錄,照舊會被阻攔。

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

mysql> select ip,host,host_validated,sum_connect_errors,count_authentication_errors from performance_schema.host_cache;
+-----------------+------+----------------+--------------------+-----------------------------+
| ip       | host | host_validated | sum_connect_errors | count_authentication_errors |
+-----------------+------+----------------+--------------------+-----------------------------+
| 192.168.244.144 | NULL | YES      |         2 |              0 |
+-----------------+------+----------------+--------------------+-----------------------------+
row in set (0.00 sec)

該阻攔會一向失效,直到采用以下操作:

1. mysql> flush hosts;

2. # mysqladmin flush-hosts

3. truncate table performance_schema.host_cache;

4. 或許期待該記載從host cache中被擠失落。

 

假如要制止DNS解析,可設置skip_name_resolve參數,如許,mysql.user表中基於主機名的受權將沒法應用,且毛病日記中會提醒:

[Warning] 'user' entry 'root@mysql-slave1' ignored in --skip-name-resolve mode.

這裡,經由過程mysql-slave1拜訪,將會謝絕拜訪

[root@mysql-slave1 ~]# mysql -h192.168.244.145 -uroot -p123
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'192.168.244.144' (using password: YES)

host cache是默許開啟的,假如要禁失落,可將host_cache_size設置為0,該參數是個靜態參數,可在線修正。

假如要完整禁失落TCP/IP銜接,可在MySQL啟動時,設置skip-networking參數。

總結:

1. 從道理上看,DNS解析普通只針對客戶真個第一次銜接,客戶端數據量比擬小的情形下,開支其實不年夜,完整不用啟動skip_name_resolve參數,帶來的利益就是,為客戶端和多變的IP直接解耦,只需對主機名停止一次受權。

2. 在沒開啟skip_name_resolve情形下,不管是經由過程# mysql -p123456 走socket銜接照樣# mysql -p123456 -h127.0.0.1走TCP銜接,顯示的用戶都是root@localhost。假如要顯示[email protected],必需開啟skip_name_resolve參數。

另,可經由過程\s檢查以後銜接應用的是socket照樣TCP。

以上這篇關於skip_name_resolve參數的總結分享就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved