根本原因是mysql 8.0默认认证插件caching_sha2_password在非ssl连接下需rsa公钥交换,而从库io线程未启用get_master_public_key=1导致认证卡住,错误提示“authentication requires secure connection”。

为什么caching_sha2_password会导致主从IO线程连接失败
根本原因不是配置写错了,而是MySQL 8.0默认用caching_sha2_password插件认证,它在非SSL连接下要求RSA公钥交换,而从库IO线程默认不主动请求、主库又没配好公钥路径,直接卡在认证阶段。
典型错误信息是:Last_IO_Error: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061。这不是权限问题,也不是网络不通,更不是密码输错——查SELECT user, host, plugin FROM mysql.user WHERE user='repl';就能确认插件类型。
注意:mysql_native_password在握手时一次性发送哈希密码;caching_sha2_password需要额外一轮通信获取公钥,旧版客户端或未启用GET_MASTER_PUBLIC_KEY=1的从库就无法完成这一步。
change master to必须加GET_MASTER_PUBLIC_KEY=1
这是最轻量、最推荐的修复方式,不用改用户插件,也不用开SSL,只要让从库明确告诉主库“我要公钥”即可。
执行前确保主库已生成RSA密钥对(MySQL 8.0+默认自带,无需手动操作),然后在从库运行:
STOP REPLICA;<br>CHANGE MASTER TO<br> MASTER_HOST='192.168.1.100',<br> MASTER_PORT=3306,<br> MASTER_USER='repl',<br> MASTER_PASSWORD='your_pass',<br> MASTER_LOG_FILE='mysql-bin.000001',<br> MASTER_LOG_POS=154,<br> GET_MASTER_PUBLIC_KEY=1;<br>START REPLICA;
关键点:
-
GET_MASTER_PUBLIC_KEY=1必须显式写出,不能省略 - 如果主库启用了
require_secure_transport=ON,这条命令会失败,得先关掉或配SSL - 该参数只对
caching_sha2_password用户生效,对mysql_native_password用户无效也不需要
ALTER USER切换认证插件的风险与边界
把复制用户改成mysql_native_password能绕过所有RSA问题,但它是降级安全性的临时方案,不是长期解法。
操作很简单:
ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass';<br>FLUSH PRIVILEGES;
但要注意:
- 必须在主库执行,从库不参与认证插件变更
- 如果主库开启了
require_secure_transport=ON,即使插件切了,非SSL连接仍会被拒绝 - 某些Docker镜像或定制版MySQL可能禁用了
mysql_native_password插件,加载失败会报Plugin 'mysql_native_password' is not loaded - 后续升级到MySQL 8.4+时,该插件可能被彻底弃用,现在用就是在埋技术债
主从版本不一致时认证失败的隐藏陷阱
看起来是认证报错,实际可能是主从MySQL小版本差异导致插件行为不兼容。比如主库是8.0.34,从库是8.0.23,虽然都叫caching_sha2_password,但公钥协商逻辑有细微差别,IO线程照样连不上。
验证方法:
- 在主从两端分别执行
SELECT VERSION(), @@default_authentication_plugin; - 检查
SHOW VARIABLES LIKE 'require_secure_transport';是否一致 - 查看错误日志里有没有
Failed to get RSA public key或Plugin caching_sha2_password could not be loaded这类提示
真正要命的是:这种问题不会立刻暴露,可能某次主库执行CREATE USER后才触发,因为新用户默认用当前default_authentication_plugin创建,而从库解析不了对应认证流程。
所以别只盯着Last_IO_Error修,先跑一遍SELECT @@version比对——版本差超过2个小版本(如8.0.30 vs 8.0.22),就得考虑升/降级从库,而不是调参数。











