MySQL 9 正式发布
2025-07-23 14:58:48 阿炯

MySQL 9.4.0 版正式于2025年7月下旬发行(GA),来快速浏览一下都有哪些内容。

字符集支持
重要变更:IFNULL LIKE 子句中使用时,会触发 ER_CANT_AGGREGATE_2COLLATIONS 错误 。 这是因为 IFNULL () 返回二进制排序规则且排序规则派生类型为 NONE,但在此场景下不允许使用 NONE,从而导致错误。 我们通过对语义稍作调整来解决此问题:将排序规则派生类型 NONE 的优先级降低,使其低于其他任何排序规则派生类型的优先级。这意味着,当使用派生类型为 NONE 的表达式时,LIKE 会根据另一个操作数来确定要使用的比较排序规则。这对现有功能的影响应该极小,且我们现有的测试套件无需任何修改。我们还修改了排序规则聚合逻辑,在确定结果排序规则时,仅考虑具有相同(且最高)优先级的排序规则。此外,我们将之前的 IGNORABLE 派生类型重命名为 NULL,因为它仅用于空值,且由于 NONE 现在的优先级更低,它不再是 “可忽略的”。 另外,我们在原 NONE 优先级的值之间留下了一个间隔,以尽量减少 COERCIBILITY() 调用返回与先前实现不兼容的值的情况。 有关更多信息,请参见《表达式中的排序规则可 coercibility》 。(漏洞 #37285902)
CREATE TABLE 若包含生成列表达式(如 CHECK 约束),且该表达式引用了非 ASCII 标识符,如果当前客户端字符集与 UTF-8 不兼容时(例如 GBK),会导致语法错误。

编译说明
macOS:现在可以使用 -DWITH_KERBEROS 在 macOS 上编译服务器。
macOS:调整了用于读取状态变量的缓冲区。这修复了在 macOS/M1 平台上可能出现的问题。
移除了针对旧版本 CMake 的兼容处理。
注意 编译 MySQL 所需的最低 CMake 版本为 3.14.6。(漏洞 #37901122)
内置的 ICU 库已升级至 77-1 版本。(漏洞 #37870791)
内置的 zstd 库已升级至 1.5.7 版本。(漏洞 #37869972)
移除了使用 Clang 20 编译服务器时出现的警告。(漏洞 #37785251)
使用 GCC 15 编译时,禁用了 clang::musttail。(漏洞 #37776018) - 解决了在某些旧版本 CMake 中处理列表时的问题。(漏洞 #37709169)
部分编译器功能测试在使用 -fprofile-use 编译时无法通过。(漏洞 #37707556)
编译 MySQL 所需的 Boost 版本已从 1.85.0 提升至 1.87.0。(漏洞 #37403602)
链接器尝试使用空的 Cmake 变量 ${ICU_LIBRARIES},即使正确的库(ext::icu)已在其他位置链接。(漏洞 #36524167)
在 macOS 上编译时,原本明确查找 openssl@1.1,现在改为查找通用的 openssl 符号链接,以支持 openssl@3。(漏洞 #35468370)
在 macOS 上,消除了 Xcode 14 生成的弃用警告;包括建议使用 snprintf (3) 替代 sprintf (3),以及从 64 位转换为 32 位整数时可能丢失精度的警告。(漏洞 #34776172)

组件说明
当组件注册的用户定义函数(UDF)正在运行时,该函数无法被注销,因此组件也无法被卸载(执行 UNINSTALL COMPONENT 会被拒绝并返回错误)。若在 UDF 运行期间两次尝试卸载组件,第一次尝试会如预期般失败,但第二次尝试却会成功,这会导致库被卸载,进而引发 UDF 相关问题,甚至可能导致服务器意外退出。 出现此问题的原因是,即使组件的反初始化函数未成功执行,它也会清空已注册 UDF 的容器,因此第二次卸载操作会跳过注销步骤。我们通过在此类情况下存储先前注册的状态来修复该问题。(漏洞 #35772996)

配置说明
微软 Windows 系统:当使用非默认的 Windows 服务名称时,通过 MySQL 配置器进行 MySQL 服务器的原地升级会失败。(漏洞 #37917039)
微软 Windows 系统:将服务器从 8.0 版本升级到更高版本系列时,MySQL 配置器不会在 my.ini 文件中保留自定义的服务器设置。(漏洞 #37481548)
微软 Windows 系统:使用 MySQL 配置器升级 MySQL 服务器时,若使用了自定义的错误日志名称,升级过程会在 “启动服务器并升级系统表” 步骤中挂起。(漏洞 #37463478)
微软 Windows 系统:MySQL 配置器允许添加重复用户(即使用相同用户名和主机名定义的用户),并在服务器上将它们创建为不同的用户。此次修复后,在图形用户界面(GUI)模式下,重复用户会被拒绝并显示错误消息;在命令行界面(CLI)模式下,使用 --add-user 指定的重复用户会被忽略。(漏洞 #37460190)
微软 Windows 系统:在 CLI 模式下,MySQL 配置器现在接受环境变量 MYSQL_PWD 的文件路径,允许在文件中指定密码。 感谢 Jonathan Moore 对此做出的贡献。(漏洞 #37460173)
微软 Windows 系统:在 CLI 模式下,MySQL 配置器之前始终拒绝长度少于 4 个字符的 root 密码。此次修复后,该限制仅适用于新配置。此外,除新配置外,密码选项不再是必填项。(漏洞 #37460061)
系统变量 back_log 的默认值已增加到 10000。有关为使 MySQL 服务器能够抵御连接突发而必须设置的 Linux 配置参数,请参见back_log。(任务 #16888)
现在可以通过系统变量 server_memory 限制 MySQL 服务器在确定配置变量默认值时使用的最大物理内存量。(任务 #16938)

弃用与移除说明
作为从 MySQL 插件向 MySQL 组件过渡的持续工作的一部分,用于编写 MySQL 插件的 API 现已被弃用,并计划在未来的 MySQL 版本中移除。此变更会产生以下影响: - MySQL 服务器的 --early-plugin-load 选项已被弃用。使用该选项启动服务器会触发弃用警告。
每当加载密钥环插件时,都会发出弃用警告。有关密钥环组件与密钥环插件的区别概述,请参见《密钥环组件与密钥环插件》。另请参见《使用迁移服务器进行密钥迁移》,了解从密钥环插件迁移到密钥环组件的相关信息。(任务 #16574)
在 8.0.26 版本中被弃用的系统变量 temptable_use_mmap,在本版本中已被移除。(任务 #16745) - 本版本中,SQL 函数 MD5()SHA1()已被弃用,并计划在未来版本中移除。(任务 #16955)

InnoDB 说明
改进了内存管理,以防止在某些错误处理场景中可能出现的内存泄漏。(漏洞 #37826893)
在特定条件下(例如表和索引从缓存中被逐出时),information_schema.innodb_cmp_per_index 表有时会返回未知的数据库名和表名。(漏洞 #37820227)
修复了与导入表相关的问题。(漏洞 #37621360) - innodb_change_buffer_max_size 的默认值已更改为 5。此更新旨在平衡变更缓冲对 IO 密集型工作负载的益处,以及当缓冲池的较大部分用于变更缓冲时,对内存工作负载可能产生的负面影响。(任务 #16968)

安装说明
macOS:当启动 mysqld 时未指定 --plugin-dir,但指定了--basedir,且基础目录不以斜杠字符(/)结尾,同时mysqld 配置为加载 keyring_file 组件时,服务器启动会失败并报错。这给 MySQL 的 macOS 安装程序带来了问题,导致它无法设置 root 账户的密码。(漏洞 #36816216)参考:另见漏洞 #36398484。
现在,非 root 用户也可以运行用于安装 MySQL 的 Debian 软件包。这有助于解决需要无 root 安装的 Debian 或 Ubuntu 系统的相关问题。(漏洞 #37765153)
现在支持在 Red Hat Enterprise Linux 和 Oracle Linux 10 上通过 RPM 和 Yum 仓库进行安装。(漏洞 #37592019)

JavaScript 程序
在内存使用率较高的情况下,尝试执行 JavaScript 存储过程时,SP::init() 中的第一个 context.parse() 调用会引发内存不足错误。随后,会异步进行第二次 context.parse() 调用。如果在此期间其他会话释放了内存,该调用可能会成功。这意味着 MLE 组件的错误处理程序会报告一个错误,但由于第二次调用成功,MLE 会返回表示成功的状态码。现在,在这种情况下,CALL 会被拒绝并返回内存不足错误。(漏洞 #37952656)
将捆绑的 Graal Maven 版本升级到了 24.2.1.0.1。(漏洞 #37938310)
包含的 GraalVM 以及 MLE 组件使用的 Truffle 库分别升级到了 23.1.7 和 24.2.1 版本。(漏洞 #37833200)
当 mysqldump 来自 MySQL 9.2.0 或更高版本的发行版时,mysqldump --routines 在与早期版本的服务器配合使用时无法正常工作,因为它找不到 INFORMATION_SCHEMA.LIBRARIES 表。在这种情况下,mysqldump 会跳过该表,不会尝试导出它。(漏洞 #37498680)
现在支持在 JavaScript 存储例程中使用 MySQL 的 BIT(https://dev.mysql.com/doc/refman/9.4/en/bit-type.html)类型。有关类型转换规则和其他信息,请参见《JavaScript 存储程序的数据类型和参数处理》。(任务 #16885)

性能模式说明
内部函数 pfs_get_thread_statement_locker_vc() 包含调试代码,这些代码意外地被包含在了发布版本中。(漏洞 #37743667)

向量数据类型
VECTOR_TO_STRING()函数未能正确设置其输出的排序规则。(漏洞 #37815490)

新增或更改的功能
重要变更:新增了 mysql 客户端的 --commands 选项,该选项用于启用或禁用大多数 mysql 客户端命令。 此选项默认处于禁用状态。要启用它,可以使用 --commands 或 --commands=ON 启动客户端。有关受此选项影响的所有命令的完整列表以及其他信息,请参见《mysql 客户端选项》(https://dev.mysql.com/doc/refman/9.4/en/mysql-command-options.html)。(任务 #16949) 参考:另见漏洞 #36416568。
InnoDB:为了改进调试,现在会将 buf_page_t 和 buf_block_t 结构的元数据打印到错误日志中。(漏洞 #35115629)参考:另见漏洞 #35115601。
组复制:新增了错误 ER_GRP_RPL_APPLIER_THD_KILLED(https://dev.mysql.com/doc/mysql-errors/9.4/en/server-error-reference.html#error_er_grp_rpl_applier_thd_killed),用于区分应用线程是通过 SQL 的KILL 命令终止的,还是因错误而停止的。(漏洞 #37764717)
NDB 复制:现在可以将 MySQL 集群或单个 NDBCLUSTER(https://dev.mysql.com/doc/refman/9.4/en/mysql-cluster.html)表的二进制日志在多个 MySQL 服务器之间分成相等的部分或 “分片”。 为了将整个集群的二进制日志分成多个分片,此 NDB 版本实现了两个 mysqld 启动选项。--ndb-log-row-slice-count(https://dev.mysql.com/doc/refman/9.4/en/mysql-cluster-options-variables.html#option_mysqld_ndb-log-row-slice-count)选项用于确定分片的数量,从而确定共享二进制日志的服务器数量。--ndb-log-row-slice-id(https://dev.mysql.com/doc/refman/9.4/en/mysql-cluster-options-variables.html#option_mysqld_ndb-log-row-slice-id)用于标识此 MySQL 服务器负责的分片。有关这些选项的更多信息,请参见其描述。可以通过向ndb_replication 表中添加行(并为该表中新增的 binlog_row_slice_count 和 binlog_row_slice_id 列设置适当的值),为特定的 NDB 表分割二进制日志。如果正在升级现有的设置,可能需要执行 ALTER TABLE 语句,或者删除并重新创建该表以获得此功能。有关更多信息和示例,请参见《按表进行二进制日志分片》(https://dev.mysql.com/doc/refman/9.4/en/mysql-cluster-replication-schema.html#ndb-replication-per-table-binlog-slicing)。(任务 #15413)
在信号处理期间打印当前查询时,将历史的 1024 字节限制增加到了 1073741824(1024 * 1024 * 1024)字节。(漏洞 #37603354)
包含 curl(而非链接到系统 curl 库)的二进制包已升级为使用 curl 8.14.1。(漏洞 #37389565)

已修复的漏洞
重要说明;组复制:组通信系统(GCS)负责处理成员之间的组复制通信,并跟踪组成员身份以及所有组成员之间的连接。成员身份跟踪包括当前及前两次迭代的成员身份。当某个成员离开时,组内剩余成员会保留该离开成员的记录,但在其返回前停止与其通信。例如:组内包含成员 M1、M2 和 M3。M3 离开组后,M1 和 M2 停止与 M3 通信。当新成员(M4)加入时,它会了解该组前几次迭代的成员身份,并尝试与所有服务器通信,包括前几次迭代中的服务器(此处为 M3)。 若某些先前的服务器已消失且不再返回,新成员会持续尝试连接这些缺失的服务器;在某些情况下,这些持续的连接尝试可能会引入网络延迟,影响组成员的通信。 为避免此问题,现在对属于组成员身份迭代中的服务器的连接会在 5 分钟后停止,这一时间应足以重新建立有效连接,同时不会对组通信造成持续影响。(漏洞 #37704514)
性能:在 MySQL 8.0 中已优化移除的某些查询中的冗余条件,在后续版本中不再被移除,导致此类查询的性能大幅下降。(漏洞 #117907、漏洞 #37808260) 参考:此问题是以下漏洞的回归:漏洞 #30112096。
InnoDB:即使不需要,每次行更新时都会检查该表是否被外键引用。 现在仅在需要时才执行该检查。(漏洞 #37867653)
InnoDB:在缓冲池创建期间为线程设置处理器亲和性时,未正确解析 pthread_setaffinity_np 的返回值。因此,即使亲和性设置失败,也不会返回错误。(漏洞 #37825544)
InnoD:重建主键时,若存在重复数据,服务器有时会遇到问题,可能导致服务器意外停止。 感谢 Xizhe Zhang 及阿里巴巴团队的贡献。(漏洞 #37822992)
InnoDB:修复了与删除属于索引一部分的列相关的问题。(漏洞 #37726881)
InnoDB:由于未受保护的静态数组,MySQL 社区版二进制文件包含不必要的 OpenTelemetry 符号。(漏洞 #37689163)
InnoDB:双写缓冲区过大。计算每个文件的段数时,总会额外添加一个段,而实际上只有当双写实例的数量不能被双写文件的数量整除时,才应添加额外的段。(漏洞 #37684656)
InnoDB:修复了与 DELETE 操作相关的问题。(漏洞 #37478594)
InnoDB:在 VARCHAR(https://dev.mysql.com/doc/refman/9.4/en/char.html)列上创建二级索引时,分配的内存可能超过配置值,分配的内存量与innodb_ddl_buffer_size(https://dev.mysql.com/doc/refman/9.4/en/innodb-parameters.html#sysvar_innodb_ddl_buffer_size)的值直接相关,从而导致类似 “ERROR 1136 (21S01):第 1 行的列数与值数不匹配” 的错误。(漏洞 #37233273)
InnoDB:修复了与空间数据类型列索引相关的问题。(漏洞 #36682518)
InnoDB:服务器关闭期间,临时表处理程序未能正常终止,可能导致服务器意外终止。通过实施一种机制来跟踪并正确清理与每个线程相关联的临时表对象,已解决此问题。(漏洞 #36538081)
InnoDB:当 MySQL 企业备份增量备份失败后,若重做日志消费者滞后,可能会导致长时间的信号量等待崩溃,从而阻止重做日志写入线程推进。返回的错误消息类似如下: [警告] [MY-013934] [InnoDB] 重做日志写入程序正在等待 MEB 重做日志消费者,该消费者当前正在读取 LSN=23335640211468,这阻止了重做日志后续部分的回收。考虑增加 innodb_redo_log_capacity。 (漏洞 #36330455)
InnoDB:修复了与表上的范围查询相关的问题。(漏洞 #31360522)
复制:修复了 libs/mysql/binlog/event/event_reader.cpp 中的内部内存管理问题。(漏洞 #37371443)
复制:在半同步复制中,当二进制日志后缀的长度超过六位(.999999),使得下一个日志文件变为例如 mysql-bin.1000000 时,复制协议会意外地从半同步变为异步。(漏洞 #115861、漏洞 #37024069)
组复制:系统状态变量 Gr_empty_consensus_proposals_count(https://dev.mysql.com/doc/refman/9.4/en/group-replication-status-variables.html#statvar_Gr_empty_consensus_proposals_count)未按预期更新。(漏洞 #37937927)
组复制:在网络环境不稳定的情况下,启用了 group_replication_paxos_single_leader=ON(https://dev.mysql.com/doc/refman/9.4/en/group-replication-system-variables.html#sysvar_group_replication_paxos_single_leader)的组复制 InnoDB 集群中,一些长时间运行的事务会陷入 “等待处理程序提交” 状态。结果,group_replication_set_as_primary()(https://dev.mysql.com/doc/refman/9.4/en/group-replication-functions-for-new-primary.html#function_group-replication-set-as-primary)被迫等待,进而阻塞其他传入的查询,导致集群不可写。长时间运行的事务陷入 “等待处理程序提交” 状态的问题发生如下: 在间歇性网络分区期间,次要节点由于成员身份信息过时或不准确而错误地承担了领导者角色。这导致同步节点编号分配冲突,使得来自主节点的事务无法完成。 通过确保次要节点在将视图消息推送到 Paxos 之前始终反映最新、准确的状态来修复此问题。这确保过时或不一致的成员身份信息不会导致领导力或同步节点编号分配冲突。(漏洞 #37764970) 参考:另见漏洞 #117424、漏洞 #37237959、漏洞 #37645674。
Fedora 24 上的 RPM 安装无法完成,因为从上游拉取了冲突的包。此修复添加了适当的废弃声明以阻止冲突的包。(漏洞 #37976913)
某些调用存储例程的触发器并非总能正确执行。(漏洞 #37915445)
内部函数 transform_table_subquery_to_join_with_derived() 在调用后未能正确恢复当前查询块,导致断言错误。(漏洞 #37884336) 参考:另见漏洞 #37832605。
移除了 item_cmpfunc.cc 中潜在的内存泄漏。(漏洞 #37883669)
使用包含子查询的 CTE 的视图并非总能得到正确处理。(漏洞 #37832605)
如果启用了 component_keyring_encrypted_file(https://dev.mysql.com/doc/refman/9.4/en/keyring-encrypted-file-component.html)或component_keyring_file(https://dev.mysql.com/doc/refman/9.4/en/keyring-file-component.html)且binlog_encryption(https://dev.mysql.com/doc/refman/9.4/en/replication-options-binary-log.html#sysvar_binlog_encryption)设置为ON,由于访问密钥环数据文件时出现问题,服务器无法在 Docker 容器中启动。(漏洞 #37821740)
移除了 sql/opt_costconstantcache.cc 中的一个警告,该警告由设置而非比较值的断言引起。(漏洞 #37814484)
在已使用系统的 APT 仓库安装 MySQL 的 Ubuntu 25.04 系统上,无法安装 Oracle 的 MySQL 包。(漏洞 #37804480)
在 Fedora 24 上,当系统上已安装 MariaDB 时,由于包冲突,无法安装 Oracle MySQL RPM 包。通过此修复,冲突得到妥善处理,使得 MySQL 服务器能够成功安装。(漏洞 #37798784)
改进了先前针对关闭期间客户端连接并非总能正确终止的问题的修复。(漏洞 #37755594) 参考:此问题是以下漏洞的回归:漏洞 #35854919。
当计算的块数超过 65535 时,INTERSECT 中触发断言错误,这可能发生在估计的行数非常高,或者 set_operations_buffer_size(https://dev.mysql.com/doc/refman/9.4/en/server-system-variables.html#sysvar_set_operations_buffer_size)系统变量设置过低的情况下。 此修复添加了对此情况的缺失检查。如果需要超过 2 个块文件集,我们会恢复为基于索引临时表的去重。为提醒用户,此信息会在查询的注释和优化器跟踪中呈现。 作为此修复的一部分,set_operations_buffer_size 使用的块大小从 128 增加到 1024。(漏洞 #37742092)
Fedora 42 的 RPM 安装包已适配 Fedora 42 及更高版本中 /usr/bin 和 /usr/sbin 目录合并的情况。(漏洞 #37737658)
使用 InnoDB 的全文搜索性能,特别是短语搜索,已得到改进。文档 ID 匹配的效率有所提升。(漏洞 #37682648)
当 keyring_okv 插件(参见《使用 keyring_okv KMIP 插件》(https://dev.mysql.com/doc/refman/9.4/en/keyring-okv-plugin.html))已安装但配置不正确时,对performance_schema.keyring_keys(https://dev.mysql.com/doc/refman/9.4/en/performance-schema-keyring-keys-table.html)表的查询会出现问题。(漏洞 #37655299)
从 sql/sql_resolver.cc 中移除了一个断言。(漏洞 #37601389)
作为包含多个子查询的条件的一部分且其策略已确定为 IN-to-EXISTS 的子查询,会被检查是否可物化,从而导致问题。之所以进行物化检查,是因为该条件中的其他某个子查询的策略已确定为 MATERIALIZATION。我们通过添加检查,仅关注那些应被物化的子查询来解决此问题。(漏洞 #37587388)
漏洞 #30875669 的修复在该漏洞关闭时并未实际包含在 mysql 客户端的代码中。现在已实施相关更改。(漏洞 #37572191) 参考:另见漏洞 #30875669。
mysql_secure_installation 未按预期检查 root 密码是否已过期。(漏洞 #37563088)
包含一行或多行且每行包含多个 SQL 语句的初始化文件,在初始化期间有时会产生错误。(漏洞 #37559598)
某些 CREATE TABLE(https://dev.mysql.com/doc/refman/9.4/en/create-table.html)和DROP TABLE(https://dev.mysql.com/doc/refman/9.4/en/drop-table.html)语句序列未得到正确处理。(漏洞 #37534068) 参考:此问题是漏洞 #35721121 的回归:。
移除了由 MySQL 9.2.0 中对缓存 SHA-2 认证插件所做工作引入的性能回归。(漏洞 #37523469)
UPDATE ... SET ...(https://dev.mysql.com/doc/refman/9.4/en/update.html)并非总能成功回滚。(漏洞 #37489167)
CREATE TABLE(https://dev.mysql.com/doc/refman/9.4/en/create-table.html)语句中的多个DEFAULT 列表达式并非总能得到正确处理。(漏洞 #37436220)
包含执行聚合的关联子查询的查询,在执行期间有时会(错误地)因重复键错误而被拒绝。 此问题由先前的修复引入,该修复在 JOIN::cleanup() 执行期间移除了对原始引用切片的恢复(set_ref_item_slice(REF_SLICE_SAVED_BASE)),并假设这是不必要的。结果,来自先前执行的临时表字段引用未被清除,导致尝试向临时表插入重复键时触发错误 “无法写入;表中存在重复键”。 我们通过在清理期间恢复原始引用切片来修复此问题,确保任何过时的引用都被丢弃。(漏洞 #37415167) 参考:另见漏洞 #32141711。此问题是漏洞 #35856247 的回归。
在某些 Windows 系统上,使用 MSI 安装程序安装 MySQL Server 9.1 后,服务器无法启动。这是因为这些系统未安装 Visual C++ Redistributable v.14.42 或更高版本。MySQL Server MSI 安装程序现在会检查此要求,只有满足要求才会开始安装。(漏洞 #37365476)
注释中未加引号的分号字符(;)并非总能被标记为错误,尽管它们是不允许的。(漏洞 #37117875)
从 keyring_aws 插件中移除了潜在的内存泄漏。(漏洞 #36684413)
在尝试将子查询转换为派生表时,某些情况并非总能被考虑到。(漏洞 #36421710) 参考:此问题是漏洞 #36921175 的回归:。
设置 max_join_size(https://dev.mysql.com/doc/refman/9.4/en/server-system-variables.html#sysvar_max_join_size)导致某些嵌套查询处理不当。(漏洞 #35625769)
当子查询位于 SELECT(https://dev.mysql.com/doc/refman/9.4/en/select.html)列表中且包含该查询被隐式分组时,将标量子查询转换为与派生表的连接本应被允许,但当subquery_to_derived(https://dev.mysql.com/doc/refman/9.4/en/switchable-optimizations.html#optflag_subquery-to-derived)优化器开关启用时,该转换会被拒绝。(漏洞 #35150438)
当 explain_json_format_version(https://dev.mysql.com/doc/refman/9.4/en/server-system-variables.html#sysvar_explain_json_format_version)等于 1 时,EXPLAIN ANALYZE FORMAT=JSON(https://dev.mysql.com/doc/refman/9.4/en/explain.html#explain-analyze)无法正确处理包含子查询的查询。 感谢 Peiyuan Liu 及腾讯团队的贡献。(漏洞 #117995、漏洞 #37285902)
可以对 SET TRANSACTION ISOLATION LEVEL(https://dev.mysql.com/doc/refman/9.4/en/set-transaction.html)使用PERSIST 或 PERSIST_ONLY,尽管这是不允许的,且会在服务器重启时导致错误。现在尝试这样做会导致语句被拒绝,并返回错误 ER_GRP_RPL_UNSUPPORTED_TRANS_ISOLATION(https://dev.mysql.com/doc/mysql-errors/9.4/en/server-error-reference.html#error_er_grp_rpl_unsupported_trans_isolation)。(漏洞 #115619、漏洞 #36854635)
当服务器以 autocommit=OFF(https://dev.mysql.com/doc/refman/9.4/en/server-system-variables.html#sysvar_autocommit)运行时,查询重写插件(参见《重写器查询重写插件》(https://dev.mysql.com/doc/refman/9.4/en/rewriter-query-rewrite-plugin.html))无法正常工作。(漏洞 #115437、漏洞 #36784795)
MIN()(https://dev.mysql.com/doc/refman/9.4/en/aggregate-functions.html#function_min)作为窗口函数使用时,未按预期忽略空值。(漏洞 #113631、漏洞 #36182490) - 在使用 RANGE 帧单位的窗口函数规范中,此前允许在 ORDER BY 表达式中使用 RAND() 函数(https://dev.mysql.com/doc/refman/9.4/en/mathematical-functions.html#function_rand)。这违反了 RANGE 帧规范的基本要求,即帧内值必须保持单调递增或递减。为解决此问题,现在禁止在 RANGE 帧单位下使用非确定性的 ORDER BY 表达式,此类查询将直接返回错误。 此外,该修复还解决了一个相关问题:当计算 BETWEEN CURRENT ROW AND after_value FOLLOWING 帧边界时,如果被比较的行值为无符号类型且可能小于 after_value,会导致下溢(underflow)并产生错误结果。现在遇到这种情况时,系统会直接拒绝执行并返回错误。 有关窗口函数帧规范的详细信息,请参见:https://dev.mysql.com/doc/refman/9.4/en/window-functions-frames.html。

以上内容是 MySQL 9.4 版本的主要内容,详情请访问 MySQL 官网。


MySQL 9.5 创新版于2025年10月下旬正式发行。该版本在账号管理、性能优化、安全性、功能扩展等多个核心领域都有重要更新,其核心是提升管理灵活性、运行性能与安全合规性。

一、账号与权限管理增强
新增强制角色激活功能,通过activate_mandatory_roles选项控制强制角色的激活逻辑。当activate_all_roles_on_login关闭,且该选项开启时,账号会自动激活强制角色与默认角色,默认情况下该选项处于启用状态。

连接控制组件新增配置项,通过component_connection_control.exempt_unknown_users系统变量,可设置是否对无用户凭证的失败连接,豁免延迟惩罚,同时新增状态变量Component_connection_control_exempted_unknown_users用于统计豁免连接数,兼顾安全与负载均衡场景需求。

二、性能优化与配置调整
二进制日志优化
binlog_transaction_dependency_history_size系统变量默认值从 25000 提升至 1000000,最大值从 1000000 增至 10000000,优化大事务场景下的依赖管理。

InnoDB 优化
innodb_log_writer_threads默认值根据二进制日志启用状态和 CPU 数量动态调整,例如,二进制日志关闭且逻辑 CPU≤4 时默认关闭该功能;innodb_change_buffering默认值改为ALL,提升二级索引更新效率。

线程池自动配置
线程池插件可根据服务器硬件(VCPU 数量)自动设置thread_pool_size等 5 个核心变量的最优默认值,还能验证并修正错误配置,减少人工调优成本。

三、安全性提升
认证安全增强
caching_sha2_password_digest_rounds默认值提升至 10000,加强密码哈希安全性;SCRAM-SHA-1认证方式 deprecated,默认认证方式改为SCRAM-SHA-256,同时更新对应系统变量默认值。

复制安全默认启用
所有复制连接默认开启加密,SOURCE_SSL默认值设为 1,group_replication_ssl_mode默认改为REQUIRED,group_replication_recovery_use_ssl默认开启,降低数据传输风险。

密钥管理升级
component_keyring_kmip和keyring_okv支持 Oracle Key Vault 21.10 + 的SECRET密钥类型;keyring_okv插件 deprecated,由keyring_kmip组件替代,兼容更多 KMIP 1.1 协议的密钥管理产品。

四、功能扩展与兼容性改进
JavaScript 支持升级
JavaScript 存储过程的 SQL 调用结果集大小限制提升,支持更大数据量;MLE 组件遵循 ECMAScript 2025 规范,同时支持处理含冗余 / 相对目录的文件路径,mle.memory_max变量可根据物理内存自动配置(5% 占比,0.4GB-32GB 范围)。

JSON 功能优化
修复大精度浮点数 JSON 解析校验错误、TIME 值转 JSON 缩小问题;JSON Duality Views 完善 DML 操作逻辑,禁止删除嵌套子对象的单例子项,修复含子查询 WHERE 条件创建视图时的断言失败问题。

新增诊断工具
引入 MySQL Diagnostic Monitor(mysqldm)客户端工具,可预设查询收集服务器诊断信息并以 JSON 格式存储,支持自定义输出目录、迭代次数和间隔,便于问题排查。

五、其他重要更新
系统变量与插件调整
移除group_replication_allow_local_lower_version_join、replica_parallel_type等 deprecated 变量,以及semisync_master、semisync_slave插件,由新插件替代;explain_format默认值从TRADITIONAL改为TREE,优化执行计划展示。

编译与打包优化
Solaris 平台支持 Clang 和 GCC 编译,默认使用 OpenSSL 3;升级 bundled 的 googletest、libbacktrace 库版本,CMake 最低要求版本提升至 3.17.5,同时支持选择 bundled 或系统 libzip 库编译。

sys Schema 增强
revoke_schema_privileges_from_all_accounts_except()存储过程默认安装,可批量撤销某 schema 权限(排除指定账号),简化权限管理操作。

这里总结了一份 MySQL v9.5.0 新特征分类对照表,表格会清晰列出特征类别、关键变更及影响,方便大家快速查阅和对比旧版本差异。

v9.5.0 新特征分类对照表
特征类别关键变更内容影响与价值
账号与权限管理1. 新增activate_mandatory_roles选项,支持强制角色激活 2. 新增component_connection_control.exempt_unknown_users变量,豁免未知用户连接延迟惩罚 3. 新增Component_connection_control_exempted_unknown_users状态变量1. 精细化控制角色激活逻辑,提升权限管理安全性 2. 避免负载均衡合法连接被误判,保障服务器可用性
性能优化1. binlog_transaction_dependency_history_size默认值从 25000→1000000,最大值从 1000000→100000002. innodb_log_writer_threads按log_bin状态和 CPU 数动态调整默认值 3. 线程池自动根据 VCPU 数配置thread_pool_size等 5 个变量1. 优化大事务二进制日志依赖管理 2. 适配不同硬件与日志配置,提升 InnoDB 写入性能 3. 减少人工调优成本,适配硬件资源
安全性提升1. caching_sha2_password_digest_rounds默认值→100002. 复制连接默认加密,SOURCE_SSL默认 = 1,group_replication_ssl_mode默认 = REQUIRED3. keyring_okv插件 deprecated,由keyring_kmip替代1. 增强密码哈希安全性 2. 降低复制数据传输风险,默认符合安全合规要求 3. 兼容更多 KMIP 1.1 协议密钥管理产品
功能扩展1. JavaScript 存储过程支持更大结果集,MLE 组件遵循 ECMAScript 20252. 新增 mysqldm 诊断工具,支持 JSON 格式导出诊断信息 3. JSON Duality Views 禁止删除嵌套子对象单例子项,修复子查询创建视图问题1. 提升 JavaScript 业务处理能力,兼容最新语言规范 2. 简化故障排查,便于向 Oracle Support 提交诊断数据 3. 完善 JSON 视图功能稳定性,避免数据操作异常
系统变量与插件1. 移除group_replication_allow_local_lower_version_join等 2 个变量,移除semisync_master等 2 个插件 2. explain_format默认值从 TRADITIONAL→TREE3. innodb_change_buffering默认值从 DEFAULT→ALL1. 清理过时功能,减少版本兼容性负担 2. 优化执行计划展示,更易理解查询逻辑 3. 提升二级索引更新效率
编译与打包1. Solaris 支持 Clang/GCC 编译,默认用 OpenSSL 32. 升级 googletest 至 1.17、libbacktrace 至 2025 年 4 月版 3. CMake 最低要求 3.17.5,支持选择 bundled / 系统 libzip1. 适配 Solaris 平台新编译环境,提升安全性 2. 修复旧库潜在问题,提升编译稳定性 3. 增强编译灵活性,适配不同系统库环境
sys Schema1. revoke_schema_privileges_from_all_accounts_except()存储过程默认安装 2. 修复sys.ps_trace_thread存储过程错误处理问题1. 批量撤销 schema 权限(排除指定账号),简化权限管理 2. 提升存储过程稳定性,减少执行异常
认证与密钥管理1. SCRAM-SHA-1认证方式 deprecated,authentication_ldap_sasl_auth_method_name默认→SCRAM-SHA-2562. component_keyring_kmip支持 Oracle Key Vault 21.10 + 的 SECRET 密钥类型1. 升级 LDAP 认证安全等级,符合现代加密标准 2. 扩展密钥类型支持,适配更高版本密钥管理系统