错误1130第一层原因是mysql.user表中无匹配'your_user'@'192.168.1.50'或通配记录;需用CREATE USER/ALTER USER添加带host和认证插件的用户,禁用UPDATE user改host,并确认bind-address、防火墙及安全组放行。

确认 user@host 记录是否匹配客户端真实来源
报错 ERROR 1130 (HY000): Host '192.168.1.50' is not allowed to connect 的第一层原因永远是:MySQL 在 mysql.user 表里找不到一条 'your_user'@'192.168.1.50' 或能覆盖该 IP 的记录(比如 'your_user'@'192.168.1.%' 或 'your_user'@'%')。
不要只查 SELECT user, host FROM mysql.user WHERE user = 'root',而要查完整匹配项:
SELECT user, host FROM mysql.user WHERE user = 'root' AND host IN ('%', '192.168.1.50', '192.168.1.%');
如果结果为空,说明当前没有这条授权,直接改表或 GRANT 都没用——得先创建。
- MySQL 8.0+ 禁止直接
UPDATE mysql.user修改 host 字段,会触发ERROR 1396或认证插件冲突 -
host = 'localhost'的账号永远无法远程连接,哪怕你加了-h 127.0.0.1也不行(MySQL 内部会优先走 socket) - 通配符
%不匹配localhost,这是设计行为,不是 bug
用 ALTER USER 或 CREATE USER 正确添加远程访问权限
MySQL 8.0 默认使用 caching_sha2_password 插件,老客户端(如某些 Navicat 旧版、Python 3.7 以下的 PyMySQL)可能不兼容。所以新建或修改用户时必须显式指定认证方式,并绑定 host:
CREATE USER 'myuser'@'192.168.1.50' IDENTIFIED WITH mysql_native_password BY 'StrongPass123!';
或者复用已有用户(如 root),但注意不能只改 host:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourRootPass';
再新增一条远程专用记录:
CREATE USER 'root'@'192.168.1.50' IDENTIFIED WITH mysql_native_password BY 'YourRootPass';
然后授权:
GRANT ALL ON *.* TO 'root'@'192.168.1.50' WITH GRANT OPTION;
- 不要执行
UPDATE user SET host = '%'—— 这在 MySQL 8.0 中大概率失败,且会破坏原有'root'@'localhost'权限逻辑 - 每条
CREATE USER或ALTER USER后无需手动FLUSH PRIVILEGES,它已自动生效 - 若需允许整个子网,用
'root'@'192.168.1.%',别用'%'开放所有 IP(生产环境高危)
检查 bind-address 和 skip_networking 配置
即使权限全开,MySQL 若只监听 127.0.0.1,外部请求根本进不来。验证方式:
sudo ss -tlnp | grep :3306
如果输出是 127.0.0.1:3306,说明服务没对外暴露。编辑配置文件(Ubuntu/Debian 通常为 /etc/mysql/mysql.conf.d/mysqld.cnf,CentOS 为 /etc/my.cnf):
[mysqld] bind-address = 0.0.0.0 # 或更安全的内网地址:bind-address = 192.168.1.100 skip_networking = OFF
- 删掉或注释掉
skip-networking行,否则 TCP 连接被彻底禁用 -
bind-address = 0.0.0.0表示监听所有 IPv4 接口;IPv6 需额外配bind-address = :: - 改完必须重启:
sudo systemctl restart mysql,不是 reload
防火墙与云安全组常被忽略的两道关卡
telnet 或 nc 能通 3306 才代表网络层通畅。如果 nc -zv your_ip 3306 超时或拒绝,问题不在 MySQL 配置本身:
- 本地系统防火墙:Ubuntu 用
sudo ufw allow 3306/tcp;CentOS 用sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload - 云服务器(阿里云、腾讯云等)必须在控制台「安全组」中添加入方向规则:协议 TCP,端口 3306,源地址建议填具体 IP 段(如
192.168.1.0/24),而非0.0.0.0/0 - 某些企业网络出口做了 SNAT,远程客户端实际 IP 是 NAT 后的地址,需按那个 IP 配 host
真正容易被跳过的是 DNS 反查:MySQL 默认开启 skip_name_resolve = OFF,会尝试反向解析客户端 IP 对应的 hostname。如果 DNS 不稳定或客户端 IP 没 PTR 记录,可能延迟甚至失败。生产环境建议在 [mysqld] 下加 skip_name_resolve = ON 并重启。











