程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL遠程連接ERROR 2003 (HY000):Cant connect to MySQL server on

MySQL遠程連接ERROR 2003 (HY000):Cant connect to MySQL server on

編輯:MySQL綜合教程


問題描述:
  從一台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. 再次說明基礎細節很重要啊。       作者 RogerZhuo

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved