#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)