MySQL远程连接失败,权限和防火墙问题
时间:2026-10-8 07:45 作者:emer 分类: 无
前言
本地能连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"。
原因: 密码错了。
解决: 确认密码,注意大小写。
总结
远程连接失败排查顺序:
- 先授权远程用户
- 再开防火墙3306
- 然后改bind-address
- 最后查云安全组
记住: 90%的情况都是没授权或者防火墙没开。
遇到问题加QQ23979811 协助处理
标签: MySQL 防火墙 远程连接 权限授权 bind-address