MySQL 8.0+默认使用caching_sha2_password是为了提升安全性:采用SHA-256哈希、加盐存储、支持RSA加密或SSL传输,显著增强抗暴力破解和中间人攻击能力,而mysql_native_password依赖已不安全的SHA-1算法。

为什么新用户默认用 caching_sha2_password 而不是 mysql_native_password
MySQL 8.0+ 默认认证插件改成了 caching_sha2_password,它更安全,但老客户端(比如 MySQL 5.7 客户端、某些 Python 2 环境下的 mysqlclient、旧版 Navicat 或 DBeaver)不支持或需额外配置才能连。如果你遇到类似 Client does not support authentication protocol requested by server 的错误,大概率就是这个原因。
修改已有用户的认证方式为 mysql_native_password
直接对已存在用户执行 ALTER USER 即可,注意必须指定密码(即使想保持原密码不变,也要重输一遍):
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
常见要点:
-
'your_user'@'%'中的主机部分(如%或localhost)必须和创建时一致,否则会新建一个用户而非修改 - 执行后需运行
FLUSH PRIVILEGES;(虽然多数情况下非必需,但保险起见建议加上) - 如果用户是通过
CREATE USER ... IDENTIFIED BY创建的,且没显式指定插件,那它默认就是caching_sha2_password(8.0.4+)
创建新用户时直接指定 mysql_native_password
避免后续再改,建用户时就锁定插件:
CREATE USER 'new_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass123';
对比写法(不推荐):
CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'pass123'; <!-- 默认插件,取决于 default_authentication_plugin 配置 -->
关键区别:
- 显式用
IDENTIFIED WITH可绕过全局配置,确保行为确定 - 若服务器
default_authentication_plugin设为caching_sha2_password(默认),不显式指定就会中招 - 该语句在 MySQL 5.7 不支持,仅适用于 8.0+
全局设为 mysql_native_password(不推荐,仅临时调试用)
修改配置文件 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf,在 [mysqld] 段加入:
default_authentication_plugin=mysql_native_password
然后重启 MySQL:sudo systemctl restart mysql。但要注意:
- 这会影响所有**后续新建**的用户,已有用户不受影响
- 生产环境不建议长期使用,削弱了默认安全强度
- 某些云数据库(如阿里云 RDS、AWS RDS)不允许修改该参数
- 如果只为了兼容某个旧应用,优先改用户而非全局配置
真正容易被忽略的是:改完用户认证方式后,有些客户端缓存了连接信息(比如 DBeaver 的连接池),需要手动断开重连,甚至重启客户端——光刷新权限或重启 MySQL 是不够的。



















