mysql 主機名和IP位址解析詳解

2022-04-08 13:17:44 字數 2712 閱讀 7234

現象:

程式連線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()解析主機名。此時,在第乙個程序釋放掉主機名緩衝池的主機名之前,其它程序無法再次解析這個主機名;

在啟動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)。

主機名解析成IP位址

struct hostent h gethostbyname argv 2 hostaddr struct in addr h h addr list 0 s addr argv 2 是對應的主機名,如 srwp05mgt001 gethostbyname 返回對應於給定主機名的包含主機名字和位址資...

獲取主機名與主機IP位址

說明 structhostent define h addr h addr list 0 h name 位址的正式名稱。h aliases 空位元組 位址的預備名稱的 指標。h addrtype 位址型別 通常是 af inet。h length 位址的位元長度。h addr list 零位元組 主...

配置主機名 IP位址 主機對映

1.su 切換到root使用者 修改主機名 hostname 檢視主機名 修改方式 兩種方式 a.hostname 臨時修改 b.vi etc sysconfig network 永久修改 必須重啟才能生效 2.設定ip位址 b.右上角網路連線圖示 右鍵 edit connections 選中 sy...