MySQL遠程鏈接ERROR 2003 (HY000):Can't connect to MySQL server on'XXXXX'(111) 的問題

裝了個navicat ,而後去鏈接mysql服務器,一直連不上,一開始覺得是防火牆問題,後來防火牆都關閉,
 iptable服務關閉,仍是不行,網上查了下:主要是由於設置了bind_address=127.0.0.1java

 

原文引用:mysql

 

問題描述:linux

從一臺linux遠程鏈接另外一臺linux上的MySQL, 出現ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.85'(111)錯誤。sql

[mysql@vvmvcs0 ~]$ mysql -hxxx.xxx.xxx.85 -uroot -pbash

Enter password: www.2cto.com服務器

ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.85' (111)網絡

[mysql@vvmvcs0 ~]$ perror 111mvc

OS error code 111: Connection refusedsocket

查看errorCodetcp

[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.

再次說明基礎細節很重要啊。

相關文章
相關標籤/搜索