在MySQL中,如果访问/连接MySQL数据库时遇到“ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.xxx:xxx' (111)”这个错误,我们应该从哪些方面进行考虑和排查问题呢? 下图是我总结整理的一个思维导图,在遇到这个错误时的排查方向和排查思路。
下面来演示/介绍一个比较特殊的案例,在服务器上访问当前主机的MySQL时遇到了“ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1:7306' (111)”
$ mysql -h 127.0.0.1 -u test -p --port=7306
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1:7306' (111)
$ perror 111
OS error code 111: Connection refused
其实访问本地MySQL,根本不用检查127.0.0.1这个IP是否能ping通,不过为了以防万一,我们还是验证一下
$ ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.046 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.073 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.071 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.072 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.071 ms
^C
--- 127.0.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4099ms
rtt min/avg/max/mdev = 0.046/0.066/0.073/0.013 ms
检查MySQL实例状态
然后我们检查一下MySQL服务是否正常,MySQL实例是否Crash掉了。
方式1:
$ sudo systemctl status mysqld.service
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2023-03-13 15:01:43 CST; 1 weeks 2 days ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Main PID: 143115 (mysqld)
Status: "Server is operational"
Tasks: 47 (limit: 49256)
Memory: 1.4G
CGroup: /system.slice/mysqld.service
└─143115 /opt/mysql/mysql8.0/bin/mysqld --defaults-file=/data/conf/my.cnf
Mar 13 15:01:40 yictmysqlu01 systemd[1]: Starting MySQL Server...
Mar 13 15:01:43 yictmysqlu01 systemd[1]: Started MySQL Server.
方式2:
ps -Af | grep mysqld | grep -v grep
mysql 143115 1 1 Mar13 ? 03:47:43 /opt/mysql/mysql8.0/bin/mysqld --defaults-file=/data/conf/my.cnf
如上所示,MySQL实例正常的,所以可以排除MySQL实例关闭或MySQL实例Crash的情况。
检查MySQL的监听端口
使用下面命令检查MySQL的监听端口
$ netstat -lnp | grep mysql
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 192.168.9.203:7306 0.0.0.0:* LISTEN 143115/mysqld
tcp6 0 0 :::33060 :::* LISTEN 143115/mysqld
unix 2 [ ACC ] STREAM LISTENING 3188552 143115/mysqld /tmp/mysqlx.sock
unix 2 [ ACC ] STREAM LISTENING 3191315 143115/mysqld /tmp/mysql.sock
如上所示,监听端口为7306,访问MySQL时指定的端口号也是7306,没有什么毛病。因此也可以排查这个因素。
检查参数bind-address
检查MySQL的配置文件中的bind-address参数
方式1:
$ grep bind_address my.cnf
bind_address=192.168.9.203
方式2:
mysql> SELECT VARIABLE_NAME, VARIABLE_VALUE
-> FROM performance_schema.global_variables
-> WHERE VARIABLE_NAME = 'bind_address';
+---------------+----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+---------------+----------------+
| bind_address | 192.168.9.203 |
+---------------+----------------+
1 row in set (0.01 sec)
mysql>
bind-address的设置有以下三种情况:
bind-address=127.0.0.1 #只允许本机访问。
bind-address=某个网卡的ip #例如bind-address=192.168.9.203,只能通过ip为192.168.9.203的网卡访问。
bind-address=0.0.0.0 #此规则是系统默认配置,监听所有网卡,即允许所有ip访问。
这里由于设定参数bind_address=192.168.9.203,所以当我们使用127.0.0.1访问数据库就会被拒绝,从而抛出上面的错误。
那么这里有一个问题,如果数据库里面创建了两个账号test@'127.0.0.1'和test@'localhost',那么test@'localhost'是否也会遇到这个错误呢?你的答案是会还是不会呢? 正确答案是不会,因为localhost和127.0.0.1两者是有所区别的(下面部分内容来自参考资料[1]):
一、原理不同:
localhost的原理是不经网卡传输,不会受到网卡协议的限制。设置程序时本地服务用localhost,localhost不会解析成IP,也不会占用网卡、网络资源。 127.0.0.1的原理是经过网卡传输的,依赖网卡协议,并受到网卡相关协议的限制。使用IP访问的时候,等于本机是通过网络再去访问本机,会涉及到网络用户的权限。
二、概念不同
localhost:也可以叫是local,正确的解释是:本地服务器的意思。它可以被配置为任意的IP地址可以通过hosts这个文件进行更改,不过通常情况下都指向:127.0.0.1 127.0.0.1:在windows系统的正确解释是:本机地址的意思。127.0.0.1是保留地址之一,用来检验本机TCP/IP协议栈,可以Ping回送地址。如果回送地址Ping不通,就说明IP堆栈出了故障。如果通的话,表明网络出了问题。
三、指向不同
localhost是一个保留域名(RFC 2606) ,为了避免同狭义定义主机名混淆而单独列出。它不仅指向 127.0.0.1 这个IP地址,它同时还可以指向ipv6 的地址 。 127.0.0.1 是回送地址,指本地机,测试使用。回送地址(127.x.x.x)是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回,不进行任何网络传输。
具体原因如下:
mysql -h 127.0.0.1 访问MySQL的时候,使用 TCP/IP 连接
mysql -h localhost 访问MySQL的时候,它不会使用 TCP/IP 连接的,而使用Unix socket;此时,MySQL Server则认为该 client 是来自 “localhost”
参考资料
参考资料: https://www.termilk.com/181.html
- MySQL 错误 connect server ERRORmysql错误connect server error server-side processing connected allowed connect server mysql localhost connect server mysql connect remote server mysql workbench错误mysql error 错误server mysql gone error operationalerror connection unknown connection redis error read error successfully established connection