mysql 8.0 中直接 update mysql.user 表修改 host 为 % 会失败,因禁用直写、破坏认证插件绑定且缓存不一致;应使用 create user 或 alter user 配合 identified with mysql_native_password,并修改 bind-address 和开放防火墙/安全组。

直接改 mysql.user 表的 host 字段为 % 在 MySQL 8.0 中大概率失败,且不推荐——它绕过权限系统校验,可能破坏账户状态或触发插件兼容问题。
为什么 UPDATE user SET host='%' WHERE user='root' 会报错
MySQL 8.0 默认禁用直接修改 mysql.user 表:执行 UPDATE 会遇到 ERROR 1396 (HY000): Operation ALTER USER failed 或提示 The MySQL server is running with the --skip-grant-tables option。这是因为:
- 底层密码哈希、认证插件(如
caching_sha2_password)与用户记录强绑定,UPDATE不会同步更新这些字段 -
FLUSH PRIVILEGES无法修复因表直写导致的内存权限缓存不一致 - 某些部署(如 Docker 官方镜像、云数据库 RDS)甚至禁止对
mysql库做 DML 操作
正确做法:用 ALTER USER 创建或重命名 '@%' 账户
必须通过 SQL 权限语句操作,让 MySQL 自动处理加密逻辑和插件兼容性:
- 如果
'root'@'%'还不存在:CREATE USER 'root'@'%' IDENTIFIED BY 'your_strong_password'; - 如果只存在
'root'@'localhost',想复用原密码并开放远程:ALTER USER 'root'@'localhost' RENAME TO 'root'@'%'; - 授权后必须加:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; - 最后强制刷新:
FLUSH PRIVILEGES;(不可省略)
连上还报 authentication plugin 错误?改默认认证方式
客户端(如 Navicat、旧版 JDBC 驱动)不支持 MySQL 8.0 默认的 caching_sha2_password 插件,会卡在连接阶段。解决方法不是降级服务端,而是指定用户使用兼容插件:
- 创建用户时就指定:
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 或对已有
'root'@'%'用户修改:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 改完仍需
FLUSH PRIVILEGES;
别忘了 bind-address 和防火墙这两道关
即使权限全开,MySQL 仍可能拒绝远程连接,因为:
-
bind-address默认是127.0.0.1,只监听本地;需改为0.0.0.0或注释掉该行,再重启 MySQL(systemctl restart mysqld) - Linux 防火墙(
firewalld或ufw)默认封禁3306端口:firewall-cmd --permanent --add-port=3306/tcp+firewall-cmd --reload - 云服务器(如阿里云、腾讯云)还需在安全组中放行
3306端口,这个常被忽略
真正卡住人的从来不是 SQL 语句写得对不对,而是 bind-address 没改、防火墙没开、安全组没配——三者缺一,'root'@'%' 就只是个摆设。











