IP address could not be resolved: Name or service not known

 

 

[root@test ~]# /usr/local/mysql/bin/mysqld
2018-08-05T07:00:33.647509Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2018-08-05T07:00:33.647654Z 0 [System] [MY-010116] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.12) starting as process 12515
2018-08-05T07:00:34.591235Z 0 [System] [MY-010229] [Server] Starting crash recovery...
2018-08-05T07:00:34.591283Z 0 [System] [MY-010232] [Server] Crash recovery finished.
2018-08-05T07:00:34.664056Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2018-08-05T07:00:34.695818Z 0 [System] [MY-010931] [Server] /usr/local/mysql/bin/mysqld: ready for connections. Version: '8.0.12' socket: '/tmp/mysql.sock' port: 3306 MySQL Community Server - GPL.
2018-08-05T07:06:56.802280Z 8 [Warning] [MY-010055] [Server] IP address '211.161.60.12' could not be resolved: Name or service not knownmysql

 

 

 

mysql could not be resolved: Name or service not known_Mysql_腳本之家 https://www.jb51.net/article/70893.htmsql

問題: mysql DNS反解:skip-name-resolve

錯誤日誌有相似警告:數據庫


1.120119 16:26:04 [Warning] IP address '192.168.1.10' could not be resolved: Name or service not known
2.120119 16:26:04 [Warning] IP address '192.168.1.14' could not be resolved: Name or service not known
3.120119 16:26:04 [Warning] IP address '192.168.1.17' could not be resolved: Name or service not known安全

經過show processlist發現大量相似以下的鏈接:服務器

1.|592|unauthenticated user|192.168.1.10:35320|NULL|Connect| |login|NULL|
2.|593|unauthenticated user|192.168.1.14:35321|NULL|Connect| |login|NULL|
3.|594|unauthenticated user|192.168.1.17:35322|NULL|Connect| |login|NULL|socket

skip-name-resolve 參數的做用:再也不進行反解析(ip不反解成域名),這樣能夠加快數據庫的反應時間。ide

修改配置文件添加並須要重啓:優化

 

複製代碼代碼以下:

[mysqld] 
skip-name-resolve

 

其實就是在[mysqld]下面一行加入skip-name-resolve重啓mysql服務就能夠了。ui

下面是更加詳細的解釋:this

現象:

程序鏈接mysql時,mysql的error.log裏面提示:

[Warning] IP address '10.0.0.220' could not be resolved: Name or service not known

緣由:

Mysql數據庫服務器沒有配置 /etc/hosts,也沒有DNS服務,致使mysqld線程解析IP對應的主機名時,解析失敗。

參考資料:

Mysql域名解析:

當一個新的客戶端嘗試跟mysqld建立鏈接時,mysqld產生一個新線程來處理這個請求。新線程會先檢查請求創建鏈接的主機名是否在Mysql的主機名緩衝中,若是不在,線程會嘗試去解析請求鏈接的主機名。

解析的邏輯以下:

a. Mysql線程經過gethostbyaddr()把獲取的IP地址解析成主機名,而後經過gethostbyname()把獲取的主機名解析成IP地址,保障主機名和IP地址對應關係的準確;

b. 若是操做系統支持使用安全進程的gethostbyaddr_r()和gethostbyname_r() 調用,Mysqld線程能夠用它倆來優化主機名解析;

c. 若是操做系統不支持安全線程調用,Mysqld進程先作一個互斥鎖,而後調用gethostbyaddr()和gethostbyname()解析主機名。此時,在第一個進程釋放掉主機名緩衝池的主機名以前,其它進程沒法再次解析這個主機名; <-------MySQL手冊裏面在此處說的host name ,意思應該是指同一個IP地址和對應的第一個主機名關係。

在啓動mysqld進程是,可使用 --skip-name-resolve 參數禁用DNS的主機名解析功能,禁用該功能後,在MySQL受權表裏面,你只能使用IP地址。

若是你所處環境的DNS很是慢 或者 有不少主機, 你能夠經過禁用DNS解析功能--skip-name-resolve 或者 提升 HOST_CACHE_SIZE大小 來提高數據庫的響應效率。

禁用主機名緩衝的發方法: 使用--skip-host-cache 參數; 刷新主機名緩衝區: 執行 flush hosts 或者執行mysqladmin flush-hosts;

禁用TCP/IP鏈接: 使用--skip-networking參數。

實驗:
# grep 192.168.1.1 /etc/hosts 
192.168.1.1 hostname_online

sql> grant usage on *.* to root@'h_tt_%' identified by 'root';

sql> flush hosts;

# mysql -h 192.168.1.1 -uroot -proot

ERROR 1045 (28000): Access denied for user 'root'@'hostname_online' (using password: YES) ### IP解析爲hostname_online,不是h_tt_%,訪問被拒。

# grep 192.168.1.1 /etc/hosts

192.168.1.1 hostname_online

192.168.1.1 h_tt_1

# mysql -h 192.168.1.1 -uroot -proot

ERROR 1045 (28000): Access denied for user 'root'@'hostname_online' (using password: YES)#### mysqld沒有刷新主機池緩衝池中的IP和主機名信息,此時IP對應hostname_online

sql> flush hosts;

# mysql -h 192.168.1.1 -uroot -proot

ERROR 1045 (28000): Access denied for user 'root'@'hostname_online' (using password: YES) #### mysqld解析了/etc/hosts裏面同一個IP對應的第一個主機名關係時,就再也不解析後面這個IP對應的主機名關係

# grep 192.168.1.1 /etc/hosts

192.168.1.1 h_tt_1

192.168.1.1 hostname_online

sql> flush hosts;

# mysql -h 192.168.1.1 -uroot -proot

sql> exit

【實驗:】驗證解析相同IP對應的第一個主機名關係後,就再也不解析相同IP:

Sql>grant usage on *.* to root@'h_tt_%' identified by ‘root';

Sql>flush hosts;

# grep h_tt /etc/hosts # grep h_tt /etc/hosts

192.168.1.1hostname_online 192.168.1.1h_tt_1

192.168.1.1h_tt_1 192,168.1.2h_tt_1

訪問mysql被拒絕; 從兩個IP均可以訪問mysql.

【結論】

此實驗驗證了,上述mysql手冊中對"How MySQL Uses DNS"的解釋。

即mysqld線程解析/etc/hosts是,是以IP做爲惟一標識的,及時一個IP對應了多個主機名,可是mysqld線程只解析第一條對應關係,不論後面有幾條這個IP對應的不一樣主機名的記錄,Mysqld進程都不會去解析,都是無效的。

【適用環境:】

沒有DNS服務器,主機很是很是多,或者 不想維護/etc/hosts裏面手動配置的IP和主機名對應列表時,能夠在mysql受權時執行主機名爲"%" 或者禁用IP和主機名解析功能(--skip-name-resolve)。

相關文章
相關標籤/搜索