問題描述:
當我使用mysql時,因為不能連接內網其中的一台服務器,所以使用了nginx做了一個反向代理。在代理的過程中,出現了以下錯誤:
注:本方法並沒有解決問題,由於每天需要重啟一次,所以以后就沒有再試了,使用了shell腳本每天重啟一次(如有更好方法,歡迎留言)

原因分析:
mysql開啟了DNS的反向解析功能,這樣mysql對連接的客戶端會進行DNS主機名查找。
mysql處理客戶端解析過程:
- 當mysql的client連過來的時候,服務器會主動去查client的域名。
- 首先查找 /etc/hosts 文件,搜索域名和IP的對應關系。
- 如果hosts文件沒有,則查找DNS設置,進行DNS反向解析,直到timeout連接失敗。
mysql的DNS反向解析:
- mysql接收到連接請求后,獲得的是客戶端的ip,為了更好的匹配mysql.user里的權限記錄(某些是用hostname定義的)。
- 如果mysql服務器設置了dns服務器,並且客戶端ip在dns上並沒有相應的hostname,那么這個過程很慢,導致連接等待。
解決方案:
- 把client的ip寫在mysql服務器的/etc/hosts文件里,隨便給個名字做主機映射即可。
- 在my.cnf配置文件中的[mysqld]區域添加skip-name-resolve,即跳過mysql連接的DNS反向解析功能,這樣能很好地提高mysql性能。在這種情況下,就只能使用MySQL授權表中的IP來連接mysql服務了。對於第一種方法顯然比較笨,也不實用!強烈推薦第二種方法,添加skip-name-resolve選項可以禁用dns解析,這樣的話,就不能在mysql的授權表中使用主機名了,只能使用IP。
參考文檔:
https://www.cnblogs.com/kevingrace/p/6196885.html#commentform
