MySQL连接被拒绝的四大原因及解决:一是bind-address配置为127.0.0.1导致仅限本地连接,应改为0.0.0.0或指定IP并重启服务;二是系统防火墙(ufw/firewalld)或云平台安全组未放行3306端口;三是MySQL用户host不匹配,需创建'username'@'%'用户并授权;四是SSL强制加密引发连接失败,可临时禁用--ssl-mode=DISABLED或关闭require_secure_transport。

MySQL连接被拒绝:先看bind-address配的是不是127.0.0.1
新环境连不上 MySQL,十有八九是服务端只监听了本地回环地址。默认配置里bind-address常设为127.0.0.1,意味着只接受本机发起的连接,外部机器发来的 TCP 请求直接被拒。
实操建议:
- 查当前值:
mysql -u root -p -e "SHOW VARIABLES LIKE 'bind_address';" - 改配置文件(通常是
/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf),把bind-address = 127.0.0.1改成bind-address = 0.0.0.0(监听所有 IPv4 接口)或指定内网 IP(如192.168.1.100) - 改完必须重启服务:
sudo systemctl restart mysql(Debian/Ubuntu)或sudo systemctl restart mysqld(CentOS/RHEL) - 注意:改
0.0.0.0后务必配合防火墙和用户权限控制,否则等于裸奔
telnet不通但bind-address已放开?检查系统级防火墙
MySQL 服务本身监听了正确地址,客户端仍连不上,大概率是中间被系统防火墙拦了。Linux 默认启用ufw(Ubuntu)或firewalld(CentOS),而 MySQL 的默认端口3306通常不在放行列表里。
实操建议:
- Ubuntu 上确认
ufw状态:sudo ufw status verbose,若为active,执行sudo ufw allow 3306 - CentOS 7+ 上检查
firewalld:sudo firewall-cmd --list-ports,没看到3306/tcp就加:sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload - 别忘了云服务器——阿里云、腾讯云的安全组规则也得手动放开
3306端口,这个比系统防火墙还优先 - 验证是否通:从客户端机器执行
telnet <mysql-server-ip> 3306</mysql-server-ip>,能打出空白响应或乱码说明端口通了;如果报Connection refused,说明服务没起来或bind-address仍不对;如果超时,基本就是防火墙/安全组问题
能 telnet 通但认证失败:确认远程用户存在且 host 匹配
端口通了,但用mysql -h <ip> -u xxx -p</ip>还是提示Access denied,问题出在 MySQL 用户权限上。MySQL 的用户是user@host组合,'root'@'localhost'和'root'@'%'是两个完全不同的账号。
实操建议:
- 登录 MySQL 后查用户:
SELECT User, Host FROM mysql.user;,确认你要用的用户名对应Host字段是不是%(任意主机)、具体 IP 或子网(如192.168.1.%) - 如果只有
localhost,需要显式创建远程用户:CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass'; GRANT ALL ON *.* TO 'myuser'@'%'; FLUSH PRIVILEGES; - 注意
host字段不能写0.0.0.0或*,必须是%(表示任意字符串)或合法 IP 段 - 某些老版本 MySQL(5.7 以前)默认禁用
skip-name-resolve,会导致 DNS 反查失败进而拒绝连接,可在配置中加入skip-name-resolve并重启
SSL 连接失败或警告:明确要不要强制加密
新版本 MySQL(8.0+)默认要求 SSL 连接,客户端不带证书或未声明--ssl-mode=DISABLED时可能卡住或报错SSL connection error,尤其用 Navicat、DBeaver 等 GUI 工具时更明显。
实操建议:
- 临时绕过(仅测试用):
mysql -h <ip> -u user -p --ssl-mode=DISABLED</ip> - 生产环境建议配好 SSL,但若暂时不想折腾,可在服务端关闭强制要求:
SET GLOBAL require_secure_transport = OFF;(需有 SUPER 权限,且重启后失效;永久生效要改配置文件加require_secure_transport = OFF) - 注意:关闭 SSL 后,密码明文传输,内网短距可接受,公网绝对不行
- 如果启用了 SSL,客户端必须提供对应 CA 证书路径,否则会报
Unable to get issuer certificate之类错误
真正麻烦的不是某一个点,而是这几个环节串在一起:配置改了没重启、防火墙开了没 reload、用户建了没 flush、SSL 关了但客户端还在坚持握手……每一步都得单独验证,缺一不可。


















