「MySQL」- Can’t connect to

  CREATED BY JENKINSBOT

#1 ERROR 2003 (HY000): Can’t connect to MySQL server on XXXXXX

遇到这个问题无非就是MySQL不让你连接,可能的原因如下:

# 排查:服务是否可访问

无法访问MySQL服务监听的端口号。可以在本机telnet命令进性测试,telnet <ipaddress> 3306。如果telnet命令无法链接,则表示无法访问mysql服务,可能有防火墙进性了端口过滤,也有可能是MySQL服务没有启动。

# 排查:MySQL服务的配置中是否限制了访问

如果不是上述原因,则可能是MySQL监听的地址有问题。可以在运行MySQL的服务器上netstat命令进性测试,netstat -npl | grep 3306,如果输出中为127.0.0.1:3306,则表示MySQL只监听本地的连接,那就需要修改配置,比如修改配置文件中[mysqld]部分的bind-address的为0.0.0.0(或者服务器上指定接口的IP地址)来监听所有(或指定)地址。修改后执行netstat -npl | grep 3306会发现监听连接为0.0.0.0:3306。

# 排查:MySQL服务的账户配置是否限制了访问

如果不是上述原因,就需要检查MySQL的账户配置是否允许远程登陆。执行select * from mysql.user来检查user列和host列是否可以进行远程访问。如果select的结果中user=root,host=localhost,则只能进行本地登陆root账号。如果select的结果中user=root,host=%,则所有外部主机都可以登陆root账号。总的说就是:host的谁的IP地址就允许哪个IP地址访问MySQL,如果是%,则所有人都能连接。所以这个问题的解决办法就是添加允许登陆的账户,或者修改账户的host。

# localhost & 127.0.0.1

在MySQL中,连接数据库时使用localhost与使用127.0.0.1是不同的。

连接MySQL由两种方式:(1)域套接字文件;(2)网络地址和端口。

「域套接字文件」会更快一些,但是只能在本机上使用。

连接MySQL时,如果「未指定主机名」,或者「主机名为localhost」时,会通过「域套接字」连接MySQL服务器。

在Windows下,如果启动server的时候使用了–enable-named-pipe选项,则可以在同一台主机上使用命名管道。默认的命名管道名为MySQL。如果未指定主机名,则会先尝试命名管道,如果无效,则会在使用TCP/IP连接。可以使用.作为主机名,来强制使用命名管道。

参考文献

Mysql localhost != 127.0.0.1?
B.4.2.2 Can’t connect to [local] MySQL server
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.168.1.165’ (113)