MySQL远程连接失败,权限和防火墙问题

前言

本地能连MySQL,远程连接就报错。常见原因:用户没授权、防火墙没开、MySQL只监听本地。

报错长什么样

ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.xxx'

或者:

ERROR 1130 (HY000): Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server

原因一:用户没授权远程登录

排查

SELECT user, host FROM mysql.user;

看root用户的host是 localhost 还是 %。

如果是 localhost,就只能本地登录。

解决

授权远程登录:

-- 方法1:授权root所有IP
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的密码';

-- 方法2:只允许某个IP
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.100' IDENTIFIED BY '你的密码';

-- 刷新
FLUSH PRIVILEGES;

原因二:防火墙没开3306端口

排查

在本地服务器上测试:

netstat -tlnp | grep 3306

看MySQL监听的是 127.0.0.1:3306 还是 0.0.0.0:3306。

如果是 127.0.0.1:3306,说明只监听本地。

解决防火墙

CentOS7 firewalld

# 开3306端口
firewall-cmd --permanent --add-port=3306/tcp

# 重载
firewall-cmd --reload

Ubuntu ufw

ufw allow 3306/tcp

原因三:MySQL只监听本地

排查

netstat -tlnp | grep 3306

如果显示 127.0.0.1:3306,就是只监听本地。

解决

改my.cnf:

[mysqld]
bind-address = 0.0.0.0

注释掉 skip-networking(如果有的话)。

重启MySQL:

systemctl restart mysqld

原因四:云服务器安全组

阿里云、腾讯云等云服务器,除了系统防火墙,还有安全组。

解决

在云服务器控制台,找到安全组,放行3306端口。

原因五:MySQL版本问题

MySQL 8.0默认用 caching_sha2_password,老客户端不支持。

解决

创建用户时指定老的加密方式:

CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;

排查步骤

第一步:本地能连吗

先在服务器上本地连一下:

mysql -u root -p

本地能连,说明MySQL本身没问题。

第二步:看MySQL监听地址

netstat -tlnp | grep 3306

第三步:防火墙开了吗

firewall-cmd --list-ports

看3306在不在。

第四步:远程telnet测试

在本地电脑上测试:

telnet 服务器IP 3306

如果连不上,就是网络/防火墙问题。

常见坑

坑1:改了授权忘了刷新

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

改完就退出,结果还是连不上。

解决: 执行 FLUSH PRIVILEGES;

坑2:bind-address没改

授权了,防火墙也开了,还是连不上。

原因: MySQL只监听本地。

解决: 改 bind-address = 0.0.0.0

坑3:安全组没开

系统防火墙开了,云服务器安全组没开。

解决: 去云控制台放行3306端口。

坑4:密码不对

报错不是"连接不上",而是"Access denied"。

原因: 密码错了。

解决: 确认密码,注意大小写。

总结

远程连接失败排查顺序:

  1. 先授权远程用户
  2. 再开防火墙3306
  3. 然后改bind-address
  4. 最后查云安全组

记住: 90%的情况都是没授权或者防火墙没开。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 07:45