不能直接update user表,因绕过权限校验且易致认证失败;应使用grant创建新用户(如'navi_user'@'%'),并配bind-address=0.0.0.0及开放3306端口。
直接改 mysql.user 表的 host 字段是最容易出问题的做法——它绕过权限系统校验,且在 mysql 8.0+ 中可能因账户认证插件差异导致登录失败。正确做法是用 grant 语句授权。
为什么不能直接 UPDATE user 表?
MySQL 的权限验证不仅看 Host 字段,还依赖账户的认证方式(如 caching_sha2_password)、密码哈希格式、以及是否启用 skip-name-resolve。直接执行 UPDATE user SET Host='%' WHERE User='root' 可能造成:
-
FLUSH PRIVILEGES后仍无法远程登录,因为账户实际未被重新初始化 - MySQL 8.0 默认 root 使用
caching_sha2_password,而旧版客户端(如某些 Navicat 版本)不兼容该插件 - 若原用户是通过
CREATE USER 'root'@'localhost'创建的,@'localhost'和@'%'是两个完全独立的账户,改表不会自动复制密码或权限
应该用 GRANT 创建新 host 权限账户
推荐明确创建一个专用于远程连接的用户,而不是强行修改 root。例如:
GRANT ALL PRIVILEGES ON *.* TO 'navi_user'@'%' IDENTIFIED BY 'StrongPass123!' WITH GRANT OPTION;
注意几点:
-
'navi_user'@'%'是全新账户,与本地root@localhost完全隔离,更安全 - 如果只允许某台开发机访问,把
%换成具体 IP,如'navi_user'@'192.168.1.105' - MySQL 8.0+ 中,
IDENTIFIED BY会自动处理密码加密和认证插件适配,比手动改表可靠得多 - 执行后必须运行
FLUSH PRIVILEGES;,否则不生效
别忘了检查 bind-address 和防火墙
即使权限设对了,Navicat 还是连不上,大概率卡在这两处:
- 查 MySQL 配置文件(
/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf),确认[mysqld]下有:bind-address = 0.0.0.0(不是127.0.0.1) - 云服务器(如阿里云、腾讯云)必须在**安全组**里放行
3306端口——这比本地iptables或ufw更优先,很多人漏掉这点 - 本地网络若走公司代理或企业防火墙,也可能拦截 3306,可临时用
telnet your-server-ip 3306测试端口连通性
真正麻烦的不是命令怎么写,而是你得同时确认三件事:MySQL 账户允许这个 IP 登录、MySQL 进程监听了这个 IP、中间网络设备放行了这个端口。少一个,1130 就照常报。











