错误1130本质是MySQL服务端拒绝连接,因mysql.user表中无匹配的'user'@'client_host'记录;需用GRANT授权指定host(如'%'或具体IP),并确保bind-address=0.0.0.0、防火墙及云安全组放行3306端口。

不是Navicat的问题,是MySQL服务端压根没给你开权限——它连握手阶段就直接拒了你的连接请求。
MySQL user表里没匹配到你的 client host
错误信息里的 host '192.168.1.100' 或 host 'win-1b3uv78sfn3' 就是MySQL服务器识别出的你这台机器的来源标识。它去 mysql.user 表里找 'your_user'@'192.168.1.100' 或 'your_user'@'win-1b3uv78sfn3' 这条记录,找不到,就报 1130 错误。
常见误区:
-
select host from user where user='root'返回localhost,说明只允许本机 Unix socket 连接,127.0.0.1(TCP)都不行,更别说远程 IP -
%不匹配localhost,二者权限记录完全独立 - 更新
host字段用update user set host='%' where user='root'很危险:可能只改中一条,表里还留着localhost、127.0.0.1等多条重复记录,导致权限混乱
别直接改 user 表,用 GRANT 创建明确的 user@host
直接 UPDATE mysql.user 是过时且易出错的做法。MySQL 8.0+ 更推荐用 GRANT 语句声明式授权,自动处理底层记录合并与冲突。
实操建议:
- 想让
myuser从任意 IP 连接:GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; - 只允许从固定 IP
192.168.1.6连接:GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.6' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; - 只开放某个库:
GRANT SELECT,INSERT ON mydb.* TO 'myuser'@'192.168.1.6'; - 执行完必须跟:
FLUSH PRIVILEGES;,否则不生效
bind-address 和防火墙常被忽略
即使权限给了,MySQL 服务本身也可能根本没监听外部网络接口。
检查并确认:
- 配置文件(
/etc/mysql/my.cnf或/etc/my.cnf)中[mysqld]段落有:bind-address = 0.0.0.0(或注释掉bind-address = 127.0.0.1) - Linux 防火墙放行 3306:
sudo ufw allow 3306或sudo firewall-cmd --permanent --add-port=3306/tcp - 云服务器(阿里云/腾讯云)安全组规则必须显式添加入站规则:端口
3306,源 IP 可设为0.0.0.0/0(测试用)或具体客户端 IP
错误日志才是真实线索
别只盯着 Navicat 的红色弹窗。登录服务器看 MySQL 错误日志(通常是 /var/log/mysql/error.log 或 /var/log/mysqld.log),搜索 Access denied for user,后面紧跟着的 using password: yes 但没提密码错,基本就能锁定是 host 匹配失败。
复杂点在于:host 字段匹配顺序是精确 IP > 网段通配符(如 192.168.1.%)> 主机名 > %,而且 DNS 解析结果不稳定时,host 值可能是主机名也可能是 IP,得靠日志反推真实值再授权。


















