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)中进行,后续小版本仅修复错误和安全问题。
关键区别:
二、主要功能与改进
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.sys
和mysql.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)兼容的备份。
- MySQL 8.4 增加
- 权限管理 :
- 移除
SET_USER_ID
权限,引入更细粒度的SET_ANY_DEFINER
和ALLOW_NONEXISTENT_DEFINER
权限。
- 移除
- 统计信息 :
- 自动更新直方图(histogram)功能,当使用
ANALYZE TABLE
时,带有AUTO UPDATE
选项的直方图会自动更新。
- 自动更新直方图(histogram)功能,当使用
- 移除功能 :
- 移除
FLUSH HOSTS
语句,需使用TRUNCATE TABLE performance_schema.host_cache
替代。 - 移除
AUTO_INCREMENT
在FLOAT
/DOUBLE
类型上的支持,需转换为整数类型。 - 移除
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()
函数。
- 移除
为什么重要 :这些变化提高了工具的灵活性和安全性,但可能需要调整现有脚本和配置。
三、兼容性与升级注意事项
1. 不兼容变更
- 外键约束 :MySQL 8.4 默认要求父表上的外键引用列具有唯一索引,可能导致 DDL 失败(
ERROR 6125
)。 - 术语变更 :旧的
MASTER/SLAVE
术语已完全移除,需更新脚本和监控工具。 - 功能移除 :如
SET_USER_ID
、FLUSH HOSTS
等被移除,可能导致现有脚本或自动化流程报错。 - 空间索引:升级到 8.4.4 或更高版本时,建议在升级前删除并在升级后重建空间索引。
2. 升级建议
- 测试新默认值 :MySQL 8.4 更改了多个默认参数(如
innodb_flush_method
、innodb_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 官网