从 MySQL 5.7 升级到 MySQL 8.0 是一个重大的版本跨越,不仅涉及语法和功能的变更,还涉及底层架构、默认配置和安全机制的显著变化。以下是需要重点关注的几个核心问题:
1. 默认排序规则与字符集变化
-
默认字符集:MySQL 5.7 默认是
latin1,而 MySQL 8.0 默认改为utf8mb4。- ✅ 建议:在创建新数据库或表时显式指定
utf8mb4和对应的排序规则(如utf8mb4_0900_ai_ci)。 - ⚠️ 注意:如果应用依赖旧的
latin1行为,可能需要调整连接层或会话变量。
- ✅ 建议:在创建新数据库或表时显式指定
-
默认排序规则:
- 5.7:
utf8mb4_general_ci - 8.0:
utf8mb4_0900_ai_ci(基于 Unicode Collation Algorithm v9.0) - ❗ 影响:某些字符串比较逻辑可能不同,尤其是涉及重音字符、大小写敏感性等场景。
- ✅ 建议:测试所有涉及字符串比较的业务逻辑,必要时显式指定排序规则。
- 5.7:
2. 身份验证插件变更
- MySQL 8.0 默认使用
caching_sha2_password作为身份验证插件,而 5.7 默认是mysql_native_password。- ❌ 兼容性问题:许多旧版客户端驱动(如 PHP 的 mysqlnd、旧版 JDBC、Python MySQL Connector 等)不支持
caching_sha2_password。 - ✅ 解决方案:
- 升级客户端库到支持 8.0 的版本。
- 或者为特定用户回退到
mysql_native_password:ALTER USER 'username'@'host' IDENTIFIED WITH mysql_native_password BY 'password';
- ❌ 兼容性问题:许多旧版客户端驱动(如 PHP 的 mysqlnd、旧版 JDBC、Python MySQL Connector 等)不支持
3. SQL 模式(sql_mode)严格化
- MySQL 8.0 默认启用了更严格的 SQL 模式,包括:
STRICT_TRANS_TABLESNO_ZERO_DATENO_ZERO_IN_DATEERROR_FOR_DIVISION_BY_ZERONO_AUTO_CREATE_USERONLY_FULL_GROUP_BY
- ❗ 影响:之前被容忍的错误(如插入
'0000-00-00'日期、除零操作、GROUP BY 未包含非聚合列)现在会报错。 - ✅ 建议:
- 全面测试应用对数据的写入和查询。
- 如需兼容旧行为,可在
my.cnf中显式设置sql_mode,但不推荐长期禁用严格模式。
4. JSON 功能增强与行为变化
- MySQL 8.0 对 JSON 类型进行了大量优化和新函数支持(如
JSON_TABLE、JSON_MERGE_PATCH等)。 - ❗ 注意:
- JSON 文档的键顺序不再保留(除非使用
JSON_OBJECT构造时指定)。 - 某些 JSON 路径表达式行为可能略有不同。
- ✅ 建议:检查所有使用 JSON 字段的查询和应用程序逻辑。
- JSON 文档的键顺序不再保留(除非使用
5. 窗口函数与 CTE 支持
- MySQL 8.0 原生支持窗口函数(如
ROW_NUMBER(),RANK())和公用表表达式(CTE,WITH子句)。 - ✅ 优势:可以简化复杂查询,提升性能。
- ⚠️ 注意:旧代码中若存在同名函数或别名冲突,需重命名以避免歧义。
6. InnoDB 存储引擎改进
- 在线 DDL 增强:更多操作支持在线执行,减少锁表时间。
- Redo Log 格式变更:从 MySQL 8.0.16 开始,redo log 格式变为“压缩 redo”,兼容性需注意备份/恢复工具。
- 隐式索引删除:MySQL 8.0.13+ 支持自动删除无用的二级索引(通过
innodb_optimize_fulltext_only=ON控制),需谨慎评估。
7. 性能_schema 与监控
- MySQL 8.0 增强了 Performance Schema 和 Sys Schema,提供更细粒度的性能监控。
- ❗ 注意:
- 某些旧版监控工具(如 Percona Monitoring and Management 早期版本、旧版 Zabbix 模板)可能需要升级。
- ✅ 建议:更新监控体系以适配新指标。
8. 二进制日志与复制兼容性
- MySQL 8.0 引入新的复制协议和 GTID 行为。
- ❗ 注意:
- 主从复制时,从库必须是 MySQL 8.0 或更高版本才能完全利用新特性。
- 半同步复制插件名称从
rpl_semi_sync_master变为semisync_master。 - ✅ 建议:规划好主从架构升级顺序,避免混合版本带来的兼容问题。
9. 密码策略与安全增强
- MySQL 8.0 默认启用密码强度验证插件
validate_password。 - ❗ 影响:简单密码将被拒绝。
- ✅ 建议:提前设置符合要求的密码,或通过
plugin_load_add临时禁用(不推荐生产环境)。
10. 迁移工具与步骤建议
- 不要直接 inplace 升级:推荐使用官方提供的
mysql_upgrade工具(MySQL 8.0.16+ 已集成到mysqld --upgrade)。 - 标准迁移流程:
- 备份所有数据和配置。
- 在新服务器安装 MySQL 8.0。
- 使用
mysqldump或mysqlpump导出数据。 - 导入到新实例。
- 运行
mysql_upgrade(如适用)。 - 切换流量并充分测试。
- ✅ 替代方案:考虑使用 Percona Server for MySQL 或 MariaDB 作为过渡(但需注意许可和功能差异)。
总结 checklist:
| 类别 | 关键动作 |
|---|---|
| 字符集/排序规则 | 确认 utf8mb4 和 _ai_ci 排序规则兼容性 |
| 身份验证 | 确保客户端支持 caching_sha2_password 或回退到 mysql_native_password |
| SQL 模式 | 测试严格模式下的数据写入和查询 |
| JSON | 检查 JSON 相关查询和业务逻辑 |
| 窗口函数/CTE | 审查复杂查询是否受益于新功能 |
| 监控工具 | 升级监控系统以支持新性能指标 |
| 复制架构 | 规划主从升级顺序,测试半同步复制 |
| 密码策略 | 设置强密码或临时调整策略 |
| 迁移方式 | 优先采用导出导入 + 升级脚本,而非原地升级 |
✅ 最终建议:在正式切换前,务必在预发环境中进行完整回归测试,包括功能测试、性能基准测试和数据一致性校验。如有条件,可先灰度部分非核心业务进行验证。
云小栈