MySQL 9.4 创新版正式发行 GA
MySQL 9.4.0 版正式发行,让我们快速浏览一下都有哪些内容。
字符集支持
- 重要变更:IFNULL() (https://dev.mysql.com/doc/refman/9.4/en/flow-control-functions.html#function_ifnull)在 LIKE (https://dev.mysql.com/doc/refman/9.4/en/string-comparison-functions.html#operator_like)子句中使用时,会触发 ER_CANT_AGGREGATE_2COLLATIONS 错误 (https://dev.mysql.com/doc/mysql-errors/9.4/en/server-error-reference.html#error_er_cant_aggregate_2collations)。 这是因为 IFNULL() 返回二进制排序规则且排序规则派生类型为 NONE,但在此场景下不允许使用 NONE,从而导致错误。 我们通过对语义稍作调整来解决此问题:将排序规则派生类型 NONE 的优先级降低,使其低于其他任何排序规则派生类型的优先级。这意味着,当使用派生类型为 NONE 的表达式时,LIKE 会根据另一个操作数来确定要使用的比较排序规则。这对现有功能的影响应该极小,且我们现有的测试套件无需任何修改。 我们还修改了排序规则聚合逻辑,在确定结果排序规则时,仅考虑具有相同(且最高)优先级的排序规则。此外,我们将之前的 IGNORABLE 派生类型重命名为 NULL,因为它仅用于空值,且由于 NONE 现在的优先级更低,它不再是“可忽略的”。 另外,我们在原 NONE 优先级的值之间留下了一个间隔,以尽量减少 COERCIBILITY() (https://dev.mysql.com/doc/refman/9.4/en/information-functions.html#function_coercibility)调用返回与先前实现不兼容的值的情况。 有关更多信息,请参见《表达式中的排序规则可 coercibility》 (https://dev.mysql.com/doc/refman/9.4/en/charset-collation-coercibility.html)。(漏洞 #37285902)
- CREATE TABLE (https://dev.mysql.com/doc/refman/9.4/en/create-table-check-constraints.html)若包含生成列表达式(如 CHECK 约束),且该表达式引用了非 ASCII 标识符,如果当前客户端字符集与 UTF-8 不兼容时(例如 GBK),会导致语法错误。(漏洞 #30453221)
编译说明
- 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
(https://dev.mysql.com/doc/refman/9.4/en/uninstall-component.html)会被拒绝并返回错误)。若在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
(https://dev.mysql.com/doc/refman/9.4/en/server-system-variables.html#sysvar_back_log)的默认值已增加到10000。有关为使MySQL服务器能够抵御连接突发而必须设置的Linux配置参数,请参见back_log
(https://dev.mysql.com/doc/refman/9.4/en/server-system-variables.html#sysvar_back_log)。(任务 #16888) - 现在可以通过系统变量
server_memory
(https://dev.mysql.com/doc/refman/9.4/en/server-system-variables.html#sysvar_server_memory)限制MySQL服务器在确定配置变量默认值时使用的最大物理内存量。(任务 #16938)
弃用与移除说明
- 作为从MySQL插件向MySQL组件过渡的持续工作的一部分,用于编写MySQL插件的API现已被弃用,并计划在未来的MySQL版本中移除。此变更会产生以下影响: - MySQL服务器的
--early-plugin-load
(https://dev.mysql.com/doc/refman/9.4/en/server-options.html#option_mysqld_early-plugin-load)选项已被弃用。使用该选项启动服务器会触发弃用警告。 - 每当加载密钥环插件时,都会发出弃用警告。有关密钥环组件与密钥环插件的区别概述,请参见《密钥环组件与密钥环插件》(https://dev.mysql.com/doc/refman/9.4/en/keyring-component-plugin-comparison.html)。另请参见《使用迁移服务器进行密钥迁移》(https://dev.mysql.com/doc/refman/9.4/en/keyring-key-migration.html#keyring-key-migration-using-migration-server),了解从密钥环插件迁移到密钥环组件的相关信息。(任务 #16574)
- 在8.0.26版本中被弃用的系统变量
temptable_use_mmap
,在本版本中已被移除。(任务 #16745) - 本版本中,SQL函数MD5()
(https://dev.mysql.com/doc/refman/9.4/en/encryption-functions.html#function_md5)和SHA1()
(https://dev.mysql.com/doc/refman/9.4/en/encryption-functions.html#function_sha1)已被弃用,并计划在未来版本中移除。(任务 #16955)
InnoDB 说明
- 改进了内存管理,以防止在某些错误处理场景中可能出现的内存泄漏。(漏洞 #37826893)
- 在特定条件下(例如表和索引从缓存中被逐出时),
information_schema.innodb_cmp_per_index
(https://dev.mysql.com/doc/refman/9.4/en/information-schema-innodb-cmp-per-index-table.html)表有时会返回未知的数据库名和表名。(漏洞 #37820227) - 修复了与导入表相关的问题。(漏洞 #37621360) -
innodb_change_buffer_max_size
(https://dev.mysql.com/doc/refman/9.4/en/innodb-parameters.html#sysvar_innodb_change_buffer_max_size)的默认值已更改为5。此更新旨在平衡变更缓冲对IO密集型工作负载的益处,以及当缓冲池的较大部分用于变更缓冲时,对内存工作负载可能产生的负面影响。(任务 #16968)
安装说明
- macOS:当启动
mysqld
时未指定--plugin-dir
(https://dev.mysql.com/doc/refman/9.4/en/server-system-variables.html#sysvar_plugin_dir),但指定了--basedir
(https://dev.mysql.com/doc/refman/9.4/en/server-system-variables.html#sysvar_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
(https://dev.mysql.com/doc/refman/9.4/en/call.html)会被拒绝并返回内存不足错误。(漏洞 #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
(https://dev.mysql.com/doc/refman/9.4/en/mysqldump.html#option_mysqldump_routines)在与早期版本的服务器配合使用时无法正常工作,因为它找不到INFORMATION_SCHEMA.LIBRARIES
(https://dev.mysql.com/doc/refman/9.4/en/information-schema-libraries-table.html)表。现在,在这种情况下,mysqldump
会跳过该表,不会尝试导出它。(漏洞 #37498680) - 现在支持在JavaScript存储例程中使用MySQL的
BIT
(https://dev.mysql.com/doc/refman/9.4/en/bit-type.html)类型。有关类型转换规则和其他信息,请参见《JavaScript存储程序的数据类型和参数处理》(https://dev.mysql.com/doc/refman/9.4/en/srjs-data-arguments.html)。(任务 #16885)
性能模式说明
- 内部函数
pfs_get_thread_statement_locker_vc()
包含调试代码,这些代码意外地被包含在了发布版本中。(漏洞 #37743667)
向量数据类型
VECTOR_TO_STRING()
(https://dev.mysql.com/doc/refman/9.4/en/vector-functions.html#function_vector-to-string)函数未能正确设置其输出的排序规则。(漏洞 #37815490)
新增或更改的功能
- 重要变更:新增了mysql客户端的
--commands
(https://dev.mysql.com/doc/refman/9.4/en/mysql-command-options.html#option_mysql_commands)选项,该选项用于启用或禁用大多数mysql客户端命令。 此选项默认处于禁用状态。要启用它,可以使用--commands
或--commands=ON
(https://dev.mysql.com/doc/refman/9.4/en/mysql-command-options.html#option_mysql_commands)启动客户端。有关受此选项影响的所有命令的完整列表以及其他信息,请参见《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。(Bug#111510, Bug #35521787)
以上内容是MySQL 9.4版本的主要内容,详情请访问MySQL官网。
稿源:https://mp.weixin.qq.com/s/BwL6J_RFHnuo7im2dQgB2g
为您推荐相关文章:
同类文章推荐: