MySQL 8.4默认启用caching_sha2_password插件且root仅限localhost登录,导致远程连接失败;新用户需显式指定mysql_native_password插件,远程管理应新建专用账号而非开放root;角色需手动创建、授权、绑定并激活,且权限变更后必须重连生效。

MySQL 8.4 默认启用 caching_sha2_password 认证插件,且 root 用户默认只允许 'root'@'localhost' 登录——这意味着新装实例下,远程连接、普通用户创建、甚至部分旧应用直连都会失败。这不是 bug,是安全策略升级后的主动限制。
为什么新用户创建后仍无法远程登录
常见错误现象:执行了 CREATE USER 'dzm'@'%' IDENTIFIED BY '123123'; 和 GRANT ALL PRIVILEGES ON *.* TO 'dzm'@'%';,但客户端仍报错 ERROR 1045 (28000): Access denied。
- 根本原因不是权限没给,而是认证方式不匹配:MySQL 8.4 默认用
caching_sha2_password,而很多老客户端(如某些 Navicat 版本、Python 3.7 以下的mysql-connector-python)不支持该插件 -
'dzm'@'%'用户实际生效的plugin字段值是caching_sha2_password,可通过SELECT user, host, plugin FROM mysql.user WHERE user = 'dzm';验证 - 解决方法不是删用户重来,而是显式指定兼容插件:
CREATE USER 'dzm'@'%' IDENTIFIED WITH mysql_native_password BY '123123'; - 若已创建,可用
ALTER USER 'dzm'@'%' IDENTIFIED WITH mysql_native_password BY '123123';覆盖
如何安全放开 root 远程访问而不降级认证
生产环境不建议直接改 root 的 plugin,更稳妥的做法是「保留本地 root 安全性 + 新建专用远程管理账号」:
MySQL 数据库管理技能,能够通过自然语言查询和管理数据库,支持 SELECT/INSERT/UPDATE/DELETE、表管理、备份恢复等操作。当用户提及 MySQL、数据库查询、建表或数据备份时使用此技能。
- 先确认当前 root 只绑定
'localhost':SELECT user, host FROM mysql.user WHERE user = 'root'; - 新建远程管理用户(推荐带 IP 限制而非
'%'):CREATE USER 'admin'@'192.168.1.%' IDENTIFIED BY 'StrongPass!2026'; - 授予最小必要权限:
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'admin'@'192.168.1.%';(避免用ALL PRIVILEGES ON *.*) - 如需 DBA 级操作,再加
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'admin'@'192.168.1.%';,但禁用WITH GRANT OPTION
角色(ROLE)在 8.4 中的实际使用门槛
MySQL 8.4 支持角色,但默认未启用——你得先手动创建角色并显式分配,它不会自动继承或关联现有用户:
- 创建角色:
CREATE ROLE 'developer'; - 给角色授权:
GRANT SELECT, INSERT, UPDATE ON test_db.* TO 'developer'; - 把角色赋给用户:
GRANT 'developer' TO 'dzm'@'%'; - 关键一步:用户登录后必须激活角色,否则权限不生效:
SET ROLE 'developer';或启动时设默认角色:SET DEFAULT ROLE 'developer' TO 'dzm'@'%'; - 注意:角色不能跨 host 绑定,
'developer'对'dzm'@'192.168.1.100'和'dzm'@'%'是两个独立授权对象
最容易被忽略的是:MySQL 8.4 的权限缓存比以前更激进,FLUSH PRIVILEGES 在多数场景下确实可省略,但修改 plugin 或启用新角色后,必须让客户端重新连接才能生效——不是刷新权限表就能即时切换认证方式或角色上下文。

















