升级后连不上主因是客户端不支持caching_sha2_password插件,必须用ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd'显式切换认证方式并执行FLUSH PRIVILEGES,仅修改my.cnf中default_authentication_plugin对已有用户无效。

升级后连不上,大概率不是密码错了,而是客户端根本没认出 caching_sha2_password 这个插件——必须手动把用户认证方式切回 mysql_native_password,且不能只改配置文件。
ALTER USER 必须显式执行,不能靠 default_authentication_plugin
default_authentication_plugin 在 my.cnf 里设成 mysql_native_password 对已有用户完全无效,它只在实例首次初始化(mysqld --initialize)时起作用。升级后的实例改了这个参数、重启服务,日志里也不会报错,但应用照样连不上——因为协商失败是静默断开的。
- 真正起效的是
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd'这条语句 - 必须用
root或有CREATE USER权限的账号执行 - host 必须完全匹配,比如原用户是
'app_user'@'10.20.1.%',就不能只写'app_user'@'%' - 如果密码为空或太弱(如
123),MySQL 8.0 可能直接拒绝执行,得先用SET PASSWORD设个强密码再改插件
执行后必须 FLUSH PRIVILEGES
权限变更不会自动生效,不执行 FLUSH PRIVILEGES,部分连接池(如 HikariCP、Druid)会继续用旧握手逻辑重连,导致偶发失败或长连接卡死。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 查当前用户插件状态:
SELECT user, host, plugin FROM mysql.user WHERE user = 'app_user' - 确认结果里
plugin字段已变成mysql_native_password - 执行完
ALTER USER后,立刻跟一句FLUSH PRIVILEGES - 别信“重启 MySQL 就行”,很多场景下重启不如刷新权限来得直接
客户端驱动版本比连接参数更重要
即使服务端已切回 mysql_native_password,老驱动仍可能在连接池复用、SSL 握手、时区协商等环节失败——这不是配置问题,是协议支持缺失。
- Java:必须用
mysql-connector-java≥ 8.0.12;5.1.x 驱动根本不识别新协议,加?allowPublicKeyRetrieval=true也白搭 - PHP:
mysqli扩展需 PHP ≥ 7.4,对应mysqlnd≥ 8.0.0;PHP 7.3 及更早版本无法协商成功 - Python:停用
MySQLdb(已归档),改用pymysql或mysql-connector-python≥ 8.0.12 - Navicat / DBeaver:重启客户端比重启 MySQL 更有效,它们会缓存旧连接上下文
批量处理非 mysql_native_password 用户要小心哈希值
mysql.user 在 MySQL 8.0 是视图,不能 UPDATE,只能靠 ALTER USER 生成语句批量处理。但注意:authentication_string 是哈希值,不能当明文密码用。
- 先查哪些用户还在用新插件:
SELECT user, host, plugin FROM mysql.user WHERE plugin != 'mysql_native_password' - 生成语句示例:
SELECT CONCAT("ALTER USER '", user,"'@'", host,"' IDENTIFIED WITH mysql_native_password BY 'your_new_password';") FROM mysql.user WHERE plugin = 'caching_sha2_password' - 实际执行时,
'your_new_password'必须替换成真实密码;若记不清,得先人工重置再改插件 - 别漏掉
root用户,它常被忽略,但监控/备份脚本很可能依赖它
最麻烦的不是单点修复,而是主从复制场景下主库和从库的插件必须对齐——5.7 主库若用了 caching_sha2_password 创建复制账号,8.0 从库 SQL 线程会卡住,SHOW SLAVE STATUS\G 里 Seconds_Behind_Master 显示为 NULL,错误日志却只有一行模糊提示。

















