1. 程式人生 > >MySQL遠端連線ERROR 2003 (HY000):Can't connect to MySQL server on'XXXXX'(111) 的問題

MySQL遠端連線ERROR 2003 (HY000):Can't connect to MySQL server on'XXXXX'(111) 的問題

裝了個navicat ,然後去連線mysql伺服器,一直連不上,一開始以為是防火牆問題,後來防火牆都關閉,
 iptable服務關閉,還是不行,網上查了下:主要是因為設定了bind_address=127.0.0.1

原文引用:

問題描述:

從一臺linux遠端連線另一臺linux上的MySQL, 出現ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.85'(111)錯誤。 [mysql@vvmvcs0 ~]$ mysql -hxxx.xxx.xxx.85 -uroot -p Enter password: www.2cto.com ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.85' (111) [mysql@vvmvcs0 ~]$ perror 111 OS error code 111: Connection refused 檢視errorCode [mysql@vvmvcs0 ~]$ perror 111 OS error code 111: Connection refused
問題分析: 1,可能網路連線問,遠端ping xxx.xxx.xxx.85 ,能ping通,排除此情況 [mysql@vvmvcs0 ~]$ ping xxx.xxx.xxx.85 PING xxx.xxx.xxx.85 (xxx.xxx.xxx.85) 56(84) bytes of data. 64 bytes from xxx.xxx.xxx.85: icmp_seq=1 ttl=63 time=0.230 ms 2,排查可能由於85上my.cnf裡配置了skip_networking或者bind_address,只允許本地socket連線 2.1 在[mysqld]下設定skip_networking, 知識說明: 這使用MySQL只能通過本機Socket連線(socket連線也是本地連線的預設方式),放棄對TCP/IP的監聽 www.2cto.com 當然也不讓本地java程式連線MySQL(Connector/J只能通過TCP/IP來連線)。 2.2 可能使用了bind_address=127.0.0.1(當然也可以是其他ip) [mysqld] bind_address=127.0.0.1 知識說明:這種情況可以TCP/IP連線 通過查看了my.cnf檔案,以上兩個都是沒設定的,排除掉這兩種情況
3,排查DNS解析問題,檢查是否設定了: skip_name_resolve。 這個情況肯定不可能,因為我用的是ip,不是主機名。 [mysqld] skip_name_resolve 知識說明:這個引數加上後,不支援主機名的連線方式。
4, 排查使用者和密碼問題, 其實使用者和密碼的錯誤,不會出現111的,所以排除使用者密碼問題 ERROR 1045 (28000): Access denied for user 'root'@'XXXX' (using password: YES)
5,排查--port問題,有可能85的MySQL port不是預設3306, 這樣我遠端連線時,沒有指定--port,用的是3306, 而85上沒有對3306進行監聽。 ps -ef | grep mysqld 果然是: 85上的MySQL使用的是3308 port. 最終連線方式:加上--port=3308 [mysql@vvmvcs0 ~]$ mysql -hxxx.xxx.xxx.85 -uroot -p --port=3308 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g.
為什麼出現這麼低階的錯誤呢? 因為我一直在用85上的MySQL, 而且每次都是直接用mysql -uroot就連線上了,沒有指定--port,這樣我就一直以為這MySQL的port一直是預設的3306的。
其實根本原因是:
1. MySQL本地連線,如果不指mysql --protocol=tcp, 連線預設是socket方式連線的。這點大家都知道。 www.2cto.com 2, MySQL socket連線是根據sokect檔案來的,與--port不相關的,如果是一機多例項,則用-S(或者--socket=name )來指定連線哪個例項。 就是這個socket連線對--port無識別效果,導致排查這個問題這麼久。 見下面: 其實85上只有一個port為3308的MySQL例項,但是用3306仍然是連線上此例項,說明socket連線方式忽略--port引數。 -bash-3.2$ mysql -uroot --port=3308 Welcome to the MySQL monitor. Commands end with ; or \g. mysql -uroot --port=3306 Welcome to the MySQL monitor. Commands end with ; or \g. 再次說明基礎細節很重要啊。