加油
努力

从MySQL 5.7切换到MySQL 8.0需要注意哪些问题?

从 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)
    • ❗ 影响:某些字符串比较逻辑可能不同,尤其是涉及重音字符、大小写敏感性等场景。
    • ✅ 建议:测试所有涉及字符串比较的业务逻辑,必要时显式指定排序规则。

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';

3. SQL 模式(sql_mode)严格化

  • MySQL 8.0 默认启用了更严格的 SQL 模式,包括:
    • STRICT_TRANS_TABLES
    • NO_ZERO_DATE
    • NO_ZERO_IN_DATE
    • ERROR_FOR_DIVISION_BY_ZERO
    • NO_AUTO_CREATE_USER
    • ONLY_FULL_GROUP_BY
  • ❗ 影响:之前被容忍的错误(如插入 '0000-00-00' 日期、除零操作、GROUP BY 未包含非聚合列)现在会报错。
  • ✅ 建议:
    • 全面测试应用对数据的写入和查询。
    • 如需兼容旧行为,可在 my.cnf 中显式设置 sql_mode,但不推荐长期禁用严格模式。

4. JSON 功能增强与行为变化

  • MySQL 8.0 对 JSON 类型进行了大量优化和新函数支持(如 JSON_TABLEJSON_MERGE_PATCH 等)。
  • ❗ 注意:
    • JSON 文档的键顺序不再保留(除非使用 JSON_OBJECT 构造时指定)。
    • 某些 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)。
  • 标准迁移流程
    1. 备份所有数据和配置。
    2. 在新服务器安装 MySQL 8.0。
    3. 使用 mysqldumpmysqlpump 导出数据。
    4. 导入到新实例。
    5. 运行 mysql_upgrade(如适用)。
    6. 切换流量并充分测试。
  • ✅ 替代方案:考虑使用 Percona Server for MySQL 或 MariaDB 作为过渡(但需注意许可和功能差异)。

总结 checklist:

类别 关键动作
字符集/排序规则 确认 utf8mb4_ai_ci 排序规则兼容性
身份验证 确保客户端支持 caching_sha2_password 或回退到 mysql_native_password
SQL 模式 测试严格模式下的数据写入和查询
JSON 检查 JSON 相关查询和业务逻辑
窗口函数/CTE 审查复杂查询是否受益于新功能
监控工具 升级监控系统以支持新性能指标
复制架构 规划主从升级顺序,测试半同步复制
密码策略 设置强密码或临时调整策略
迁移方式 优先采用导出导入 + 升级脚本,而非原地升级

最终建议:在正式切换前,务必在预发环境中进行完整回归测试,包括功能测试、性能基准测试和数据一致性校验。如有条件,可先灰度部分非核心业务进行验证。

云服务器