最常用方法是执行alter user 'root'@'localhost' identified with mysql_native_password by 'your_password',必须显式指定host和密码,改后验证plugin字段是否变为mysql_native_password。

MySQL 8.0 默认用 caching_sha2_password,老客户端(比如 Navicat、旧版 PHP mysqli、某些 Java JDBC 驱动)连不上,报错 ERROR 2059 或 Authentication plugin 'caching_sha2_password' cannot be loaded。这不是密码错了,是插件不认——必须切到 mysql_native_password 才能通。
怎么改单个用户的认证插件(最常用)
登录 MySQL 后直接执行 ALTER USER,这是最快、最安全的方式,不影响其他用户:
-
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';—— 必须带BY子句,即使密码不变也要重写一遍明文;否则语句会报错或静默失败 - 远程用户要写对 host:
'root'@'%'或'root'@'192.168.1.100',不能只写'root' - 改完立刻生效,
FLUSH PRIVILEGES不强制要求,但加了没坏处 - 验证是否成功:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';,看plugin列是不是mysql_native_password
为什么改完还是连不上?常见坑点
改插件只是第一步,很多失败其实卡在后续环节:
- 客户端连的是
'root'@'localhost',但你改的是'root'@'%'—— host 必须完全匹配,大小写和空格都算 - 命令行登录时密码含
!、#、$等 shell 特殊字符,用双引号包裹会被解析(如mysql -u root -p"pass!123"报event not found),得改用单引号:mysql -u root -p'pass!123' - Navicat 连接时没勾选「使用 SSL」或「压缩协议」,而服务端配置了强制 SSL,会导致握手失败(和插件无关,但现象类似)
- Ubuntu 22.04 上装的 MySQL 8.0 可能默认启用了
auth_socket(不是caching_sha2_password),此时ALTER USER会报错ERROR 1054 (42S22): Unknown column 'password' in 'field list',得先用sudo mysql登录再操作
要不要改全局 default_authentication_plugin?
在 /etc/mysql/mysql.conf.d/mysqld.cnf 的 [mysqld] 段里加一行:default_authentication_plugin = mysql_native_password,然后 sudo systemctl restart mysql(注意是 restart,不是 reload)。
- 这个设置只影响**新创建的用户**,已有用户插件不变
- 云数据库(如阿里云 RDS、腾讯云 CDB)通常禁止修改该参数,这条路走不通
- 查当前值用:
SELECT @@default_authentication_plugin;,返回mysql_native_password才算生效 - 本地开发环境可以设,但生产环境建议慎用——它绕过了 MySQL 8.0 的安全增强,默认降级有代价
真正容易被忽略的是 host 匹配和 shell 对密码的解析:同一个用户,'root'@'127.0.0.1' 和 'root'@'localhost' 在 MySQL 里是两个不同账户;而 mysql -u root -p'pa#ss' 能连上,mysql -u root -p"pa#ss" 就可能直接崩在 shell 层。这些细节不排查清楚,光改插件没用。











