mysql 8.0+ 迁移后连接秒断,90% 是因客户端使用老驱动无法解析 protocol v11 握手包,导致 error 2007 或空连接后立即断开,属 tcp 层协议不兼容,非配置、ssl 或权限问题,必须升级客户端驱动(如 java 改用 mysql-connector-java 8.3.0 及 com.mysql.cj.jdbc.driver)才能根本解决。

MySQL 8.0+ 迁移后连接秒断,90% 是因为客户端还在用老驱动——它根本解析不了 protocol v11 的握手包,不是配置错,是协议层直接拒收。
确认是不是 protocol mismatch 导致的连接断开
ERROR 2007("Protocol mismatch")或连接建立后立即断开(无认证错误、无 SSL 报错),基本可锁定 protocol 不兼容。这不是 SSL 或权限问题,而是 TCP 层握手失败。
- 在服务端执行
SELECT VERSION();,确认是8.0.23或更高版本(对应 protocol v11) - 在客户端机器运行
mysql --version或查应用依赖:若显示5.7.x或依赖mysql-connector-java-5.1.x.jar,就是它了 - 注意:日志里不会明说 “protocol v11”,但会看到类似
Got packets out of order或空连接后Connection reset by peer
必须升级客户端驱动,不能靠参数绕过
跳过 SSL、降级认证插件、加 allowPublicKeyRetrieval=true 都无效——这些发生在握手成功之后,而 protocol mismatch 发生在第一个 TCP 包解析阶段。
- Java 应用:删掉所有
mysql-connector-java-5.x.jar,Maven 改用mysql-connector-java:8.3.0,并把driver-class-name改为com.mysql.cj.jdbc.Driver - Python:弃用
MySQLdb或旧版PyMySQL ,改用 <code>mysql-connector-python(官方)或PyMySQL >= 1.1.0 - 命令行工具:卸载系统自带的
mysql-client-5.7,安装mysql-client-8.0(Ubuntu/Debian 可用apt install mysql-client,它默认拉取 8.x) - PHP:确保用
mysqli或PDO_MYSQL,且 PHP ≥ 7.4;mysql_*函数早已移除,不报错也连不上
验证驱动是否真正支持 protocol v11
光换 JAR 包或装新客户端不够,得看它实际行为。MySQL 8.0+ 启动时会记录协议协商细节,这是最准的判断依据。
- 在 MySQL 服务端开启通用日志(临时):
SET GLOBAL general_log = ON;,然后让客户端连一次,再查日志:tail -n 50 /var/lib/mysql/*.log,找包含Connect和Quit的相邻两行之间有没有Authentication—— 如果没有,大概率是协议没握手成功就断了 - 用
tcpdump抓包更直接:sudo tcpdump -i any port 3306 -w mysql.pcap,用 Wireshark 打开,看 client hello 后 server 是否返回 valid handshake response;v10 客户端发的包,v11 服务端会直接 RST - Spring Boot 用户注意:
spring-boot-starter-jdbc默认带 8.x 驱动,但如果你在pom.xml里写了<exclusions></exclusions>排除了它,又手动引了 5.x,那还是 v10
别忽略 mysqlx-bind-address 对协议的影响
MySQL 8.0+ 默认启用 X Protocol(端口 33060),部分新驱动(如 Connector/J 8.0.23+)会尝试先走 X Protocol 再 fallback 到经典协议。如果 mysqlx-bind-address 被设成 127.0.0.1,而你的应用从外部连,X Protocol 握手就会失败,导致整个连接流程中断。
- 检查配置文件中是否有
mysqlx-bind-address,若有,确保它和bind-address一致(比如都设为0.0.0.0) - 不想用 X Protocol?在连接串里加
xdevapi=false强制走经典协议,例如:jdbc:mysql://host:3306/db?xdevapi=false&serverTimezone=Asia/Shanghai - 云数据库(如阿里云 RDS)通常禁用 X Protocol,不用管这个参数;但自建迁移环境常被忽略
protocol mismatch 是静默失败型问题——没报错、没日志、连接闪断,排查时最容易卡在“以为是网络或权限问题”上。真正关键的是客户端二进制或 JAR 包本身是否实现了 v11 协议,而不是你写了什么参数。











