MySQL 8.4 LTS升级最危险的坑是默认行为静默变更和驱动层真实Bug:mysql-connector-j 8.4.0存在官方确认Bug#115736,导致高并发下连接丢包、初始化卡顿;innodb_change_buffering默认从all改为none引发批量写性能跳变;mysql_native_password插件默认禁用致老应用直连失败;且官方强制5.7→8.0→8.4两步升级路径,跳步将引发系统表结构与数据字典不兼容。

MySQL 8.4 LTS 升级最危险的坑不在功能缺失,而在默认行为静默变更和驱动层真实 Bug —— 不显式干预,服务大概率在高并发下开始丢连接、卡初始化、读不到最新数据。
mysql-connector-j 8.4.0 驱动会触发 SQLNonTransientConnectionException: Got an error writing communication packets
这不是配置问题,是官方确认的驱动缺陷(Bug #115736)。现象非常典型:HikariCP 频繁标记连接为 broken,ErrorCode 1160 报错随并发升高而密集出现,调任何 MySQL 超时参数都无效。
- ARM64 架构下连接初始化固定卡顿 30 秒;x86_64 Linux 服务器也普遍超 2 秒
- Spring Boot 3.2+ + JDK21 环境复现率接近 100%
-
mysql-connector-j 8.4.0必须弃用,改用8.4.1或更高版本(截至 2026 年 4 月,8.4.3已修复) - 若无法立即升级驱动,临时方案是回退至
MySQL 8.0.45 + mysql-connector-j 8.0.45组合,无需改任何参数即可恢复稳定
innodb_change_buffering 默认从 all 变为 none,批量写性能可能跳变
这个改动不报错,但会让高频二级索引写入场景的延迟毛刺变多、QPS 小幅下降,尤其在 SSD/NVMe 环境下反而更容易暴露问题。
- 旧配置未显式设置该参数,升级后实际已关闭 change buffer,排查时容易误判为磁盘或 IO 配置问题
- 影响明显场景:大量非唯一二级索引 + 批量
INSERT/DELETE(如日志归档、ETL 导入) - 若业务依赖该机制,需在
[mysqld]中显式加innodb_change_buffering = all,并观察Innodb_buffer_pool_reads是否回升 - 注意:该参数不影响唯一索引或主键操作,只作用于非唯一二级索引的 DML 缓存
mysql_native_password 插件默认禁用,老应用直连失败
所有仍用 mysql_native_password 认证的客户端(老旧 Java 应用、某些 Python DB API、未更新的运维脚本)会收到 Plugin 'mysql_native_password' is not loaded 错误,连接直接拒绝。
- 不能靠客户端降级解决,必须服务端显式开启:
mysql_native_password = ON加入[mysqld]并重启 - 更推荐迁移用户到
caching_sha2_password:ALTER USER 'user'@'host' IDENTIFIED WITH caching_sha2_password BY 'password'; - 使用
caching_sha2_password时,JDBC 连接串必须带useSSL=true和serverTimezone,否则握手失败 - 升级前务必执行
SELECT user, host, plugin FROM mysql.user;全量普查认证方式
升级路径被官方硬性锁定:5.7 → 8.0 → 8.4,跳步必失败
这不是建议,而是强制限制。直接从 5.7 升 8.4 会导致系统表结构与数据字典不兼容,information_schema 列定义错乱、监控脚本全挂、甚至 mysqld 启动失败。
- 必须先升到一个稳定的 8.0 版本(如
8.0.37),运行至少一周,再升 8.4 - 两次升级都要跑
mysql_upgrade --check预检,重点看字符集、SQL mode、保留字冲突 - 5.7 到 8.0 阶段要特别处理
utf8mb3→utf8mb4、NO_ZERO_DATE模式变更、XA 事务残留 - 物理备份(XtraBackup)和逻辑备份(
mysqldump --routines --events)必须在每一步升级前完成,并验证可恢复
真正麻烦的从来不是“怎么升”,而是“哪些默认值变了却没人告诉你”——比如 innodb_redo_log_capacity 替代了旧日志参数、group_replication_consistency 默认值前移到 BEFORE_ON_PRIMARY_FAILOVER,这些都在后台悄悄改变行为,等业务出问题才浮现。


















