直接改用户认证方式最稳:执行alter user 'user'@'host' identified with mysql_native_password by 'pwd'并flush privileges,确保host精确匹配(如localhost/127.0.0.1/%)、密码显式指定,再查mysql.user验证plugin字段。

直接改用户认证方式最稳,别碰全局配置——除非你确定所有新用户都该用老插件,且能重启服务。
ALTER USER 必须带密码和精确 host 才生效
MySQL 8.0 要求 ALTER USER 切换认证插件时,必须同时指定密码和 host,缺一不可。只写 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password; 会清空密码字段,导致下次连不进。
- 查当前用户定义:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';—— 注意'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%'是三个独立账户 - Navicat 默认走
127.0.0.1(TCP),不是localhost(Unix socket),所以光改localhost不够 - 远程应用常用
'app_user'@'%',就得单独执行:ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 密码含
@、/、:等字符,在 JDBC URL 里要 URL 编码;命令行用双引号可能被 shell 解析,改用单引号:mysql -u root -p'pass!123'
FLUSH PRIVILEGES 不是可选项,是生效前提
ALTER USER 只更新磁盘表,不刷新内存中的权限缓存。不执行 FLUSH PRIVILEGES;,客户端仍按旧插件握手,错误照旧。部分 MySQL 8.0.x 小版本(尤其低于 8.0.23)不刷就不生效。
安全的随机密码生成器。支持自定义长度、字符类型(大写/小写字母、数字、特殊符号),排除相似字符,批量生成。纯 Python 标准库,无需 API 密钥。
- 执行后无输出即成功;出现
Query OK表示已加载 - 验证是否生效:
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 - Ubuntu 22.04 自带的 MySQL 8.0 有时默认是
auth_socket插件,也要按同样逻辑处理对应用户
客户端缓存和连接地址细节常被忽略
服务端改完,客户端未必立刻连得上。很多失败不是插件没切对,而是卡在握手环节的细节上。
- Navicat / MySQL Workbench 会缓存认证参数,必须完全退出软件再重开,“重连”没用
- 用
localhost连接时,MySQL 8.0 默认走 Unix socket;测试时可临时把地址改成127.0.0.1排查是否纯插件问题 - ~/.my.cnf 里加
[client] default_authentication_plugin = mysql_native_password只影响本地mysql命令行,不影响 Java/Python 应用 - 文件权限必须是
600(chmod 600 ~/.my.cnf),否则客户端会忽略它
最容易被忽略的是:改完服务端后,没删掉 Navicat 里的旧连接重新建,它还在用旧 handshake 参数重试;或者只处理了 'root'@'localhost' 却忘了 'root'@'127.0.0.1';又或者密码里有特殊字符,被 URL 解析吃掉了——这些比插件切换本身更常导致失败。










