答案是直接查主库mysql.user表确认复制账号plugin值为caching_sha2_password且从库last_io_error含相关错误,再执行alter user指定完整host和密码切换为mysql_native_password并flush privileges。

直接查主库 mysql.user 表,看复制账号的 plugin 字段是不是 caching_sha2_password——90% 以上的“账号密码认证失败”根本不是密码错了,而是插件不兼容。
怎么快速确认是 caching_sha2_password 导致的
登录主库(用 root 或高权限账号),执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'repl_user';
把 repl_user 换成你 CHANGE MASTER TO 里写的用户名。如果返回的 plugin 是 caching_sha2_password,再去看从库的 SHOW REPLICA STATUS\G 输出里 Last_IO_Error 是否含以下任一内容:
Authentication requires secure connectioncaching_sha2_password cannot be loadedClient does not support authentication protocol
两者同时成立,问题就锁定了。注意:repl_user@'192.168.1.10' 和 repl_user@'%' 是两个独立账号,必须查准 host 再操作。
ALTER USER 必须带全三要素
在主库执行修改时,缺一不可:
-
@'host'必须写全,不能省略或写成@'localhost'(除非你真从 localhost 连) -
BY 'your_actual_password'必须显式写出,哪怕密码没变——漏掉会导致密码被清空 - 执行完立刻跟
FLUSH PRIVILEGES;,否则内存缓存不更新,变更无效
完整命令示例:
ALTER USER 'repl_user'@'192.168.1.10' IDENTIFIED WITH mysql_native_password BY 'abc123';<br>FLUSH PRIVILEGES;
宝塔、phpEnv 等面板环境改完还得手动重启 MySQL 服务,否则从库 IO 线程可能仍缓存旧状态。
为什么改 my.cnf 的 default_authentication_plugin 不起作用
default_authentication_plugin = mysql_native_password 只影响「之后新建的用户」,对已存在的复制账号完全无效。很多人改完配置、重启 MySQL,发现 repl_user 的 plugin 字段还是 caching_sha2_password,就是卡在这里。
云数据库(如阿里云 RDS)通常禁止修改 /etc/my.cnf,这条路根本走不通,ALTER USER 是唯一入口。
如果你不想降级认证强度,可以优先试 GET_MASTER_PUBLIC_KEY=1:停掉从库复制后执行 CHANGE MASTER TO ... GET_MASTER_PUBLIC_KEY=1;(MySQL 8.0.4+ 支持),它会主动向主库请求 RSA 公钥绕过握手失败——但前提是主库已生成密钥对,且从库客户端版本 ≥8.0.4。
最容易被忽略的是:MySQL 把 user、host、plugin 三者绑定成一个完整身份,改错任何一个,都连不上。











