MySQL 8.0安装时默认认证插件为caching_sha2_password,导致旧客户端(如Navicat 12、Python 2驱动)连接失败并报错“Authentication plugin 'caching_sha2_password' cannot be loaded”,需通过ALTER USER显式降级或启用兼容模式。

安装时默认认证插件不同,直接决定能否连上
MySQL 8.0 安装完默认用 caching_sha2_password,5.7 默认是 mysql_native_password。这不是“可选配置”,而是安装器初始化阶段就写死的——哪怕你没动任何选项,root@localhost 的认证方式已经不同。
后果很直接:旧版客户端(比如 Navicat 12 及更早、Python 2 的 mysql-connector-python、某些 PHP 5.6 环境)会卡在连接阶段,报错:Authentication plugin 'caching_sha2_password' cannot be loaded。这不是密码错了,是根本没走到验证那步。
- 图形化安装器里有明确勾选项:“Use Legacy Authentication Method”,勾上就回退到
mysql_native_password - 命令行初始化后立刻执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 别只改 root,所有新建用户也要显式指定插件,否则默认继承全局策略
初始账号权限模型彻底重构,匿名用户和远程 root 被砍掉
MySQL 5.7 安装完自带匿名用户(''@'localhost'),且 root@'%' 默认存在——这等于裸奔。8.0 直接删了这两类账号,root 只能从 localhost 登录,且必须输密码。
这意味着:如果你习惯在 5.7 里用 mysql -u root 直接进库,8.0 会报错 Access denied;如果之前靠空密码或通配符 host 连接应用,升级后必然中断。
- 检查残留账号:
SELECT user,host FROM mysql.user;,看到空 user 或 % host 就得删 - 需要远程访问?必须手动创建新用户并显式授权:
CREATE USER 'app'@'192.168.1.%' IDENTIFIED BY 'pwd'; GRANT SELECT ON db.* TO 'app'@'192.168.1.%'; - 别依赖
GRANT ALL PRIVILEGES ON *.*,8.0 的权限粒度更细,有些操作(如BACKUP_ADMIN)需单独赋权
密码策略默认启用,弱密码在安装阶段就被拦截
MySQL 8.0 安装时自动加载 validate_password 插件,要求密码至少 8 位、含大小写字母+数字+特殊字符。你在安装向导里输 12345678 或 password,会直接弹窗报错,无法继续。
5.7 虽然也能装这个插件,但默认不启用——所以很多老环境密码还是明文存配置文件里,8.0 这步直接卡死弱口令路径。
- 临时禁用(仅限测试环境):
SET GLOBAL validate_password.policy = LOW;,再设密码 - 生产环境别绕过,而是提前规划密码规范,比如用
openssl rand -base64 12生成随机串 - 注意:插件参数如
validate_password.length在 8.0.4+ 后改名成validate_password.dictionary_file等,旧脚本会失效
角色管理不是“锦上添花”,而是权限分配的起点
5.7 没角色概念,给 10 个开发人员开库权限,得重复执行 10 遍 GRANT;8.0 安装完就能直接建角色:CREATE ROLE 'dev_readonly'; GRANT SELECT ON prod.* TO 'dev_readonly';,再把角色分给人。
但问题在于:如果你沿用 5.7 的运维脚本批量授权,里面全是 GRANT ... TO 'user'@'host',到 8.0 里跑不通——因为角色必须显式激活才能生效,且 SHOW GRANTS 输出格式也变了。
- 检查是否启用了角色:
SELECT VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'activate_all_roles_on_login';,默认是 OFF - 给用户加角色后,要补一句:
SET DEFAULT ROLE 'dev_readonly' TO 'alice'@'localhost'; - 备份还原时,
mysqldump --all-databases不包含角色定义,得额外导出SELECT * FROM mysql.role_edges;
真正容易被忽略的,是这些安全机制在安装那一刻就固化下来——不是装完再配,而是装的过程就在执行。很多人以为“先装再调”,结果发现连接不上、权限不对、密码设不了,回头翻文档才意识到:8.0 的安全基线,是从第一个字节写入磁盘就开始 enforce 的。


















