MySQL 8.0+连接失败主因是protocol_version固定为10、caching_sha2_password认证插件及TLSv1.2+加密要求与旧客户端不兼容,需服务端降级插件或客户端显式指定auth_plugin和TLS参数。

mysql客户端版本太低连不上服务端?看protocol_version和tls_version是否匹配
MySQL 8.0+ 默认启用更严格的协议和加密要求,老客户端(比如 MySQL 5.7 客户端、某些 Python mysqlclient 旧版、甚至系统自带的 mysql 命令)常因协议不兼容直接报错:ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded 或更隐蔽的 Lost connection to server。这不是“版本限制”配置项开关,而是协议与认证插件双重不匹配的结果。
- MySQL 8.0 默认认证插件是
caching_sha2_password,而旧客户端只认mysql_native_password - MySQL 8.0.4+ 默认最低 TLS 版本为
TLSv1.2,OpenSSL 1.0.x 客户端可能无法协商成功 -
protocol_version是服务端硬编码值(当前固定为 10),客户端必须适配,不可配置降级
临时绕过:服务端降级认证插件(仅限测试/内网)
如果确认是 caching_sha2_password 导致连接失败,且无法升级客户端,可在服务端为特定用户切换回兼容插件。注意:这会降低安全性,生产环境慎用。
- 登录 MySQL 服务端后执行:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
- 立即生效,无需重启,但需确保该用户后续连接时显式指定插件(部分客户端如
mysql命令行工具 8.0+ 会自动协商,5.7 不会) - 若用
CREATE USER新建用户,加IDENTIFIED WITH mysql_native_password显式声明
客户端连接时强制指定协议与插件(Python / CLI 场景)
很多问题其实出在客户端没告诉服务端“我想用什么方式连”,而不是服务端卡了版本。关键参数要显式传进去。
- 命令行连接老服务端或绕过默认插件:
mysql --default-auth=mysql_native_password -u user -p
- Python
pymysql:构造连接时加auth_plugin='mysql_native_password' - Python
mysql-connector-python:加auth_plugin='mysql_native_password'和ssl_disabled=True(若 TLS 协商失败) - Java JDBC URL 后加
?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false(仅调试,useSSL=false关闭 TLS,非生产方案)
真正可控的“最小客户端版本”其实是 TLS 和密码策略
MySQL 本身没有 min_client_version 这种配置项。所谓“限制”,实际落在两个可配参数上:
-
tls_version:服务端变量,控制允许的 TLS 协议版本,例如设为TLSv1.2,TLSv1.3就会拒绝 OpenSSL 1.0.2 以下的客户端 -
default_authentication_plugin:影响新用户的默认插件,但不影响已有用户;设为mysql_native_password可减少兼容问题 - 修改方式:
SET PERSIST tls_version = 'TLSv1.2,TLSv1.3';
或写入my.cnf的[mysqld]段并重启
真正难处理的是客户端底层依赖——比如某个嵌入式设备固件绑死了 MySQL 5.1 客户端库,连 mysql_native_password 握手都解析不全。这时候不是改配置能解决的,得换驱动或中间代理。










