直接修改 mysql_native_password 插件即可解决 MySQL 8.0 连接失败问题,根源是默认的 caching_sha2_password 不被旧驱动识别;需用 ALTER USER 指定密码并精确匹配 host,验证须查 mysql.user 表 plugin 字段。

直接改 mysql_native_password 插件就能解决连接失败
不是重装、不是删用户、也不是升级客户端——90% 的“连不上 MySQL 8.0”问题,根源就是默认插件 caching_sha2_password 不被旧驱动识别。只要把目标用户的认证插件切回 mysql_native_password,立刻生效,无需重启服务。
-
ALTER USER必须带BY 'your_password',哪怕密码没变也要显式写出来;只改插件不指定密码,MySQL 8.0 会拒绝执行 - 用户 host 必须完全匹配:你用
'root'@'localhost'登录,就得改这个;如果客户端连的是'root'@'192.168.1.100'或'root'@'%',改错 host 就白操作 - 执行后立刻查
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';,确认plugin列值是mysql_native_password,不是caching_sha2_password或空值
命令行登录时密码含特殊字符,!#$ 会被 shell 拦截
插件改对了、密码也对,但 mysql -u root -p"pass!@#123" 还是报 event not found ——这不是 MySQL 拒绝你,是 bash 把 ! 当成历史展开符、# 当成注释开头给吃掉了。
- 正确写法是用单引号包裹:
mysql -u root -p'pass!@#123' - 或者逐个转义:
mysql -u root -ppass\!\@\#123 - 最稳妥的方式是省略密码参数,让 MySQL 交互式提示输入:
mysql -u root -p回车后手动输,彻底绕过 shell 解析
安装时选 “Use Legacy Authentication Method” 可一劳永逸
如果是新装 MySQL 8.0,Windows 安装器里有明确选项:在配置 root 密码那步,勾选 Use Legacy Authentication Method (retains backward compatibility)。选它,所有新建用户默认就用 mysql_native_password,不用后续补救。
- 这个选项本质是让
mysqld初始化时自动设default_authentication_plugin=mysql_native_password - Linux 下手动初始化(
mysqld --initialize)后,也可以在my.cnf里加这一行,再重启服务 - 注意:该设置只影响后续新建用户,已存在的用户仍需单独执行
ALTER USER修改
别信 FLUSH PRIVILEGES 是必须的
ALTER USER 本身就会立即刷新权限缓存,FLUSH PRIVILEGES 在这里纯属冗余。很多教程照搬老版本写法,反而让人误以为漏执行它就失效。
- 验证是否生效,唯一可靠方式是查
mysql.user表的plugin字段,不是看命令有没有报错 - 如果查出来还是
caching_sha2_password,说明语句根本没成功执行——大概率是 host 写错、权限不足、或 SQL 语法有空格/引号问题 - 远程用户要特别注意:localhost 和 % 是两个完全不同的账号,改完
'root'@'localhost'对'root'@'%'没任何影响
SELECT user, host, plugin FROM mysql.user,比反复试连更省时间。


















