中午剛想趴一會,不料鍋從天降!!!Mysql連不上了。。。。。。。
現象如下:
? ? 現象1:登錄mysql所在服務器,連接MySQL 成功;
? ? 現象2:通過客戶端遠程連接MySQL,返回失敗,如下:
Enter password: ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx' (111)
? ?現象三:通過某些客戶端可以連,就是響應極慢。
? ?現象四:通過客戶端可以ping通,但是telnet 數據庫端口失敗。且無論ping還是telnet,數據庫服務器均收不到數據包。
客戶端: tcpdump -nn -i eth0 icmp 和 執行ping 服務端ip的操作 服務端: tcpdump -i br0 -nn icmp and host 客戶端ip
? ?現象五:show processlist 有好多unauthenticated user的用戶(參考參考連接所述)
mysql> show processlist; +-----+----------------------+---------------------+---------------------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +-----+----------------------+---------------------+---------------------+---------+------+-------+------------------+ | 2 | root | 192.168.1.60:43961 | xxx | Sleep | 39 | | NULL | | 7 | root | 192.168.1.34:41155 | xxx | Sleep | 7 | | NULL | | 30 | root | 192.168.20.7:38282 | xxx | Sleep | 6 | | NULL | | 44 | root | 192.168.20.7:38308 | xxx | Sleep | 6 | | NULL | | 106 | root | 10.88.9.23:61181 | NULL | Sleep | 19 | | NULL | | 110 | unauthenticated user | 10.88.128.22:38648 | NULL | Connect | NULL | login | NULL | | 111 | unauthenticated user | 10.88.10.185:57430 | NULL | Connect | NULL | login | NULL | | 112 | unauthenticated user | 10.88.11.196:56473 | NULL | Connect | NULL | login | NULL | | 113 | unauthenticated user | 10.88.128.22:38650 | NULL | Connect | NULL | login | NULL | | 114 | unauthenticated user | 10.88.10.185:57439 | NULL | Connect | NULL | login | NULL | | 115 | unauthenticated user | 10.88.128.117:58555 | NULL | Connect | NULL | login | NULL | | 116 | unauthenticated user | 10.88.128.22:38653 | NULL | Connect | NULL | login | NULL | | 117 | unauthenticated user | 10.88.10.185:57444 | NULL | Connect | NULL | login | NULL | | 118 | unauthenticated user | 10.88.128.22:38655 | NULL | Connect | NULL | login | NULL | | 119 | unauthenticated user | 10.88.128.22:38657 | NULL | Connect | NULL | login | NULL | | 120 | unauthenticated user | 10.88.10.185:57453 | NULL | Connect | NULL | login | NULL | | 122 | unauthenticated user | 10.88.128.22:38659 | NULL | Connect | NULL | login | NULL | | 123 | unauthenticated user | 10.88.128.22:38661 | NULL | Connect | NULL | login | NULL | | 124 | unauthenticated user | 10.88.10.185:57458 | NULL | Connect | NULL | login | NULL | | 125 | unauthenticated user | 192.168.20.45:47091 | NULL | Connect | NULL | login | NULL | | 126 | unauthenticated user | 192.168.20.45:47092 | NULL | Connect | NULL | login | NULL | | 127 | unauthenticated user | 192.168.20.45:47093 | NULL | Connect | NULL | login | NULL | | 128 | root | localhost | NULL | Query | 0 | NULL | show processlist | | 129 | unauthenticated user | 10.88.128.22:38664 | NULL | Connect | NULL | login | NULL | +-----+----------------------+---------------------+---------------------+---------+------+-------+------------------+ 24 rows in set (0.01 sec)
?
問題解決辦法:
? ? 第一步:修改mysql的my.conf配置文件,在[mysqld]模塊下增加,停止mysql的域名反向解析。之后重啟數據庫,此項解決大多數問題
skip-name-resolve
? ? 第二步: 重啟客戶端的網卡,再次連接mysql,搞定剩下的一小部分問題。
#service network restart Shutting down interface eth0: [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface eth0: Determining if ip address 10.88.128.66 is already in use for device eth0...[ OK ]
?
結論
? ? 1. ?針對MySQL的對連接的客戶端進行DNS反向解析的處理,暫不曉得本質原因。網上暫沒有搜到本質信息。參考【參考連接】
? ? 2. 網卡的問題,網管懷疑客戶端的網卡自娛自樂了。。。。ping的時候壓根沒有走到目的地就返回了
?
【參考連接】:https://segmentfault.com/a/1190000002682272
今天早上開發那邊發現mysql連接很慢,登陸到服務器上查看服務器日志都是正常的,無可疑記錄,剛剛還好好的,怎么突然出現這個問題,于是登陸到mysql服務器上,查看下進程,發現有很多這樣的連接: 218 | unauthenticated user | 192.168.10.6:44500 | NULL | Connect | NULL | login | NULL 219 | unauthenticated user | 192.168.10.6:44501 | NULL | Connect | NULL | login | NULL ........ 放狗,放狗。。。 原因是由于mysql對連接的客戶端進行DNS反向解析。 有2種解決辦法: 1,把client的ip寫在mysql服務器的/etc/hosts文件里,隨便給個名字就可以了。 2,在 my.cnf 中加入 –skip-name-resolve 。 對于第一種方法比較笨,也不實用,那么 skip-name-resolve 選項可以禁用dns解析,但是,這樣不能在mysql的授權表中使用主機名了,只能使用IP。 我理解mysql是這樣來處理客戶端解析過程的, 1,當mysql的client連過來的時候,服務器會主動去查client的域名。 2,首先查找 /etc/hosts 文件,搜索域名和IP的對應關系。 3,如果hosts文件沒有,則查找DNS設置,如果沒有設置DNS服務器,會立刻返回失敗,就相當于mysql設置了skip-name-resolve參數,如果設置了DNS服務器,就進行反向解析,直到timeout。 有一點不明白,為什么連接mysql服務器內網的ip地址也要進行DNS反向解析,而這時候DNS解析返回給mysql的是什么呢? 望高手解答。
?
如有錯誤,還請各位數據庫大神不吝賜教。?
?
謝謝