《Mysql應用mysql could not be resolved: Name or service not known》要點:
本文介紹了Mysql應用mysql could not be resolved: Name or service not known,希望對您有用。如果有疑問,可以聯(lián)系我們。
問題: mysql DNS反解:skip-name-resolve
錯誤日志有類似警告:MYSQL應用
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 knownMYSQL應用
通過show processlist發(fā)現(xiàn)大量類似如下的連接:MYSQL應用
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|MYSQL應用
skip-name-resolve 參數(shù)的作用:不再進行反解析(ip不反解成域名),這樣可以加快數(shù)據(jù)庫的反應時間.MYSQL應用
修改配置文件添加并需要重啟:MYSQL應用
其實就是在[mysqld]下面一行加入skip-name-resolve重啟mysql服務就可以了.MYSQL應用
下面是更加詳細的解釋:MYSQL應用
現(xiàn)象:MYSQL應用
程序連接mysql時,mysql的error.log里面提示:MYSQL應用
[Warning] IP address '10.0.0.220' could not be resolved: Name or service not knownMYSQL應用
原因:MYSQL應用
Mysql數(shù)據(jù)庫服務器沒有配置 /etc/hosts,也沒有DNS服務,導致mysqld線程解析IP對應的主機名時,解析失敗.MYSQL應用
參考資料:MYSQL應用
Mysql域名解析:MYSQL應用
當一個新的客戶端嘗試跟mysqld創(chuàng)建連接時,mysqld產生一個新線程來處理這個請求.新線程會先檢查請求建立連接的主機名是否在Mysql的主機名緩沖中,如果不在,線程會嘗試去解析請求連接的主機名.MYSQL應用
解析的邏輯如下:MYSQL應用
a. Mysql線程通過gethostbyaddr()把獲取的IP地址解析成主機名,然后通過gethostbyname()把獲取的主機名解析成IP地址,保障主機名和IP地址對應關系的準確;MYSQL應用
b. 如果操作系統(tǒng)支持使用安全進程的gethostbyaddr_r()和gethostbyname_r() 調用,Mysqld線程可以用它倆來優(yōu)化主機名解析;MYSQL應用
c. 如果操作系統(tǒng)不支持安全線程調用,Mysqld進程先做一個互斥鎖,然后調用gethostbyaddr()和gethostbyname()解析主機名.此時,在第一個進程釋放掉主機名緩沖池的主機名之前,其它進程無法再次解析這個主機名; <-------MySQL手冊里面在此處說的host name ,意思應該是指同一個IP地址和對應的第一個主機名關系.MYSQL應用
在啟動mysqld進程是,可以使用 --skip-name-resolve 參數(shù)禁用DNS的主機名解析功能,禁用該功能后,在MySQL授權表里面,你只能使用IP地址.MYSQL應用
如果你所處環(huán)境的DNS非常慢 或者 有很多主機, 你可以通過禁用DNS解析功能--skip-name-resolve 或者 提高 HOST_CACHE_SIZE大小 來提升數(shù)據(jù)庫的響應效率.MYSQL應用
禁用主機名緩沖的發(fā)方法: 使用--skip-host-cache 參數(shù); 刷新主機名緩沖區(qū): 執(zhí)行 flush hosts 或者執(zhí)行mysqladmin flush-hosts;MYSQL應用
禁用TCP/IP連接: 使用--skip-networking參數(shù).MYSQL應用
實驗:
# grep 192.168.1.1 /etc/hosts
192.168.1.1 hostname_onlineMYSQL應用
sql> grant usage on *.* to root@'h_tt_%' identified by 'root';MYSQL應用
sql> flush hosts;MYSQL應用
# mysql -h 192.168.1.1 -uroot -prootMYSQL應用
ERROR 1045 (28000): Access denied for user 'root'@'hostname_online' (using password: YES) ### IP解析為hostname_online,不是h_tt_%,訪問被拒.MYSQL應用
# grep 192.168.1.1 /etc/hostsMYSQL應用
192.168.1.1 hostname_onlineMYSQL應用
192.168.1.1 h_tt_1MYSQL應用
# mysql -h 192.168.1.1 -uroot -prootMYSQL應用
ERROR 1045 (28000): Access denied for user 'root'@'hostname_online' (using password: YES)#### mysqld沒有刷新主機池緩沖池中的IP和主機名信息,此時IP對應hostname_onlineMYSQL應用
sql> flush hosts;MYSQL應用
# mysql -h 192.168.1.1 -uroot -prootMYSQL應用
ERROR 1045 (28000): Access denied for user 'root'@'hostname_online' (using password: YES) #### mysqld解析了/etc/hosts里面同一個IP對應的第一個主機名關系時,就不再解析后面這個IP對應的主機名關系MYSQL應用
# grep 192.168.1.1 /etc/hostsMYSQL應用
192.168.1.1 h_tt_1MYSQL應用
192.168.1.1 hostname_onlineMYSQL應用
sql> flush hosts;MYSQL應用
# mysql -h 192.168.1.1 -uroot -prootMYSQL應用
sql> exitMYSQL應用
【實驗:】驗證解析相同IP對應的第一個主機名關系后,就不再解析相同IP:MYSQL應用
Sql>grant usage on *.* to root@'h_tt_%' identified by ‘root';MYSQL應用
Sql>flush hosts;MYSQL應用
# grep h_tt /etc/hosts # grep h_tt /etc/hostsMYSQL應用
192.168.1.1hostname_online 192.168.1.1h_tt_1MYSQL應用
192.168.1.1h_tt_1 192,168.1.2h_tt_1MYSQL應用
訪問mysql被拒絕; 從兩個IP都可以訪問mysql.MYSQL應用
【結論】MYSQL應用
此實驗驗證了,上述mysql手冊中對"How MySQL Uses DNS"的解釋.MYSQL應用
即mysqld線程解析/etc/hosts是,是以IP作為唯一標識的,及時一個IP對應了多個主機名,但是mysqld線程只解析第一條對應關系,不論后面有幾條這個IP對應的不同主機名的記錄,Mysqld進程都不會去解析,都是無效的.MYSQL應用
【適用環(huán)境:】MYSQL應用
沒有DNS服務器,主機非常非常多,或者 不想維護/etc/hosts里面手動配置的IP和主機名對應列表時,可以在mysql授權時執(zhí)行主機名為"%" 或者禁用IP和主機名解析功能(--skip-name-resolve).MYSQL應用