MySQL 8.4 LTS升级需直面四大风险:一是mysql-connector-j 8.4.0驱动存在官方确认Bug(#115736),导致高并发下通信包写入错误;二是mysql_native_password插件默认禁用,需显式开启或迁移至caching_sha2_password;三是innodb_buffer_pool_instances等参数默认值动态计算,行为不可预测,须显式配置;四是官方强制限定5.7→8.0→8.4两步升级路径,跳过8.0将引发系统表结构与数据字典不兼容。

MySQL 8.4 LTS 不是“小修小补”,而是带着明确的长期支持定位和若干破坏性变更上线的。如果你正准备从 8.0 升级,或更早(比如 5.7),必须直面几个关键风险点:驱动 Bug 已确认存在、认证插件默认禁用、部分参数行为静默改变、以及升级路径被官方严格限制。
mysql-connector-j 8.4.0 驱动存在已知通信缺陷
这不是配置问题,是驱动层真实 Bug。官方 Bug #115736 明确记录:mysql-connector-j 8.4.0 版本在连接初始化阶段存在严重性能退化——ARM64 下固定卡顿 30 秒,x86_64 Linux 服务器也普遍超 2 秒。该问题直接导致高并发下 HikariCP 频繁标记连接为 broken,并触发 java.sql.SQLNonTransientConnectionException: Got an error writing communication packets(SQLSTATE 08S01,ErrorCode 1160)。
实操建议:
- 立即弃用
mysql-connector-j8.4.0,改用 8.4.1 或更高补丁版本(截至 2026 年 4 月,8.4.3 已修复该问题) - 若暂无法升级驱动,可临时降级服务端至 MySQL 8.0.45 +
mysql-connector-j8.0.45 组合,回退后无需调任何参数即恢复稳定 - Spring Boot 3.2+ 用户需同步检查
spring-boot-starter-data-jdbc依赖树,避免间接拉入 8.4.0
mysql_native_password 插件默认禁用且需显式开启
MySQL 8.4 默认不再加载 mysql_native_password 插件。所有仍依赖该认证方式的客户端(尤其是老旧 Java 应用、某些 Python DB API 实现、或未更新的运维脚本)将直接报错 Plugin 'mysql_native_password' is not loaded,连接拒绝。
实操建议:
- 如必须保留兼容性,在
[mysqld]配置段中添加mysql_native_password=ON,然后重启 mysqld - 更推荐方案:批量迁移用户到
caching_sha2_password,执行ALTER USER 'user'@'host' IDENTIFIED WITH caching_sha2_password BY 'password'; - 注意 JDBC 连接字符串需匹配:使用
caching_sha2_password时,useSSL=true和serverTimezone必须显式设置,否则握手失败
innodb_buffer_pool_instances 等参数默认值动态计算
MySQL 8.4 改变了多个 InnoDB 参数的默认推导逻辑,不再是固定值。例如 innodb_buffer_pool_instances 不再默认为 8,而是按公式 (innodb_buffer_pool_size / innodb_buffer_pool_chunk_size) / 2 计算,并受 CPU 核心数约束(上限为逻辑 CPU 数)。这意味着同样 16GB buffer pool,在 8 核机器上可能得 2,在 32 核机器上可能得 8 —— 行为不可预测。
实操建议:
- 不要依赖默认值,所有核心性能参数(
innodb_buffer_pool_instances、innodb_io_capacity、innodb_io_capacity_max)都应显式写死 -
innodb_io_capacity默认值已从 200 提升至 2000,若你的磁盘仍是 SATA SSD 或 HDD,不调整会引发 I/O 压力误判 - 升级前用
SELECT @@innodb_buffer_pool_instances, @@innodb_io_capacity;记录旧值,新实例中直接复用
升级路径被强制限定为两步走
MySQL 官方明确不支持从 5.7 直接升级到 8.4。跳过 8.0 会导致系统表结构、数据字典格式、权限模型三重不兼容,大概率启动失败或后续出现隐性数据损坏。即使 mysqld 启动成功,mysql_upgrade 工具也无法修复跨代 gap。
实操建议:
- 必须分两阶段:5.7 → 8.0.x(推荐 8.0.37+)→ 8.4.x;每阶段完成后运行
mysqlcheck --all-databases --check-upgrade - 8.0 中间版本不是过渡摆设:它承担了
mysql_native_password到caching_sha2_password的平滑迁移、sql_mode严格化适配、以及 JSON 字段索引语法校验等关键转换 - 别忽略
information_schema兼容层变化:8.4 中部分视图字段名/类型已变更(如INNODB_METRICS新增COUNT_RESET),监控脚本需提前适配
最易被忽略的是:这些变更不是孤立存在的。比如你开了 mysql_native_password=ON,但驱动仍是 8.4.0,照样报通信错误;又比如你调高了 innodb_io_capacity,却没同步调整 innodb_read_io_threads,I/O 线程反而成瓶颈。升级不是改几个配置就完事,而是一整套链路的对齐验证。


















