最可靠方法是直接修改用户认证插件:先查SELECT user, host, plugin FROM mysql.user WHERE user = 'root';,再执行ALTER USER 'root'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd';并立即FLUSH PRIVILEGES;,云数据库也支持且无需重启。

直接改用户认证插件最可靠,不需要重启 MySQL,云数据库也支持;全局改 default_authentication_plugin 只影响新用户,对已有账户完全无效。
查清楚当前用户用的是哪个插件
不确认就动手,大概率改错对象。登录 MySQL 后执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
重点看 plugin 列是不是 caching_sha2_password 或 auth_socket。注意:'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%' 是三个独立账户,host 必须一字不差匹配你实际连接时用的地址。
- Navicat 默认走
127.0.0.1(TCP),不是localhost(Unix socket) - 远程应用常用
'app_user'@'%',就得单独改这一行 - 如果看到
auth_socket,说明是 Ubuntu/Debian 自带的本地 root 配置,不是caching_sha2_password问题,别套用同一套语句
ALTER USER 必须带密码和精确 host 才生效
只写 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password; 是危险操作:它会清空密码字段,导致下次连不进。MySQL 8.0 要求切换插件时必须显式指定密码和 host,缺一不可。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 正确写法示例:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpass123'; - 如果 Navicat 连的是
127.0.0.1,还得补一条:ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'newpass123'; - 远程用户如
'app_user'@'%',也得单独执行对应语句 - 密码含
@、/、:等字符,在 JDBC URL 里要 URL 编码;命令行用双引号可能被 shell 解析,改用单引号:mysql -u root -p'pass!123'
FLUSH PRIVILEGES 不是可选项,是生效前提
ALTER USER 只更新磁盘表,不刷新内存中的权限缓存。不执行 FLUSH PRIVILEGES;,客户端仍按旧插件握手,错误照旧。部分 MySQL 8.0.x 小版本(尤其低于 8.0.23)不刷就不生效。
- 执行完每条
ALTER USER后,立刻跟上FLUSH PRIVILEGES; - 验证是否成功:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';,确认plugin列已变成mysql_native_password - 云数据库(如阿里云 RDS)也支持这条命令,且立即生效——这是唯一可行路径
my.cnf 的 default_authentication_plugin 只影响新用户
在 /etc/mysql/mysql.conf.d/mysqld.cnf 的 [mysqld] 段加 default_authentication_plugin = mysql_native_password,看起来一劳永逸,但其实它对已有用户完全无效。
- 配置必须严格放在
[mysqld]段下,[client]或[mysql]段无效 - 改完必须
sudo systemctl restart mysqld(reload不起作用) - Docker 部署需用启动参数:
--default-authentication-plugin=mysql_native_password - 该设置只对后续新建的用户生效,已有用户仍需单独
ALTER USER
真正容易被忽略的点是:客户端软件(如 Navicat、Workbench)会缓存认证参数,必须完全退出再重开,点“重连”没用;另外,localhost 和 127.0.0.1 在 MySQL 内部解析路径不同,测试时换地址能快速定位是插件问题还是连接路径问题。

















