当前位置: 首页 > news >正文

组件版本升级 - MySQL_8.4对比MySQL_8.0

MySQL 8.4 与 MySQL 8.0 的区别:全面对比

MySQL 8.4 作为 MySQL 的长期支持(LTS)版本,于 2024 年 4 月正式发布,带来了多项改进和变化,相较于 MySQL 8.0 系列(特别是 8.0.34 及以上版本)在性能、功能和兼容性方面有显著提升。本文将详细对比 MySQL 8.4 和 MySQL 8.0 的主要区别,帮助开发者、数据库管理员(DBA)和企业用户了解是否需要升级,以及升级可能带来的影响。


一、背景与版本策略

MySQL 8.0

  • 发布背景:MySQL 8.0 是 2018 年发布的一个重大版本,引入了众多新功能,如窗口函数、通用表表达式(CTE)、JSON 增强等。
  • 支持周期:MySQL 8.0 的支持将持续到 2026 年 4 月(延长支持结束),但自 8.0.34 起已转为仅修复错误(bugfix-only)模式,不再引入新功能。
  • 特点:持续开发模式,频繁更新,包含错误修复、安全补丁和新功能。

MySQL 8.4

  • 发布背景:MySQL 8.4 是 MySQL 8.x 系列的第一个 LTS 版本,旨在提供更长时间的稳定性支持(预计到 2032 年 4 月)。
  • 支持周期:提供 5 年主要支持和 3 年延长支持,适合追求稳定性和长期使用的生产环境。
  • 特点:专注于稳定性和向后兼容性,功能移除和添加仅在 LTS 首版本(如 8.4.0)中进行,后续小版本仅修复错误和安全问题。

关键区别

  • MySQL 8.0 是持续开发版本,更新频繁但支持周期较短。
  • MySQL 8.4 是 LTS 版本,适合需要长期稳定支持的企业用户,功能变化在 8.4.0 中完成,后续版本更注重稳定性。

二、主要功能与改进

1. 认证机制变更

  • MySQL 8.0
    • 默认认证插件为 caching_sha2_password,提供更安全的 SHA-256 密码哈希。
    • 仍支持 mysql_native_password,但在 8.0.34 中已被标记为过时。
  • MySQL 8.4
    • mysql_native_password 默认禁用,需通过启动参数 --mysql-native-password=ON 或配置文件显式启用。
    • 默认继续使用 caching_sha2_password,并在升级过程中将系统账户(如 mysql.sysmysql.session)从 mysql_native_password 转换为 caching_sha2_password
    • 如果禁用 mysql_native_password,需注意 caching_sha2_password 的行为差异,例如在禁用 TLS(--ssl-mode=disabled)时需要额外配置 --get-server-public-key--server-public-key-path

为什么重要:禁用 mysql_native_password 提高了安全性,但可能导致旧版客户端或依赖此插件的应用出现兼容性问题,需在升级前测试。

2. InnoDB 存储引擎优化

  • MySQL 8.0
    • innodb_flush_method 默认使用 fsync
    • innodb_log_buffer_size 默认值为 16 MiB。
  • MySQL 8.4
    • innodb_flush_method 在 Linux 系统上改为 O_DIRECT,减少操作系统缓存的开销,可能提高写性能(尤其在 SSD 上)。
    • innodb_log_buffer_size 默认值增加到 64 MiB,有助于处理更大的事务日志,提升写入效率。
    • 外键约束更严格:默认要求父表上的引用列具有唯一索引(restrict_fk_on_non_standard_key=ON),否则会抛出 ERROR 6125。可通过设置 restrict_fk_on_non_standard_key=OFF 恢复旧行为。
    • 自适应哈希索引(AHI)可动态启用/禁用,提升特定查询性能。

为什么重要:这些变化优化了 InnoDB 的性能,尤其是在高负载写入场景下,但可能需要调整配置以适应特定工作负载。

3. 复制功能改进

  • MySQL 8.0
    • 使用旧术语 MASTER/SLAVE
    • SOURCE_RETRY_COUNT 默认值为 86400。
  • MySQL 8.4
    • 术语全面更新为 SOURCE/REPLICA,例如 SHOW MASTER STATUS 改为 SHOW SOURCE STATUS,以符合现代化和包容性标准。
    • SOURCE_RETRY_COUNT 默认值改为 10,减少复制重试次数,需根据网络稳定性调整。
    • 组复制(Group Replication)改进:
      • 默认 group_replication_consistency 改为 BEFORE_ON_PRIMARY_FAILOVER,提供更严格的事务一致性。
      • group_replication_exit_state_action 默认改为 OFFLINE_MODE,改变故障处理行为。
      • 支持跨版本组复制,允许同一系列的不同小版本(如 8.4.0 和 8.4.14)加入同一复制组。

为什么重要:术语更新和复制增强提高了可读性和高可用性,但需要更新脚本和配置以适应新术语和行为。

4. Clone 插件增强

  • MySQL 8.0
    • Clone 插件要求主从版本号完全匹配(包括小版本号)。
  • MySQL 8.4
    • 放宽版本要求,仅需主版本和次版本匹配(如 8.4.0 可与 8.4.14 互操作)。
    • 提高 Clone 插件的灵活性,便于跨小版本的数据迁移和复制。

为什么重要:Clone 插件的改进简化了数据迁移和备份操作,适合动态更新的生产环境。

5. GTID 增强

  • MySQL 8.0
    • 支持基本的全局事务标识符(GTID)。
  • MySQL 8.4
    • 引入 GTID 标签(GTID TAGS),允许对一组事务进行标记,便于在服务器间追踪和处理。
    • 设置 gtid_executed 系统变量需要新的 TRANSACTION_GTID_TAG 权限。

为什么重要:GTID 标签提高了事务管理的灵活性和可追溯性,适合复杂复制场景。

6. 性能优化

  • MySQL 8.0
    • 在高读写负载下性能优于 5.7,但部分查询(如使用 JOIN 的查询)在某些版本(如 8.0.33)中存在性能退化。
  • MySQL 8.4
    • 通过优化数据结构(如将 std::map 替换为 ankerl::unordered_dense::map)提升了二进制日志事务依赖处理的性能,平均提高 19.4% 的查询每秒(QPS)。
    • 修复了索引范围扫描中的记录缓冲区缺失问题,平均提升 2.12% 的性能。
    • 针对 JOIN 和 GROUP BY 查询的优化,恢复了组跳跃扫描(group skip scan)功能,避免性能退化。

为什么重要:MySQL 8.4 在高负载场景下的性能提升显著,适合需要高吞吐量的应用,但需测试以确保特定查询的兼容性。

7. 其他功能变更

  • Mysqldump
    • MySQL 8.4 增加 --output-as-version 选项,支持生成与旧版本(如 8.0.23 之前或 8.0.23 至 8.2)兼容的备份。
  • 权限管理
    • 移除 SET_USER_ID 权限,引入更细粒度的 SET_ANY_DEFINERALLOW_NONEXISTENT_DEFINER 权限。
  • 统计信息
    • 自动更新直方图(histogram)功能,当使用 ANALYZE TABLE 时,带有 AUTO UPDATE 选项的直方图会自动更新。
  • 移除功能
    • 移除 FLUSH HOSTS 语句,需使用 TRUNCATE TABLE performance_schema.host_cache 替代。
    • 移除 AUTO_INCREMENTFLOAT/DOUBLE 类型上的支持,需转换为整数类型。
    • 移除 WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() 函数。

为什么重要:这些变化提高了工具的灵活性和安全性,但可能需要调整现有脚本和配置。


三、兼容性与升级注意事项

1. 不兼容变更

  • 外键约束:MySQL 8.4 默认要求父表上的外键引用列具有唯一索引,可能导致 DDL 失败(ERROR 6125)。
  • 术语变更:旧的 MASTER/SLAVE 术语已完全移除,需更新脚本和监控工具。
  • 功能移除:如 SET_USER_IDFLUSH HOSTS 等被移除,可能导致现有脚本或自动化流程报错。
  • 空间索引:升级到 8.4.4 或更高版本时,建议在升级前删除并在升级后重建空间索引。

2. 升级建议

  • 测试新默认值:MySQL 8.4 更改了多个默认参数(如 innodb_flush_methodinnodb_log_buffer_size),需在测试环境中验证对工作负载的影响。
  • 检查认证插件:确保客户端和应用支持 caching_sha2_password,否则需启用 mysql_native_password 或更新客户端。
  • 更新脚本:检查并修改使用旧术语(如 MASTER)或已移除功能的脚本。
  • 备份与回滚:升级前进行完整备份,测试回滚计划,确保数据安全。
  • 性能测试:针对生产环境中常见的查询(如 JOIN、GROUP BY)进行负载测试,避免优化器变化导致性能问题。

为什么重要:MySQL 8.4 的不兼容变更可能影响现有应用,需提前规划和测试以确保平稳过渡。


四、选择哪一个版本?

选择 MySQL 8.0

  • 适合场景
    • 现有系统依赖 mysql_native_password 或旧术语(如 MASTER/SLAVE)。
    • 需要与 MySQL Workbench 等工具的已知兼容性。
    • 追求短期内功能更新的灵活性。
  • 风险
    • 支持到 2026 年 4 月,之后将停止更新。
    • 部分性能问题(如 8.0.33 中的 JOIN 查询退化)可能需要手动优化。

选择 MySQL 8.4

  • 适合场景
    • 需要长期支持(至 2032 年),适合生产环境。
    • 希望利用性能优化(如 InnoDB 和二进制日志改进)提高吞吐量。
    • 愿意适配新术语和默认配置以获得更高的安全性和现代化特性。
  • 风险
    • 不兼容变更可能导致应用或脚本需要修改。
    • 新默认值(如 O_DIRECT)可能不适合所有工作负载,需仔细测试。

五、总结

MySQL 8.4 作为 LTS 版本,在 MySQL 8.0 的基础上提供了更强的稳定性、性能优化和现代化特性(如认证插件、术语更新、InnoDB 增强等)。然而,伴随这些改进的是潜在的兼容性挑战,特别是认证机制、外键约束和移除功能的变更。对于计划升级的用户,建议在测试环境中充分验证新默认值和行为,确保应用程序和脚本的兼容性。

如果你的系统需要长期稳定支持且能适配新特性,MySQL 8.4 是更好的选择;若现有系统对旧功能依赖较强或短期内无法完成升级测试,MySQL 8.0 仍是可靠的过渡选择。无论选择哪个版本,升级前的全面测试和备份都是不可或缺的。

参考资料

  • MySQL 8.4 参考手册:MySQL8.4 官网
http://www.dtcms.com/a/351523.html

相关文章:

  • 用 mem0 构建一个简单的 AI Healthcare 助手
  • 基于Vue通用组件定制化的场景解决
  • UNet改进(35):基于WGAM模块的PyTorch实战
  • Qt在Linux下编译发布 -- linuxdeployqt的使用
  • 第十九节:阴影进阶 - 软阴影与性能平衡技术
  • FileMenu Tools for Win:突破 Windows 文件管理困境的利器
  • Git:基本使用
  • 数字化转型三阶段:从信息化、数字化到数智化的战略进化
  • Leetcode+Java+动态规划II
  • 知行——同为科技24周年庆典
  • Thingsboard 租户管理员权限,增加租户普通用户权限
  • Go errgroup:高效并发控制与错误处理
  • WPF基于LiveCharts2图形库,实现:折线图,柱状图,饼状图
  • 03. 协程入门_Android异步处理机制
  • 系统架构设计师备考第7天——网络协议中间件软件构件
  • WebSocket简单了解
  • 线性代数之深入理解旋转矩阵
  • lesson46-2:Linux 高级指令全解析:从文件操作到系统管理
  • mybatisplus 配置二级缓存
  • 【系统编程】线程简介
  • 【人工智能】2025年AI代理开源革命:社区驱动的智能体生态重塑未来
  • Linux--seLinux的概述
  • FRET、PLA、Co-IP和GST pull-down有何区别? 应该如何选择?
  • 原型模式系统开发中的原型分类全景:水平、垂直、抛弃式与演化式
  • nvm切换node版本之后报错,无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
  • 嵌入式C语言进阶:结构体封装函数的艺术与实践
  • IUV5G专网排障(上)
  • 支持向量机(SVM)学习笔记
  • SOME/IP服务发现PRS_SOMEIPSD_00277的解析
  • 服务器数据恢复—热备盘上线失败如何恢复数据?