计划
PLAN

MySQL 5.5 升级到高版本路径规划

基于 MySQL 官方升级路径、MySQL 8.0/8.4 兼容性说明和当前 Java/Maven 项目扫描,给出分阶段升级路径、改造点、运维步骤、测试清单和风险评估。

2026-05-29-mysql-55-upgrade.md 2026-05-29 ~21 分钟阅读

1. 背景与结论

flowchart LR
  A[MySQL 5.5] --> B[latest 5.6]
  B --> C[latest 5.7]
  C --> D[latest 8.0]
  D --> E[8.4 LTS]
  E --> F[稳定运行与监控]
MySQL 不支持跨大版本跳升,最终目标 8.4 LTS 需先稳定落地 8.0。
要点

不能直接从 MySQL 5.5 升级到 5.7、8.0 或 8.4;最大应用风险集中在 ONLY_FULL_GROUP_BY、zero date、utf8/utf8mb4 漂移、native SQL、reserved words、认证插件和 sql_mode 变化。

当前系统 MySQL 版本计划从 5.5 升级到更高版本。本方案基于 MySQL 官方升级路径文档、MySQL 8.0/8.4 兼容性说明,以及当前 Java/Maven 项目代码扫描结果,给出分阶段升级路径、代码改造点、配置与运维步骤、测试验证清单和风险评估。

核心结论:

  1. 不能直接从 MySQL 5.5 升级到 5.7、8.0 或 8.4。官方不支持跨大版本跳升。
  2. 推荐路径:
MySQL 5.5 → 最新 5.6 → 最新 5.7 → 最新 8.0 → 可选最新 8.4 LTS
1

如果目标是长期稳定支持,建议最终目标为 MySQL 8.4 LTS;但必须先稳定落地 8.0 后再升 8.4。

2

当前项目主 Java 栈较新

Spring Boot 3.4.3、Hibernate 6.6.x、MySQL Connector/J 9.2.0。主应用驱动层不是最大阻塞点

3

本项目最大应用风险集中在


2. 官方支持的升级路径

2.1 推荐目标版本

目标说明推荐程度
最新 MySQL 5.7只能作为中间过渡,不建议长期停留
最新 MySQL 8.0.x现代化主目标,生态兼容性成熟
最新 MySQL 8.4.x LTS当前长期支持目标,适合最终落点最高

推荐策略:

第一阶段:5.5 → 5.6 → 5.7
第二阶段:5.7 → 8.0
第三阶段:8.0 稳定后 → 8.4 LTS

如果业务风险较高,可把 8.4 作为第二期项目,先完成 8.0 稳定化。

2.2 支持路径与不支持路径

官方规则:

当前版本目标版本是否支持说明
5.55.6支持需参考 archived 5.6 文档
5.55.7不支持不能跳过 5.6
5.65.7支持建议先升到最新 5.6
5.68.0不支持不能跳过 5.7
5.7.9+ GA8.0支持建议先升到最新 5.7
5.78.4不支持必须先到 8.0
8.08.4 LTS支持官方支持 LTS 到下一 LTS

最终路径:

5.5.x
  ↓
latest 5.6.x
  ↓
latest 5.7.x
  ↓
latest 8.0.x
  ↓
latest 8.4.x LTS

3. 主要兼容性与 breaking changes

3.1 MySQL 5.5 → 5.6

重点风险:

1

历史 temporal 存储格式变化。

2

5.5 时代遗留的 TIME / DATETIME / TIMESTAMP 旧格式需要检查和重建。

3

必须参考 MySQL 5.6 archived manual / release notes。

4

升级后仍需执行 mysql_upgrade

建议:

3.2 MySQL 5.6 → 5.7

重点风险:

1

默认 sql_mode 更严格。

2

ONLY_FULL_GROUP_BY 在 5.7 默认开启,容易导致历史 SQL 报错。

3

NO_ZERO_DATE / NO_ZERO_IN_DATE 等 date 行为需要关注。

4

需要执行 mysql_upgrade

本项目最可能在该阶段暴露 SQL 兼容问题。

3.3 MySQL 5.7 → 8.0

重点变化:

类别MySQL 8.0 变化对系统影响
Data Dictionary8.0 使用 transactional data dictionary,替代旧 .frm 等元数据模式rollback 难度更高,不能依赖文件级元数据操作
Auth Plugin默认认证插件从 mysql_native_password 改为 caching_sha2_password老客户端、BI 工具、脚本可能连接失败
sql_mode移除 NO_AUTO_CREATE_USER 等旧模式my.cnf / session SQL / dump 文件中如存在会启动或导入失败
Reserved Words8.0 新增保留字表名、列名、alias、view、routine、动态 SQL 可能失败
Charset/Collation默认从 latin1 变为 utf8mb4 / utf8mb4_0900_ai_ci新对象默认排序/比较规则变化
GROUP BY不再依赖隐式排序,GROUP BY ... ASC/DESC 移除需要显式 ORDER BY
Partition不再支持 generic partitioning,仅 InnoDB/NDB 原生支持非 InnoDB partition 表需处理
InnoDBundo/redo、autoinc lock mode、metadata 变化性能和导入/恢复流程要验证
mysql_upgrade8.0.16 后 server 自动执行升级任务运维流程不同于 5.7 以前

3.4 MySQL 8.0 → 8.4 LTS

重点:

1

官方支持 8.0 LTS/bugfix series 到 8.4 LTS。

2

升级前运行 MySQL Shell Upgrade Checker。

3

支持 in-place、logical dump/load、replication-based upgrade。

4

需先稳定运行在 8.0,再规划 8.4。


4. 当前项目 MySQL 使用现状

4.1 依赖栈

项目 parent:

Spring Boot:

JPA:

MySQL Connector:

Hibernate:

判断:

4.2 未发现 MyBatis

仓库扫描未发现:

因此本项目升级关注点应集中在:

4.3 数据源与 JDBC 配置

关键配置文件:

当前 JDBC URL 模板包含:

useUnicode=true
characterEncoding=utf8
useSSL=false
serverTimezone=Asia/Shanghai
allowPublicKeyRetrieval=true
zeroDateTimeBehavior=convertToNull

Hibernate 配置中包含:

hibernate.timezone.default_storage: NORMALIZE

JVM 启动脚本固定:

-Duser.timezone=Asia/Shanghai

判断:


5. 项目代码影响分析

5.1 高风险:ONLY_FULL_GROUP_BY

MySQL 5.7+ 默认开启 ONLY_FULL_GROUP_BY 后,历史宽松 SQL 可能失败。

已确认风险位置:

风险模式:

SELECT 非聚合字段
FROM table
GROUP BY 部分字段
ORDER BY 非 group 字段

在 MySQL 5.5 中可能运行,在 MySQL 5.7/8.x 中可能报错:

Expression #x of SELECT list is not in GROUP BY clause and contains nonaggregated column ...

改造策略:

1

所有非聚合字段要么加入 GROUP BY

2

要么使用聚合函数

MIN() / MAX() / ANY_VALUE()

3

排序如果有业务含义,显式 ORDER BY

4

不建议通过关闭 ONLY_FULL_GROUP_BY 规避,除非作为临时兼容方案。

示例:

-- 风险写法
SELECT task_id, name, COUNT(*)
FROM journey_report
GROUP BY task_id;

-- 改造写法 1:如果 name 与 task_id 函数依赖明确
SELECT task_id, MAX(name) AS name, COUNT(*)
FROM journey_report
GROUP BY task_id;

-- 改造写法 2:如果只是取任意值
SELECT task_id, ANY_VALUE(name) AS name, COUNT(*)
FROM journey_report
GROUP BY task_id;

5.2 高风险:zero date / temporal 数据

当前 JDBC URL 使用:

zeroDateTimeBehavior=convertToNull

风险:

处理策略:

1

升级前扫描所有 date/datetime/timestamp 字段。

2

明确业务语义

未知时间用 NULL,不使用 zero date。

3

编写数据清理脚本。

4

保留 zeroDateTimeBehavior=convertToNull 作为过渡期兼容,但不能依赖它长期掩盖脏数据。

示例检查 SQL:

SELECT COUNT(*)
FROM some_table
WHERE some_datetime = '0000-00-00 00:00:00';

5.3 中高风险:字符集与排序规则

当前连接参数使用:

characterEncoding=utf8

但部分 DDL 已使用:

DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

风险:

处理策略:

1

统一目标

建议标准化到 utf8mb4

2

明确 collation

根据业务选择 utf8mb4_unicode_ciutf8mb4_0900_ai_ci

3

所有 runtime DDL 必须显式指定 charset/collation。

4

做 emoji / 多语言文本 round-trip 测试。

5

如暂不改变排序规则,应在 8.x 上显式保持原 collation,避免隐式漂移。

5.4 中高风险:native SQL / JdbcTemplate / EntityManager

典型文件:

风险:

特别说明:

ContacatImportDisposeService.java:408,569,715 存在动态 SQL 字段名拼接。该问题不只是升级兼容性问题,也属于安全和正确性风险。升级项目应顺手增加字段白名单校验。

5.5 中风险:reserved words

已发现关键风险字段:

key 是 MySQL 关键字/保留字风险较高的 identifier。

处理策略:

1

ORM 路径一般可通过 quoting 规避。

2

手写 SQL、DDL、导入导出脚本必须统一反引号。

3

中长期建议重命名为业务语义更明确字段,例如 meta_key

5.6 中风险:runtime DDL

典型位置:

风险:

处理策略:

  1. 所有 runtime DDL 明确:
  1. 在 8.0/8.4 staging 上实际执行建表路径。
  2. 校验自动生成主键、索引、字段类型。

5.7 低到中风险:认证插件

主应用 Connector/J 9.2.0 已较新,理论支持 MySQL 8.x 默认 caching_sha2_password

但仍需检查:

临时兼容方案:

ALTER USER 'app_user'@'%'
  IDENTIFIED WITH mysql_native_password
  BY 'password';

长期建议:


6. 升级前数据库预检查

6.1 版本与环境盘点

SELECT VERSION();
SHOW VARIABLES LIKE 'version%';
SHOW VARIABLES LIKE 'sql_mode';
SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'collation_server';
SHOW VARIABLES LIKE 'lower_case_table_names';
SHOW VARIABLES LIKE 'default_authentication_plugin';

6.2 zero date 检查

需要针对所有 date/datetime/timestamp 字段生成检查 SQL。

示例:

SELECT COUNT(*)
FROM table_name
WHERE date_col = '0000-00-00'
   OR datetime_col = '0000-00-00 00:00:00';

6.3 sql_mode 检查

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

MySQL 8.0 前必须移除:

NO_AUTO_CREATE_USER
DB2
MAXDB
MSSQL
MYSQL323
MYSQL40
ORACLE
POSTGRESQL
NO_FIELD_OPTIONS
NO_KEY_OPTIONS
NO_TABLE_OPTIONS

6.4 MySQL Shell Upgrade Checker

MySQL Shell Upgrade Checker 不支持检查太老的 5.5,但在 5.7 → 8.0、8.0 → 8.4 前必须使用。

示例:

mysqlsh -- util checkForServerUpgrade user@host:3306 \
  --target-version=8.0.37 \
  --output-format=JSON \
  --config-path=/etc/my.cnf

8.4 前:

mysqlsh -- util checkForServerUpgrade user@host:3306 \
  --target-version=8.4.0 \
  --output-format=JSON \
  --config-path=/etc/my.cnf

6.5 mysqlcheck

5.7 → 8.0 前:

mysqlcheck -u root -p --all-databases --check-upgrade

6.6 schema 与对象检查

需检查:

1

reserved words 表名/列名/别名。

2

views / routines / triggers。

3

invalid definer。

4

partitioned table engine。

5

foreign key name 长度。

6

ENUM / SET 长度限制。

7

MyISAM 表。

8

old temporal columns。

9

使用 PASSWORD() 的 SQL。

10

GRANT ... IDENTIFIED BY ... 旧语法。


7. 运维升级步骤

7.1 总体原则

1

每个大版本 hop 前必须完整备份。

2

每个 hop 必须在生产等量级 clone 环境演练。

3

每个 hop 完成后先做应用回归,再进入下一阶段。

4

5.7 → 8.0 是最大风险点,必须单独设置评审门禁。

5

8.0 data dictionary 迁移后 rollback 复杂度显著上升,必须提前演练恢复。

7.2 Phase 0:基线盘点

输出以下清单:

7.3 Phase 1:5.5 → 最新 5.6

步骤:

1

全量备份并验证恢复。

2

停止应用写入或切换只读。

3

升级 MySQL Server 到最新 5.6。

4

启动 MySQL。

5

执行 mysql_upgrade

6

重启 MySQL。

7

检查 error log。

8

运行应用 smoke test。

9

处理 old temporal 格式问题。

7.4 Phase 2:5.6 → 最新 5.7

步骤:

1

确认 5.6 最新 patch。

2

全量备份并验证恢复。

3

升级 MySQL Server 到最新 5.7。

4

启动 MySQL。

5

执行 mysql_upgrade

6

重启 MySQL。

7

开启接近目标的 strict sql_mode 做预演。

8

修复 ONLY_FULL_GROUP_BY SQL。

9

运行业务回归。

7.5 Phase 3:5.7 → 最新 8.0

步骤:

  1. 确认版本为 5.7.9+,建议最新 5.7。
  2. 执行:
mysqlcheck -u root -p --all-databases --check-upgrade
1

执行 MySQL Shell Upgrade Checker。

2

修复所有 errors,评估 warnings。

3

清理 removed sql_mode。

4

清理 zero date / old temporal。

5

检查 reserved words。

6

检查 auth plugin。

7

设置 clean shutdown

SET GLOBAL innodb_fast_shutdown = 0;
1

正常关闭 MySQL。

2

升级到最新 8.0。

3

启动 MySQL,观察 server 自动升级日志。

4

检查 error log。

5

运行应用完整回归。

6

观察慢 SQL、连接失败、SQL 异常。

7.6 Phase 4:8.0 → 8.4 LTS

前置条件:

步骤:

1

执行 MySQL Shell Upgrade Checker,targetVersion 为 8.4.x。

2

修复所有 blocker。

3

备份并验证恢复。

4

选择升级方式

1

升级到 8.4 LTS。

2

回归核心业务。

3

更新运维文档和监控规则。


8. 应用改造与测试清单

8.1 必改项

优先级改造项说明
P0修复 ONLY_FULL_GROUP_BY 不兼容 SQLJourneyRecordRepositoryJourneyReportService 优先
P0zero date 数据清理不再长期依赖 zeroDateTimeBehavior=convertToNull
P0外部客户端兼容性盘点特别是 MySQL 8.0 认证插件
P1统一 charset/collation 策略建议统一到 utf8mb4
P1native SQL reserved words 审计特别是 key 字段
P1runtime DDL 显式 engine/charset/collation避免继承 8.x 新默认值
P1动态 SQL 字段白名单ContacatImportDisposeService 等位置
P2优化 SQL hints/index hints8.x optimizer 变化后需重新评估

8.2 测试范围

模块测试内容重点
rtjourneyJourneyRecordRepository native queryGROUP BY 兼容
wechatJourneyReportService / WxDeleteDataServicenative SQL、统计结果
contactDataCollectService runtime DDL建表、auto_increment、charset
contactContacatImportDisposeService动态字段 SQL 白名单
etlMetadataMigrationRecordDetailkey 字段 quoting
questionnairePersistentAuditEvent / temporal 字段timestamp/date 行为
全系统登录、写入、查询、导出连接、事务、字符集

8.3 集成测试环境矩阵

环境目的
MySQL 5.6 最新 patch验证第一跳
MySQL 5.7 最新 patch暴露 ONLY_FULL_GROUP_BY、strict mode 问题
MySQL 8.0 最新 patch验证 data dictionary、auth、charset、reserved words
MySQL 8.4 LTS最终目标验证

8.4 回归指标

1

应用能正常启动。

2

所有 datasource 连接成功。

3

登录/核心接口成功。

4

核心报表结果与升级前一致。

5

native SQL 无 GROUP BY / reserved word / sql_mode 报错。

6

时间字段无偏移。

7

emoji / 多语言字段读写正常。

8

导入导出功能正常。

9

慢 SQL 数量无明显增加。

10

连接池无异常耗尽。


9. Rollback 策略

9.1 5.5 → 5.6 / 5.6 → 5.7

rollback 方式:

9.2 5.7 → 8.0

这是最关键 rollback 点。

原因:

策略:

1

升级前必须验证备份可恢复。

2

保留 5.7 原实例快照。

3

如生产允许,优先采用 replication-based 或蓝绿切换方式。

4

8.0 首次启动失败时不要反复盲目启动,先分析 error log。

5

回退以恢复 5.7 备份为主。

9.3 8.0 → 8.4

策略:


10. 风险评估

风险严重级别可能性说明应对策略
直接跨版本升级官方不支持 5.5→5.7、5.6→8.0、5.7→8.4严格按 staged path
ONLY_FULL_GROUP_BY SQL 报错已发现风险 SQL提前改 SQL 并在 5.7/8.x 测试
zero date 数据导致失败当前 URL 使用 convertToNull,说明可能有历史脏数据升级前扫描和清理
8.0 data dictionary rollback 困难8.0 元数据升级不可轻易回退备份恢复演练、蓝绿或复制升级
外部客户端 auth 失败中高8.0 默认 caching_sha2_password盘点外部客户端,必要时临时 mysql_native_password
charset/collation 漂移中高当前 utf8 与 utf8mb4 混用统一 utf8mb4 策略
reserved word 冲突已发现 key 字段quote 或重命名
runtime DDL 继承新默认值动态建表路径存在显式 engine/charset/collation
optimizer 改变导致性能回退8.x optimizer 改动较多explain 对比、慢 SQL 监控
动态 SQL 字段拼接同时是安全风险字段白名单和参数化改造

11. 工作量评估

模块工作项预估人天
DBA/运维实例盘点、版本路径确认、备份恢复演练2 - 4
DBA/运维5.5→5.6→5.7 staging 演练2 - 4
DBA/运维5.7→8.0 upgrade checker 修复协同2 - 5
后端修复 ONLY_FULL_GROUP_BY 风险 SQL2 - 4
后端native SQL / reserved words 审计1 - 3
后端动态 SQL 字段白名单改造1 - 2
后端runtime DDL 显式 charset/collation1 - 2
数据治理zero date / old temporal 扫描和清理2 - 5
测试5.7、8.0、8.4 集成回归4 - 8
联调应用、DBA、外部客户端联合验证2 - 4
合计不含大规模数据迁移17 - 41 人天

如需要全库 utf8mb4/collation 迁移、zero date 大规模修复或蓝绿复制切换,需另行增加 5 - 15 人天。


12. 推荐执行顺序

Step 1:冻结基线

Step 2:应用 SQL 先行整改

优先修复:

1

ONLY_FULL_GROUP_BY

2

zero date。

3

dynamic SQL identifier allowlist。

4

runtime DDL charset/collation。

5

reserved words。

Step 3:生产数据 clone 演练

在 clone 环境完整执行:

5.5 → 5.6 → 5.7 → 8.0

记录每一步耗时、错误、修复脚本。

Step 4:正式分阶段升级

每个阶段都必须满足 gate:

Step 5:8.0 稳定后规划 8.4


13. 官方参考资料


14. 方案质量自检

检查项分数说明
需求理解4/4明确从 MySQL 5.5 升级到高版本的路径和验收关注点
竞品/行业实践3/4本方案以 MySQL 官方路径和生产数据库升级最佳实践为依据,未做营销竞品调研,因为该需求是基础设施升级
用户/运维体验5/6给出分阶段 gate、命令、检查清单和 rollback 策略
技术完整度6/6覆盖依赖、配置、SQL、数据、运维、测试、风险
可行性4/4给出工作量和执行顺序
附加分2/2给出 8.0 与 8.4 LTS 分阶段目标策略

总分: 24 / 26

结论:方案可提交评审。