mysql默认拒绝远程连接的根本原因是root@localhost用户权限仅限本地,且bind-address默认为127.0.0.1、skip-networking可能启用,导致tcp连接被拒;需同时授权用户host、修改配置并开放防火墙及云安全组。

MySQL 默认为什么拒绝远程连接
安装完 MySQL 后本地能连,但换台机器用 mysql -h 192.168.x.x -u root -p 就报 ERROR 1130 (HY000): Host 'xxx' is not allowed to connect to this MySQL server,根本原因不是防火墙,而是 MySQL 用户权限表里没给该主机授权。默认的 root@localhost 账户只允许本机通过 socket 或 127.0.0.1 连接,不匹配任意远程 IP。
如何给用户添加远程访问权限
必须用已有管理员权限账户(如 root@localhost)登录后执行 SQL 授权,不能只改配置文件。常见错误是只改了 bind-address 却忘了授用户权限。
操作步骤如下:
- 登录 MySQL:
mysql -u root -p - 切换到系统库:
USE mysql; - 查看当前用户及 host:
SELECT User, Host FROM user;(确认是否存在root@'%'或类似记录) - 若需允许任意 IP 远程以 root 登录(仅测试环境):
CREATE USER 'root'@'%' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; - 更安全的做法是限定来源 IP:
GRANT SELECT,INSERT,UPDATE ON mydb.* TO 'appuser'@'192.168.10.50' IDENTIFIED BY 'pwd123'; FLUSH PRIVILEGES;
my.cnf 中 bind-address 和 skip-networking 的影响
即使用户权限正确,MySQL 服务本身也可能拒绝 TCP 连接。关键看两个配置项:
-
bind-address:默认可能是127.0.0.1或localhost,必须改为0.0.0.0(监听所有接口)或具体内网 IP(如192.168.1.100) -
skip-networking:如果存在且值为ON或未注释,MySQL 将完全禁用 TCP/IP,只支持 socket 连接,必须删掉或注释该行 - 修改后需重启服务:
sudo systemctl restart mysqld(CentOS/RHEL)或sudo service mysql restart(Debian/Ubuntu)
防火墙和云服务器安全组常被忽略
MySQL 默认端口 3306 必须放行,但很多人只关本地防火墙,却忘了云平台(阿里云、腾讯云、AWS)的安全组规则是独立控制的。
- 检查本地防火墙:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS) - 确保 3306 端口开放:
sudo ufw allow 3306或sudo firewall-cmd --add-port=3306/tcp --permanent && sudo firewall-cmd --reload - 登录云控制台,找到对应 ECS 实例的「安全组」,手动添加入方向规则:端口范围
3306/3306,源 IP 建议限制为可信段(如192.168.1.0/24),而非全放开0.0.0.0/0
权限、配置、网络三层缺一不可;其中用户 host 设置和 bind-address 是最常漏改的两个点。










